当我的 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 秒的请求应该不会再有超时。
试试这个链接,它有一个更好的解决方案来解决这个问题。所以步骤是:
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
如果错误仍然存在,请考虑增加值。
您不能使用 PHP 来防止 nginx 发出超时。
要配置 nginx 以允许更多时间,请参阅proxy_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
正确的答案是在 Nginx 配置中增加fastcgi_read_timeout 。
就那么简单!
在这种情况下会发生三种超时。可以看出,每个答案都只关注这些可能性的一个方面。所以,我想把它写下来,这样将来访问这里的人就不需要随机检查每个答案并在不知道哪个有效的情况下获得成功。
因此,每个问题的修复如下。
设置超时标头,例如:在 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 指令(for ngx_http_proxy_module
)nginx.conf
,例如:
proxy_read_timeout 300;
基本上 nginxproxy_read_timeout
指令会更改代理超时,FcgidIOTimeout
适用于安静时间过长FcgidBusyTimeout
的脚本,以及执行时间过长的脚本。
此外,如果您使用的是 FastCGI 应用程序,请同时增加这些选项:
FcgidBusyTimeout 300
FcgidIOTimeout 250
然后重新加载 nginx 和 PHP5-FPM。
在 Plesk 中,您可以在Additional nginx 指令下的Web 服务器设置中添加它。
对于 FastCGI 检查HTTP 附加指令下的Web 服务器设置。
使用 php-fpm 或类似的进程管理器时,使用set_time_limit(0)
是无用的。
set_time_limit
使用时不要使用底线php-fpm
,以增加执行超时,请查看本教程。
由于您使用的是 php-fpm,因此您应该利用 fastcgi_finish_request() 来处理您知道可能需要更长时间的请求。
不要忘记查看您的 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!
经过长时间寻找这个问题的答案后,我看到了一件事。
我的应用程序还有一层:
从发出请求转义到 LB,我可以在 php 中使用“sleep”看到测试成功响应。