LNMP性能调优方法总览
从Nginx、PHP-FPM、MySQL/MariaDB、Linux内核与网络、缓存与CDN、监控与压测六个层面入手,按“先测量、后调参、再验证”的闭环方法进行优化,可显著提升吞吐与稳定性。
Nginx 调优
- 进程与连接
- 设置worker_processes auto(或匹配CPU核心数),开启worker_cpu_affinity auto;提升worker_rlimit_nofile 65535;在 events 中设置worker_connections(如 16384/更高,视内存与FD而定)。
- 传输与协议
- 启用sendfile on,按需开启tcp_nopush on;启用gzip on并限定gzip_types(文本、脚本、样式等),压缩级别建议4–6;开启HTTP/2与OCSP Stapling提升HTTPS性能。
- 连接复用与超时
- 开启长连接:keepalive_timeout 65,keepalive_requests 100000;按需调整client_body_timeout / client_header_timeout / send_timeout;关闭server_tokens减少信息暴露。
- 静态资源与缓存
- 为图片、CSS、JS设置expires(如 30–365 天)与Cache-Control: public;启用open_file_cache缓存频繁访问的文件元数据。
- 高并发关键项
- 调大监听队列:在listen … backlog=1024(或更高);系统层面提升net.core.somaxconn(如 65535)。
- 提升单 worker 连接上限:max-worker-connections(如 65536);开启tcp_nodelay。
- 复用短连接:开启net.ipv4.tcp_tw_reuse=1;扩大net.ipv4.ip_local_port_range=“1024 65535”。
PHP 与 PHP-FPM 调优
- OPcache 必开
- 启用并合理设置:opcache.enable=1、opcache.memory_consumption=128–256M、opcache.interned_strings_buffer=16、opcache.max_accelerated_files=20000、opcache.validate_timestamps=1(开发)/适度提高revalidate_freq(生产)、opcache.fast_shutdown=1;PHP 8.0+ 建议开启JIT(如opcache.jit=1、opcache.jit_buffer_size=128M)。
- 进程模型与资源
- 采用pm=dynamic,结合内存与QPS设置pm.max_children / pm.start_servers / pm.min_spare_servers / pm.max_spare_servers;设置pm.max_requests(如 1000)定期回收进程,避免内存泄漏累积。
- 请求与日志
- 开启request_slowlog_timeout=1s与slowlog,定位耗时脚本;设置rlimit_files=65535;生产环境关闭错误直接输出,写入error_log。
- 语言与扩展
- 仅启用必要扩展;使用Redis/Memcached扩展做数据缓存;优化会话存储(如 Redis);减少不必要的文件I/O与循环计算。
MySQL/MariaDB 调优
- 内存与I/O
- 将innodb_buffer_pool_size设为物理内存的50%–80%;适度调整innodb_log_file_size与innodb_log_files_in_group以提升写入吞吐。
- 连接与会话
- 合理设置max_connections,避免过高导致上下文切换与内存压力;结合应用连接池与超时配置。
- 索引与查询
- 使用EXPLAIN分析执行计划;避免*SELECT ,减少全表扫描;为高频WHERE/JOIN/ORDER BY列建立合适索引(含复合索引);避免在WHERE中对列使用函数导致索引失效;优化JOIN与子查询。
- 缓存与机制
- 注意:MySQL 8.0+ 已移除查询缓存,如需缓存建议引入Redis/Memcached;定期审查慢查询日志并持续优化。
- 架构扩展
- 读写分离(主从复制)、分库分表/分区,缓解单库单表瓶颈。
Linux 内核与网络调优
- 文件句柄与资源
- 提升ulimit -n 65535与fs.file-max(如 1048576);为 Nginx/PHP-FPM 服务设置合适的rlimit_nofile。
- 连接与端口
- 提升net.core.somaxconn(如 65535);扩大net.ipv4.ip_local_port_range=“1024 65535”;开启net.ipv4.tcp_tw_reuse=1;按需调整net.ipv4.tcp_fin_timeout=30、net.core.netdev_max_backlog=65535。
- 其他网络参数
- 视环境启用net.ipv4.tcp_fastopen=3、net.ipv4.tcp_syncookies=1;如运行在容器/有状态NAT环境,关注net.nf_conntrack_max与内核网络参数边界。
缓存、CDN 与监控压测
- 缓存与加速
- 引入Redis/Memcached做页面/数据/会话缓存;为静态资源设置长期Cache-Control/expires并接入CDN;Nginx 侧可启用proxy_cache缓存反向代理结果。
- 监控与告警
- 使用Prometheus + Grafana监控CPU/内存/磁盘IO/网络/连接数/QPS/延迟;数据库建议用PMM或企业监控;建立慢查询、慢请求、502/504 等告警。
- 日志与诊断
- 为 Nginx 配置慢请求日志(如**$request_time > 1s单独记录),为 PHP-FPM 开启慢脚本日志**;定期分析error.log与慢日志定位瓶颈。
- 压测与回归
- 使用wrk、ab等工具进行基线压测与回归压测;每次调参只变更少量项并对比P95/P99延迟、吞吐、错误率;上线前进行容量评估与限流/熔断策略验证。