首页 > Nginx/Apache> 记一次nginx 504超时

记一次nginx 504超时

2014-05-30 09:34:33 发表评论 阅读评论 2573 人阅读    

公司使用的是haproxy做负载均衡,nginx+php+mysql的架构。由于后台有一个导入用户的功能需要执行的时间很长,页面上报错了504 Gateway Time-out。

关于504的说明

服务器(不一定是 Web 服务器)正在作为一个网关或代理来完成客户(如您的浏览器或我们的 CheckUpDown 机器人)访问所需网址的请求。
为了完成您的 HTTP 请求, 该服务器访问一个上游服务器, 但没得到及时的响应。
这通常意味着上游服务器已关闭(不响应网关 / 代理),而不是上游服务器和网关 / 代理在交换数据的协议上不一致。


因为使用量不大以及是内部人员使用的,懒得用队列之类的了。所以想着修改nginx的超时时间,让程序执行时间长一点。

修改nginx的配置文件。在http{}中增加以下配置

#fastcgi的超时配置,(针对后端的fastcgi 生效, fastcgi 不属于proxy模式)

fastcgi_connect_timeout 5;     #连接超时
fastcgi_send_timeout 300;      #写超时
fastcgi_read_timeout 300;      #读取超时

#Proxy: (针对proxy/upstreams的生效)

proxy_connect_timeout 15s;      #连接超时
proxy_read_timeout 300s;        #读超时
proxy_send_timeout 300s;        #写超时

另外配置php-fpm的超时时间

request_terminate_timeout = 300

重启nginx和php-fpm。


本来以为就大功告成了,没想到还是返回504超时。使用chrome查看超时时间为50s。查看nginx的错误日记也没找到超时的错误。

后来查看了访问日记,nginx的访问日记返回的状态是499,google了下nginx 499
让我们看看NGINX的源码中的定义:

ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
ngx_string(ngx_http_error_497_page), /* 497, http to https */
ngx_string(ngx_http_error_404_page), /* 498, canceled */
ngx_null_string,   /* 499, client has closed connection */

可以看到,499对应的是 client has closed connection。这很有可能是因为服务器端处理的时间过长,客户端不耐烦了。


客户端主动断开了连接了,会不会是haproxy也有超时限制呢?查看配置文件果然是。

contimeout 5000     #设置连接超时时间 
clitimeout 50000    #设置客户端超时时间 
srvtimeout 50000    #设置服务器超时时间

haproxy设置的超时时间是50s,这里的单位是毫秒。将这个时间改大之后,就没问题了。


参考资料:

http://blog.csdn.net/heiyeshuwu/article/details/7841366 

http://www.linuxidc.com/Linux/2014-01/94648.htm

http://www.ha97.com/5194.html

分类: Nginx/Apache 标签: haproxy 504 timeout
comments powered by Disqus