增加 pm.max_children
的值
- 当前值为
50
,如果并发请求较多,可能会耗尽子进程资源,导致 502。 - 增加到 100 或更高(根据服务器内存和负载能力调整)。
2. 调整 request_terminate_timeout
- 当前为
100 秒
,适合大多数脚本。如果你的应用程序中某些脚本执行时间较长,可以进一步增加到300
或更高。
3. 增加 listen.backlog
- 当前值为
8192
,通常已经足够高。如果并发流量特别大,可以再增加,例如16384
。
4. 检查 pm
模式
- 你的
pm
模式为dynamic
,适合多数情况。如果流量非常稳定,且波动不大,可以尝试改为static
模式,设置一个固定数量的子进程(例如pm.max_children = 100
)。
5. 检查 listen
的权限
- 当前
listen.mode = 0666
,确保 Nginx 有权限访问/tmp/php-cgi-74.sock
。 - 如果有权限问题,修改为以下内容:
listen.owner = www listen.group = www listen.mode = 0660
6. 优化日志配置
- 检查
slowlog
是否有效,确保记录慢请求的日志,便于后续排查:request_slowlog_timeout = 10 slowlog = /www/server/php/74/var/log/slow.log
7. 增加 rlimit_files
和 rlimit_core
- 允许更多文件描述符:
rlimit_files = 65535 rlimit_core = 0
优化后的配置示例
[global]
pid = /www/server/php/74/var/run/php-fpm.pid
error_log = /www/server/php/74/var/log/php-fpm.log
log_level = notice[www]
listen = /tmp/php-cgi-74.sock
listen.backlog = 16384
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0660
user = www
group = wwwpm = dynamic
pm.max_children = 100 ; 增加最大子进程数量
pm.start_servers = 10 ; 启动时的进程数
pm.min_spare_servers = 10 ; 保持的最小空闲进程数
pm.max_spare_servers = 30 ; 保持的最大空闲进程数pm.status_path = /phpfpm_74_statusrequest_terminate_timeout = 300
request_slowlog_timeout = 10
slowlog = /www/server/php/74/var/log/slow.logrlimit_files = 65535
rlimit_core = 0
检查和排查步骤
1. 重启 PHP-FPM 和 Nginx
每次修改配置后重启服务:
service php-fpm-74 restart service nginx restart
2. 检查日志
- PHP-FPM 错误日志:
tail -f /www/server/php/74/var/log/php-fpm.log
- Nginx 错误日志:
tail -f /var/log/nginx/error.log
- 慢请求日志: 如果启用了
slowlog
,分析慢请求的脚本,优化这些脚本。
3. 测试并发
使用工具如 ab
或 wrk
模拟并发请求,测试是否可以正常响应:
ab -n 1000 -c 50 http://your-domain.com/
4. 系统资源监控
监控服务器的内存、CPU 和磁盘 I/O 使用情况,确认是否资源耗尽:
htop free -h