当我的PHP脚本运行时间超过平常时,我从nginx收到504超时消息。 set_time_limit(0)
似乎没有阻止这一点!在nginx上运行php5-fpm时它不起作用吗?如果是这样,那么设定时间限制的正确方法是什么?
错误:
504 Gateway Time-out
nginx/1.2.7
答案 0 :(得分:176)
有几种方法可以设置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秒的请求,不应再有超时。
答案 1 :(得分:39)
试试这个link,它有一个更好的解决方案来解决这个问题。所以步骤是:
nginx.conf
目录中的/etc/nginx
文件。在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
如果错误仍然存在,请考虑增加值。
答案 2 :(得分:9)
您不能使用PHP来防止nginx发出超时。
要配置nginx以允许更多时间,请参阅proxy_read_timeout
directive。
答案 3 :(得分:7)
正确答案是在Nginx配置中增加 fastcgi_read_timeout 。
很简单!
答案 4 :(得分:3)
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
答案 5 :(得分:1)
您需要在ngx_http_proxy_module
中添加额外的nginx指令(适用于nginx.conf
),例如:
proxy_read_timeout 300;
基本上,nginx proxy_read_timeout
指令会更改代理超时,FcgidIOTimeout
用于安静太长的脚本,FcgidBusyTimeout
用于执行时间过长的脚本。
此外,如果您使用的是FastCGI应用程序,请同时增加以下选项:
FcgidBusyTimeout 300
FcgidIOTimeout 250
然后重新加载nginx和PHP5-FPM。
在Plesk中,您可以将其添加到附加nginx指令下的 Web服务器设置中。
对于FastCGI,请检查 HTTP附加指令下的 Web服务器设置。
答案 6 :(得分:0)
由于你使用的是php-fpm,你应该利用fastcgi_finish_request()来处理你知道可能需要更长时间的请求。
答案 7 :(得分:0)
使用php-fpm或类似的流程管理器时,使用set_time_limit(0)
是没用的。
使用set_time_limit
时底线不使用php-fpm
,以增加执行超时,请检查tutorial。
答案 8 :(得分:0)
在这种情况下可能会发生三种超时。可以看出,每个答案仅集中在这些可能性的一个方面。因此,我想把它写下来,这样以后再来这里的人就不必随意检查每个答案并获得成功,而无需知道哪个有效。
因此,每个问题的修复方法如下。
$.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;
}
因此,请使用您需要的那个。也许在某些情况下,您需要所有这些配置。 我需要。
答案 9 :(得分:0)
在长时间寻找这个问题的答案后,我看到了一件事。
我的应用程序还有一层:
从 make 请求转义到 LB,我可以在 php 中使用“sleep”看到测试的成功响应。
答案 10 :(得分:-6)
我使用配置APACHE解决了这个问题! 所有方法(在本主题中)对我来说都是不正确的...然后我尝试使用chanche apache config:
Timeout 3600
然后我的脚本工作了!