记PHP-FPM一次奇怪的进程重启经历

最近在和恺英游戏XY平台对接. 整个流程都开发完毕. 直到对方上线到预发布环境后遇到见鬼的事.


由于是支付平台项目, 支付完成后需要调用对方的通知接口提示对方发货.之前已经调通的接口, 每次调用都无法正常返回, 并打断我的程序逻辑.而且会挂掉我当前的PHP-FPM进程,重启后重新发送请求, 在前端看来就是扣款后又回头重新调用了一次, 导致对方收到通知发货, 而我方确没有回到支付成功界面.


检查Nginx日志 发现通知接口进程异常关闭 (*131 recv() failed (104: Connection reset by peer) while reading response header from upstream)

bug2.png


Tcpdump 抓包并没有发现任何问题

bug1.png


Strace 跟踪后问题终于暴露了, 发起了请求,但是对方没有正确返回, 排除了Nginx PHP-FPM超时的可能, 猜测对方某个系统插入了异常数据导致接受失败重启了进程.

bug3.png


正确的Log

bug4.png

对方修改了代码后系统正常应答, 小坑一个


后续

早上再次出现, 尝试检查关闭原因,在FPM配置文件内关闭了超时退出设置, 程序可以正常跑了, 但是通知接口依然还是会超时

bug5.png


慢日志

bug6.png


最后发现服务器时间有问题, 测试被动过了...改回正常后就好了


结论, 坑爹的认证时间, FPM超时时间和系统时间并不一致,导致外来接口调用越过超时设置被关闭...