Ubuntu下提升PHP-FPM性能的实践指南
进程管理是php-fpm性能的核心,需根据应用负载选择模式:
pm.max_children直接指定固定进程数(如pm = static; pm.max_children = 50),避免频繁创建/销毁进程的开销。pm.start_servers(启动时进程数)、pm.min_spare_servers(最小空闲进程数)、pm.max_spare_servers(最大空闲进程数)动态调整(如pm = dynamic; pm.start_servers = 10; pm.min_spare_servers = 5; pm.max_spare_servers = 20),平衡资源占用与响应速度。pm = ondemand; pm.max_children = 20)。同时,设置pm.max_requests = 500(每个子进程处理500个请求后重启),防止内存泄漏导致进程膨胀。
OPcache是PHP性能提升的关键组件,可缓存编译后的脚本,避免重复解析:
sudo apt install php-opcache(Ubuntu默认包含在php-fpm包中)。php.ini(路径如/etc/php/8.1/fpm/php.ini),启用并配置:zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存内存大小(MB),根据服务器内存调整
opcache.max_accelerated_files=4000 # 缓存文件数量,建议设置为脚本总数的1.5倍
opcache.revalidate_freq=60 # 文件修改后重新验证的时间间隔(秒)
opcache.fast_shutdown=1 # 加速脚本关闭流程
opcache.jit=1 # 启用JIT(Just-In-Time)编译,进一步提升性能
opcache.jit_buffer_size=64M # JIT缓冲区大小
验证OPcache是否生效:创建info.php文件,访问/info.php?start_opcache=1,查看“opcache”部分是否显示“enabled”。/etc/php/{version}/fpm/php.ini中的memory_limit(如memory_limit = 256M),根据应用需求调整(避免单个脚本占用过多内存导致进程崩溃)。request_terminate_timeout(如request_terminate_timeout = 30s),防止长时间运行的脚本(如死循环)占用进程资源。www.conf(路径如/etc/php/8.1/fpm/pool.d/www.conf):slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 10s # 执行时间超过10秒的请求记录到慢日志
重启php-fpm后,通过tail -f /var/log/php-fpm/www-slow.log查看慢请求详情。sudo ulimit -n 65535 # 临时生效
永久生效需修改/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf,优化网络和内存性能:net.core.somaxconn = 65535 # 监听队列长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度
vm.swappiness = 10 # 减少内存交换(值越低,越倾向于使用物理内存)
应用配置:sudo sysctl -p。php-fpm的监听方式影响网络性能,优先选择Unix Socket(本地通信更快):
listen = /run/php/php8.1-fpm.sock # Unix Socket路径
listen.owner = www-data
listen.group = www-data
若需通过网络访问(如多服务器部署),则使用TCP Socket:
listen = 127.0.0.1:9000 # 绑定本地IP和端口
注意:使用Unix Socket时,需确保web服务器(如Nginx)有权限访问该socket文件(权限设置为www-data:www-data)。
htop(查看CPU/内存使用率)、vmstat 1(查看系统负载)、ss -lntp | grep php-fpm(查看php-fpm进程和连接数)等工具监控性能。error.log(路径如/var/log/php-fpm/error.log)和慢日志,定位错误和性能瓶颈。ab(Apache Benchmark)或wrk模拟高并发请求,评估优化效果(如ab -n 1000 -c 100 http://localhost/test.php)。pm.max_children(如内存占用过高则减少,CPU利用率低则增加)、pm.start_servers等参数,适应业务增长。mysqlnd_ms)减少连接开销。