发现了吗,502报错的情况下,tcpdump抓到的包中,末尾缺少了http的response header,这正验证了我们之前的推测,php-fpm在返回body之前,并没有传递完整的response header给nginx,导致nginx报出来错误。
4.5 暂时的结论
观察上面的日志,报错最后的响应头不完整或者根本就没有,这个正好会进入到nginx中未解析到header头并且已到header尾部的情况触发报错, 所以暂时现在可以推断的是:
php-fpm会在一定的情况下向nginx传送不完整的响应头数据,导致nginx解析fastcgi与 http的header时出错,导致报出502。
这看起来不可思议,竟然是下游服务出了差错,而不是因为nginx内的fastcgi_buffer_size太小导致的错误,不过该问题并不是不可能发生: