I
Member
线上偶发 502,Nginx 日志里 upstream 报错,第一反应可能是 PHP 代码问题,但先看 PHP-FPM 这边:
1. 先开慢日志定位
php-fpm.conf 里配好 slowlog 和 request_slowlog_timeout(比如 5s),502 高峰期去看慢日志,到底是哪个脚本、哪一行卡住了。很多"偶发 502"其实是某个 SQL 或外部 HTTP 调用超时。
2. 进程池配得对不对
pm = dynamic 时,pm.max_children 太小会导致请求排队超时。估算方法:max_children 约等于 内存 / 单个 PHP 进程常驻内存。别拍脑袋配 50,先 ps 看单个 php-fpm 进程 RSS 再算。
3. pm.max_requests 防内存泄漏
PHP 进程跑久了内存慢慢涨,设 pm.max_requests = 500~1000 让 worker 定期重启,是治"越跑越慢"的土办法但有效。
4. 区分 502 的三种脸
- 连接被拒:FPM 进程池满了或挂了,看 listen 队列。
- 网关超时:后端处理超过 Nginx 的 proxy 超时,先看慢日志。
- 固定时间点 502:八成是定时任务(crontab 重启 FPM、日志切割)搞的,对一下时间。
5. 监控别只看 502 率
把 FPM 的 status 页打开(pm.status_path),监控 active processes 和 listen queue 长度,队列开始堆积时先扩容,别等 502 爆了再救火。
你们线上 PHP-FPM 的 max_children 一般按什么配的?
1. 先开慢日志定位
php-fpm.conf 里配好 slowlog 和 request_slowlog_timeout(比如 5s),502 高峰期去看慢日志,到底是哪个脚本、哪一行卡住了。很多"偶发 502"其实是某个 SQL 或外部 HTTP 调用超时。
2. 进程池配得对不对
pm = dynamic 时,pm.max_children 太小会导致请求排队超时。估算方法:max_children 约等于 内存 / 单个 PHP 进程常驻内存。别拍脑袋配 50,先 ps 看单个 php-fpm 进程 RSS 再算。
3. pm.max_requests 防内存泄漏
PHP 进程跑久了内存慢慢涨,设 pm.max_requests = 500~1000 让 worker 定期重启,是治"越跑越慢"的土办法但有效。
4. 区分 502 的三种脸
- 连接被拒:FPM 进程池满了或挂了,看 listen 队列。
- 网关超时:后端处理超过 Nginx 的 proxy 超时,先看慢日志。
- 固定时间点 502:八成是定时任务(crontab 重启 FPM、日志切割)搞的,对一下时间。
5. 监控别只看 502 率
把 FPM 的 status 页打开(pm.status_path),监控 active processes 和 listen queue 长度,队列开始堆积时先扩容,别等 502 爆了再救火。
你们线上 PHP-FPM 的 max_children 一般按什么配的?