nginx与php-fpm的502 bad gateway错误及解决方案
本文针对Ubuntu 16.04.2系统上出现的Nginx 502 Bad gateway错误进行分析和解决,该错误源于nginx与php-FPM(版本:php-fpm/5.6)的交互问题。
错误现象:
Nginx错误日志显示请求失败,提示来自上游的头部信息丢失。 PHP-FPM错误日志显示子进程数量达到最大值(pm.max_children 设置为5)。 重启PHP-FPM后,网站恢复正常。
立即学习“PHP免费学习笔记(深入)”;
错误原因分析:
PHP-FPM的子进程数量已达到配置文件中设定的最大值,导致无法处理新的请求,从而引发Nginx的502错误。
解决方案:
问题在于PHP-FPM的进程管理配置。需要调整/etc/php/5.6/fpm/php-fpm.conf 或 /etc/php/5.6/fpm/pool.d/www.conf 文件中的pm参数及其相关设置。 (5.6版本通常在www.conf中配置)。
配置文件参数详解:
关键参数包括:
- pm: 进程管理模式,可选值 Static (静态) 或 dynamic (动态)。
- pm.max_children: 静态模式下PHP-FPM子进程的最大数量;动态模式下,表示最大子进程数。
- pm.start_servers: 动态模式下PHP-FPM启动时的子进程数量。
- pm.min_spare_servers: 动态模式下PHP-FPM保持的最小空闲子进程数量。
- pm.max_spare_servers: 动态模式下PHP-FPM保持的最大空闲子进程数量。
pm模式区别:
- static: 固定数量的PHP-FPM进程,仅pm.max_children生效。
- dynamic: 根据系统负载动态调整PHP-FPM进程数量,pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers 均生效。
进程数量计算:
要确定合适的进程数量,可以使用memory_get_peak_usage(true)函数获取单个请求的峰值内存使用量,并考虑PHP-FPM进程本身的内存消耗,从而估算每个进程所需的内存。 根据服务器的可用内存,计算可以同时运行的进程数量。
通过调整以上参数,例如增加pm.max_children 或优化pm.start_servers, pm.min_spare_servers, pm.max_spare_servers的值,可以有效解决PHP-FPM进程不足的问题,避免502错误的再次发生。 修改配置文件后,记得重启PHP-FPM服务使配置生效。