LNMP环境下Ubuntu如何优化性能
小樊
42
2025-12-26 01:47:52
LNMP环境下Ubuntu性能优化实操指南
一 基础与连接优化
- 保持组件为最新稳定版(Nginx、MySQL/MariaDB、PHP),及时获取性能修复与新特性。
- 启用HTTP/2或HTTP/3(QUIC),在 Nginx 中开启 TLS 并优先使用 ECDHE 系列曲线,减少握手开销。
- 开启Gzip/Brotli压缩,压缩文本类资源(HTML/CSS/JS/JSON),降低传输体积。
- 配置静态资源长缓存(Cache-Control/Expires),搭配CDN分发图片、视频、下载包与静态资源,减轻源站压力。
- 打开HTTPS(如 Let’s Encrypt),并合理设置TLS 会话复用/会话票据与 OCSP Stapling,减少握手延迟。
- 调整 Nginx 并发模型:设置worker_processes auto(通常等于 CPU 核心数),worker_connections结合业务并发与文件描述符限制进行调优。
- 提升系统文件描述符限制(nofile),例如在**/etc/security/limits.conf**中设置 soft/hard 值,并在需要时配置 systemd 服务 LimitNOFILE,避免“Too many open files”。
二 Nginx与PHP-FPM调优
- 进程模型与连接:Nginx 使用epoll/kqueue事件驱动;PHP-FPM 采用动态(dynamic)或按需(ondemand)进程管理,结合内存与并发目标设置pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers / pm.max_requests,避免进程过多导致内存抖动或过少导致排队。
- 通信方式:优先使用Unix Domain Socket(如 unix:/var/run/php/php8.1-fpm.sock),减少 TCP 开销;确保 Nginx 与 PHP-FPM 运行用户与权限一致。
- 静态资源与缓存:为图片、字体、CSS/JS 设置强缓存与协商缓存(ETag/Last-Modified);对可缓存的动态内容启用Nginx FastCGI 缓存(proxy_cache_path/fastcgi_cache_path),设置keys_zone、levels、max_size、inactive、use_temp_path=off与缓存有效期策略。
- 压缩与头部:开启gzip;按需启用Brotli(需额外模块);减少不必要的响应头与 Cookie 体积。
- 超时与缓冲:合理设置fastcgi_read_timeout / fastcgi_send_timeout,避免长请求被过早中断;根据业务调整client_max_body_size与各类buffer大小。
- 典型示例(/etc/nginx/nginx.conf 片段,按需调整):
- fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fcgi:10m max_size=1g inactive=60m use_temp_path=off;
- gzip on; gzip_vary on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml+rss;
- server { location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control “public, no-transform”; } }
以上要点涵盖 Nginx 并发、缓存、压缩与 PHP-FPM 进程管理的关键实践。
三 MySQL或MariaDB调优
- 缓冲与内存:将innodb_buffer_pool_size设为物理内存的50%–70%(上限一般不超过32GB),这是提升 InnoDB 性能的首要参数;MyISAM 场景再考虑key_buffer_size。
- 连接与会话:根据并发与内存设置max_connections,避免过大导致内存占用激增;合理设置thread_cache_size减少线程创建销毁开销。
- 日志与持久化:权衡性能与持久性,必要时将innodb_flush_log_at_trx_commit设为2(在崩溃时可能丢失最近 1 秒事务);根据负载调整innodb_log_file_size与sync_binlog。
- 查询与索引:避免SELECT ,为高频查询条件与排序/分组字段建立复合索引;使用EXPLAIN*分析执行计划,定位全表扫描与临时表。
- 慢查询与维护:开启slow_query_log,设置long_query_time=1–2s,定期用pt-query-digest或MySQLTuner分析并优化;对大表执行ANALYZE/OPTIMIZE TABLE与必要时的分区/分表。
- 缓存策略:MySQL 8.0 已移除查询缓存(query cache),建议以Redis/Memcached等外部缓存替代。
- 典型示例(/etc/mysql/mysql.conf.d/mysqld.cnf 片段,按需调整):
- innodb_buffer_pool_size=4G
- innodb_flush_log_at_trx_commit=2
- slow_query_log=1
- slow_query_log_file=/var/log/mysql/slow-query.log
- long_query_time=2
以上为数据库层面的核心调优项与维护方法。
四 应用层与缓存架构
- 对象缓存:引入Redis/Memcached缓存热点数据、会话与配置字典,降低数据库 QPS;在 PHP 框架中合理使用缓存标签/前缀与TTL。
- 页面与数据缓存:对不常变的页面启用Nginx FastCGI 页面级缓存;对接口与复杂查询使用应用层缓存(如整页、片段、查询结果)。
- 内容优化:对图片进行压缩与适当格式转换(如 WebP),对CSS/JS进行合并、最小化与异步/延迟加载;减少阻塞渲染资源。
- 会话存储:将会话存入Redis,便于多实例扩展与共享登录态。
- 典型示例(Nginx 动态内容缓存):
- fastcgi_cache_key “$scheme$request_method$host$request_uri”;
- fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 404 1m;
- add_header X-Cache $upstream_cache_status;
以上措施可显著降低后端负载并缩短首屏时间。
五 监控、压测与容量规划
- 监控与告警:部署Prometheus + Grafana监控CPU、内存、连接数、QPS、慢查询、缓存命中率等;Nginx 开启stub_status,PHP-FPM 开启status,MySQL 启用性能/状态变量采集。
- 日志与诊断:定期分析Nginx access/error 日志与PHP-FPM 日志,关注502/504/慢请求;使用EXPLAIN与慢查询日志定位 SQL 瓶颈。
- 压测与容量:使用ab/wrk/hey或k6进行渐进式压测,验证RPS、P95/P99 延迟、错误率与缓存命中率;结合监控数据逐步调大worker_connections、pm.max_children、innodb_buffer_pool_size等关键参数。
- 工具与基线:利用MySQLTuner/Percona Toolkit获取配置与 SQL 优化建议,形成基线指标与滚动优化机制。
- 安全与合规:在优化同时完成防火墙(UFW)、最小权限、TLS与安全更新等基础安全配置,避免性能与安全顾此失彼。
以上实践可形成“监控—压测—调优—复盘”的闭环,确保性能稳定可持续。