nginx499错误
1、nginx报499,php慢日志,数量基本一致,每分钟1000+
2、相同版本程序,不同的是机房和后端服务。
首先看php慢日志,定位到具体的慢日志都是curl后端数据服务器慢,查看curl耗时日志,发现有一台数据服务器curl返回结果特别慢。
但是为什么会报499错误?之前遇到的curl慢导致的结果都是504timeout。
网上搜索http code 499,大概获取到的信息是
1、499是nginx自定义的httpcode
2、一般都是由客户端主动断开连接导致的
一番搜索下来并没有什么实质性结果。
转移方向从配置文件入手。
慢日志和499日志量基本一致,推断主要可能是超时引起的问题。
1、查看nginx的fastcgi配置的超时选项
fastcgi_connect_timeout 5s;
fastcgi_send_timeout 5s;
fastcgi_read_timeout 5s;
2、查看php-fpm配置
pm = static
pm.max_children = 500
以前遇到过504,是因为fastcgi_read_timeout 超时。看到fpm的配置,子进程是静态的,进而推测499 是由于每个请求耗时过长,导致fpm的子进程被用完了,fastcgi_connect_timeout 超时。
为证实这个推测,测试环境模拟fastcgi_connect_timeout。
将php-fpm的配置改成
pm = static
pm.max_children = 2
重启php-fpm
将php脚本改为
<?php
sleep(10);
echo 11;
curl 指定php脚本。观察curl结果输出和nginx日志。
发现3个curl命令在10秒或者10几秒后都能正常输出。推测失败。。。
多次尝试失败后,在curl等待时ctrl+c,日志中出现了499,结合之前搜索到的499产生原因,基本确认了499是由于响应太慢导致客户端直接断开连接了。
tcpdump抓包结果