LNMP 性能优化综合指南
本文旨在提供一套全面的 LNMP(Linux + Nginx + MySQL + PHP)环境性能优化方案,涵盖应用层、服务配置与系统内核等多个层面。请注意,优化应追求稳定、安全与性能的平衡,而非单纯追求极致性能指标。
一、PHP 应用层优化
- 代码性能分析:使用 XHProf、Xdebug 或 Blackfire 等工具分析代码执行瓶颈,重点优化频繁执行的代码路径。
- 减少系统调用:避免在循环中频繁调用
is_file()、time()等函数。使用require/include替代require_once/include_once(若确保不会重复加载)。 - 使用缓存:
- 使用 Memcached 或 Redis 缓存系统配置、模块数据及用户会话数据。
- 开启 MySQL 慢查询日志,分析并优化执行效率低的 SQL 语句。
- OPcache 配置:启用并正确配置 PHP 的 OPcache(替代已过时的 APC),设置
opcache.revalidate_freq=0或opcache.validate_timestamps=0(生产环境)以减少文件系统检查。 - 精简 PHP 模块:重新编译 PHP 或通过包管理工具,仅启用必要的扩展模块(如禁用 gd、soap、xmlrpc 等未用模块)。
- 优化 php.ini 配置:
- 在
php.ini中统一设置时区(date.timezone)、内存限制等,避免在代码中使用ini_set()。 - 生产环境关闭
display_errors,开启log_errors。
- 在
二、PHP-FPM 配置优化
- 进程管理:根据服务器内存和负载,合理设置
pm.max_children。可通过监控工具(如 top、htop)观察内存使用情况来调整。 - 使用 Unix Socket:将 PHP-FPM 监听方式配置为 Unix Socket(
listen = /var/run/php/php-fpm.sock),相比 TCP 减少网络开销。 - 资源限制:确保
rlimit_files与系统文件描述符限制一致。
三、Nginx 配置优化
- 工作进程:
worker_processes通常设置为 CPU 核心数。对于 I/O 密集型场景,可适当增加。 - 连接处理:使用
epoll(Linux)或kqueue(FreeBSD)事件驱动模型。 - Keep-alive:启用并设置合理的
keepalive_timeout(如 65 秒),复用 TCP 连接。 - Gzip 压缩:启用
gzip,并设置gzip_min_length 1024以避免压缩过小文件。 - 日志优化:生产环境可考虑关闭
access_log或将其写入内存文件系统。如需保留,应使用日志轮替。 - 静态文件处理:
- 启用
sendfile。 - 为静态资源设置
expires头,利用浏览器缓存。
- 启用
- 文件描述符:设置
worker_rlimit_nofile和worker_connections与系统限制匹配。
四、系统与内核优化
- 关闭非必要服务:使用
systemctl禁用不需要的系统服务(如 sendmail、bluetooth 等)。 - 调整文件描述符限制:在
/etc/security/limits.conf中为 nginx 和 php-fpm 用户增加限制:* soft nofile 65535 * hard nofile 65535 - 磁盘挂载选项:在
/etc/fstab中添加noatime选项,减少访问时间更新开销。 - 本地 DNS 解析:将频繁访问的域名/IP 对应关系添加到
/etc/hosts,减少 DNS 查询延迟。 - 内核网络参数优化:在
/etc/sysctl.conf中添加或修改以下参数,然后执行sysctl -p生效:net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_tw_reuse = 1 # 注意:net.ipv4.tcp_tw_recycle 在 NAT 环境下可能导致问题,建议禁用 # net.ipv4.tcp_tw_recycle = 0 net.ipv4.ip_local_port_range = 1024 65535
五、安全与监控注意事项
- 防火墙:不应完全关闭防火墙(iptables/firewalld),而应配置最小必要规则。
- SELinux:生产环境建议保持为
enforcing模式,通过审计日志调整策略,而非直接禁用。 - 性能监控:优化前后应使用工具(如 ab、wrk、siege)进行压力测试,并使用监控系统(如 Prometheus + Grafana)持续观察关键指标(TPS、响应时间、资源利用率)。
总结:性能优化是一个系统性工程,需要从应用代码、服务配置、操作系统到硬件等多个层面进行综合调整。优化后应进行充分测试,确保系统稳定性和业务功能正常。