Nginx 504 Gateway Time-out分析及解决方法

1、场景还原
php程序在执行抓取远程图片库并保存至本地服务器的时候,出现了“504 Gateway Time-out”错误提示。php

问题定位:因为图片巨多,因此下载时间很长(10分钟以上),引发网关超时。nginx

 

2、问题分析
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来讲就是没有请求到能够执行的PHP-CGI。数据库

一般如下几种状况会致使这个问题:服务器

1. 程序在处理大量的数据,或者有死循环之类的问题
2. 建立数据库之类的链接由于某些缘由链接不上,而后没有超时失败的机制,致使一直在建立链接
3. 程序中有一些http请求,这些请求执行时间过长,致使超时。

  

3、解决方法函数

分别修改nginx及php的相关配置参数。url

1.修改Nginx配置( nginx.conf ):spa

fastcgi_connect_timeout 1200s;#原设置为300s fastcgi_send_timeout 1200s;#原设置为300s fastcgi_read_timeout 1200s;#原设置为300s fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k;

这里最主要的设置是前三条,即.net

fastcgi_connect_timeout #同 FastCGI 服务器的链接超时时间,默认值60秒,它不能超过75秒; fastcgi_send_timeout #Nginx 进程向 FastCGI 进程发送 request ,整个过程的超时时间,默认值60秒; fastcgi_read_timeout #FastCGI 进程向 Nginx 进程发送 response ,整个过程的超时时间,默认值60秒;

 

2. 修改php配置文件code

php.ini max_execution_time = 300s;PHP 脚本的最大执行时间,可是,在 php-cgi(php-fpm) 中,该参数不会起效。 php-fpm request_terminate_timeout = 0; #设置单个请求的超时停止时间.设置为0 即一直执行下去直到程序结束不会超时。

修改完上述设置以后 再次执行发现没有出现504超时提示,可是页面空白,图片并无下载成功。应该仍是php在执行过程当中超时。查看php代码,在程序开始处添加如下代码:blog

set_time_limit(0);

 

本函数用来配置该页最久执行时间。默认值是 30 秒,在 php.ini 中的 max_execution_time 变量配置,若配置为 0 则不限定最久时间。

当执行到该函数时,才开始计算。例如,若默认是 30 秒,而在执行到该函数前已执行了 25 秒,而用本函数改成 20 秒,则该页面最长执行时间为 45 秒。

再次执行,结果能够了。

 

做者:哆啦C梦

原文出自:《Nginx 504 Gateway Time-out分析及解决方法

相关文章
相关标签/搜索