当我的PHP脚本运行时间比平常长时,我会收到nginx的504超时消息。 set_time_limit(0)
似乎无法防止这种情况发生!如果在nginx上运行php5-fpm时它不起作用怎么办?那么正确设置时间限制的方法是什么?
错误:
504 Gateway Time-out
nginx/1.2.7
你可以有几种方法来设置php-fpm的超时。在/etc/php5/fpm/pool.d/www.conf
中,我添加了这行:
request_terminate_timeout = 180
此外,在/etc/nginx/sites-available/default
文件中,我在有问题的服务器的位置块中添加了以下行:
fastcgi_read_timeout 180;
整个位置块看起来像这样:location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 180;
include fastcgi_params;
}
现在只需要重新启动php-fpm和nginx,对于处理时间少于180秒的请求就不会再出现超时问题了。
尝试这个链接,它提供了更好的解决方案。步骤如下:
/etc/nginx
目录下的nginx.conf
文件。在http {
部分下面添加以下代码:
client_header_timeout 3000;
client_body_timeout 3000;
fastcgi_read_timeout 3000;
client_max_body_size 32m;
fastcgi_buffers 8 128k;
fastcgi_buffer_size 128k;
注意:如果已经存在,请根据需要更改相应的值。
重新加载Nginx和php5-fpm。
$ service nginx reload
$ service php5-fpm reload
如果错误持续存在,请考虑增加数值。
无法使用PHP来防止nginx发出的超时。
要配置nginx允许更多时间,请参见proxy_read_timeout
指令。
正确的答案是在您的Nginx配置中增加fastcgi_read_timeout。
就是这么简单!
sudo nano /etc/nginx/nginx.conf
将这些变量添加到nginx.conf文件中:
http {
# .....
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
然后重新启动:
service nginx reload
在这种情况下可能会发生三种超时。可以看到每个答案都只关注了这些可能性中的一个方面。因此,我想写下来,以便未来访问此处的人不需要随机检查每个答案,并在不知道哪个有效的情况下获得成功。
因此,每个问题的修复方法如下。
设置超时头,例如:在ajax中
$.ajax({
url: "test.html",
error: function(){
// will fire when timeout is reached
},
success: function(){
//do something
},
timeout: 3000 // sets timeout to 3 seconds
});
nginx客户端超时
http{
#in seconds
fastcgi_read_timeout 600;
client_header_timeout 600;
client_body_timeout 600;
}
nginx被代理的服务器超时
http{
#Time to wait for the replying server
proxy_read_timeout 600s;
}
所以使用你需要的那个。也许在某些情况下,你需要所有这些配置。 我就需要了。
您需要在 nginx.conf
中添加额外的 nginx 指令(用于 ngx_http_proxy_module
),例如:
proxy_read_timeout 300;
proxy_read_timeout
指令可以改变代理超时时间,FcgidIOTimeout
用于处理执行时间过长的脚本,FcgidBusyTimeout
则用于处理需要较长时间才能执行的脚本。
如果您使用FastCGI应用程序,请将这些选项增加:
FcgidBusyTimeout 300
FcgidIOTimeout 250
在Plesk中,您可以在Web服务器设置下的附加nginx指令中添加它。
对于FastCGI,请在Web服务器设置下的HTTP附加指令中进行检查。
FcgidBusyTimeout
变量难道不是只存在于 Apache 中吗? - Slavik别忘了查看你的php-fpm日志!
在我的情况下,使用PHP 7.3时遇到了以下问题:
警告:[pool www]服务器已达到pm.max_children设置(5),请考虑提高它
在/etc/php/7.3/fpm/pool.d/www.conf
中,我不得不将pm.max_children
值从5
提高到50
(有时我会做一些比较重的本地工作...)。
注意:这可能会使用更多的CPU!
由于您正在使用php-fpm,因此应利用fastcgi_finish_request()来处理您知道可能需要更长时间的请求。
使用set_time_limit(0)
在使用php-fpm或类似进程管理器时是无用的。
底线是在使用php-fpm
时不要使用set_time_limit
,要增加执行超时时间,请查看此教程。
fastcgi_read_timeout
设置为多少秒,它仍然在60秒后超时。 - Spencer Williams