PHP网站调试三步定位法:站长必备实战指南
|
去年九月,我蹲在托管机房的金属台阶上改代码,空调外机嗡嗡震得后颈发麻——不是机柜在响,是隔壁网吧的鼓风机漏了风管。我手边泡面桶里浮着三根没吸完的香葱,汤早凉透了。 客户凌晨两点甩来截图:首页白屏,但/health.php能返回200,/wp-admin倒能进——他顺手还截了浏览器控制台里那行红字:“Failed to load resource: the server responded with a status of 502 (Bad Gateway)”。我原以为Nginx upstream配置崩了,结果翻完nginx.conf、查完upstream timeout、重载八次服务,502还在那儿喘气。 我扯了张便利贴贴在显示器右下角,写了三行字:一查日志,二盯进程,三换PHP版本。不是什么高招,就是去年四月老张在我工位后面拍我肩膀说的:“别猜,先看它吐出来的第一口痰。”——他现在在东莞搞IDC托管,上个月微信头像换了张荔枝林照片,底下配文“比PHP干净”。 第一步:tail -f /var/log/nginx/error.log,没几秒就刷出“connect() failed (111: Connection refused) while connecting to upstream”。好,转第二步。ps aux | grep php-fpm,发现master进程在,但worker全挂了——ps列表里第八次出现的那个子进程PID,连同前七次,都标着。我盯了二十来分钟,眼睁睁看着新起的worker进程在创建后三秒内就变成僵尸,而supervisord根本没报错,log里干干净净,像什么都没发生过。
文章配图,仅供参考 这时候我掏出手机查监控曲线,CPU没爆,内存剩62%,磁盘IO平得像尺子量过。我也不知道为啥突然想起上个月备份时误删过/etc/php/7.4/fpm/pool.d/www.conf里的rlimit_files=65536这行,就随手补了回去——反正不差这一秒。reload fpm,worker活了;再curl首页,白屏没了。可那个502,它还是偶尔冒出来,比如用户刚登录完点个人中心,又或者上传头像到一半。第三步:换PHP版本。我本地搭了个7.4和8.1双环境镜像,拿同一份访问日志回放,8.1里所有请求都是200,7.4里随机跳502。我把www.conf里那行rlimit_files又加回8.1配置里,重新跑了一遍——照样200。所以问题不在句柄数,而在别的地方。对,就这么笃定:不是配置值错了,是PHP本身在7.4小版本里某次安全补丁动了进程复用的触发条件。但具体哪行代码、哪个信号处理分支出了岔子?我查了三小时changelog,只看到一行“improved fastcgi handling”,底下没注释,没链接,没作者邮箱。官方文档写着“fixed several edge cases”,而我正卡在那个edge上,卡得结结实实。 我后来在客服群里听见一个同行说:“你们PHP网站调试三步定位法:站长必备实战指南”,我就笑了——这话不是吹牛,是筛子。真能三步走完还不翻车的,要么服务器十年没动过,要么早就把运维写成肌肉记忆了,剩下那些,在优胜劣汰的斜坡上,自己滑下去了。我也不知道算不算淘汰,反正那天晚上收工前,我把泡面桶底那点冷汤倒进了洗手池,水流声特别响。 有谁碰到过这个吗:PHP-FPM worker频繁变僵尸,但日志沉默,ulimit检查全绿,只有换主版本才消失? (编辑:航空爱好网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux下PHP开发环境搭建实战指南
PHP电商转化断点诊断:从点击到下单
PHP调试总卡壳?3步精准定位90%技术隐藏Bug
PHP调试总卡壳?老工程师的3个断点盲区
PHP工程师别只写代码:外链是权重跃升的隐形杠杆
PHP工程师必避的5大服务器选型陷阱与调优实战
运营中心PHP实时交互卡顿?14年运维老炮三招速解

