当我的 PHP 脚本运行时间比平时长时,我从 nginx 收到504超时消息。set_time_limit(0)似乎不能阻止这一点!在 nginx 上运行 php5-fpm 时它不工作吗?如果是这样,设定时限的正确方法是什么?
set_time_limit(0)
错误:
504 Gateway Time-out nginx/1.2.7
不能使用 PHP 来防止 nginx 发出超时。
要配置 nginx 以允许更多的时间,请参见 proxy_read_timeout指令。
proxy_read_timeout
由于您正在使用 php-fpm,因此应该利用 fastcgi _ Finish _ request ()来处理可能需要更长时间的请求。
有几种方法可以设置 php-fpm 的超时:
request_terminate_timeout = 180
此外,在 /etc/nginx/sites-available/default中,我在所涉及的服务器的位置块中添加了以下代码行:
/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 {部分:
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-fpm 或类似的流程管理器时,使用 set_time_limit(0)是无用的。
底线是在使用 php-fpm时不要使用 set_time_limit,为了增加执行超时,请选中此 教程。
php-fpm
set_time_limit
您需要在 nginx.conf中添加额外的 nginx 指令(对于 ngx_http_proxy_module) ,例如:
ngx_http_proxy_module
proxy_read_timeout 300;
基本上 nginx proxy_read_timeout指令改变代理超时,FcgidIOTimeout用于安静时间太长的脚本,FcgidBusyTimeout用于执行时间太长的脚本。
FcgidIOTimeout
FcgidBusyTimeout
另外,如果你正在使用 FastCGI 应用程序,也增加这些选项:
FcgidBusyTimeout 300 FcgidIOTimeout 250
然后重新加载 nginx 和 PHP5-FPM。
在 Plesk,你可以把它加入到 abc0中的 附加的 nginx 指令。
对于 FastCGI,在 HTTP 的附加指令下检查 Web 服务器设置。
见: 如何解决 Plesk 的快速 cgi 超时问题?
正确的答案是在 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 });
客户端超时
http{ #in seconds fastcgi_read_timeout 600; client_header_timeout 600; client_body_timeout 600; }
代理服务器超时
http{ #Time to wait for the replying server proxy_read_timeout 600s; }
所以使用你需要的那个。也许在某些情况下,你需要所有这些配置。 我需要。
经过长时间的寻找这个问题的答案,我看到了一件事。
在我的应用程序中还有一层:
从 make request 转到 LB,我可以看到在 php 中使用“ sleep”测试时的成功响应。
别忘了查看 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(有时我会做一些相当重的本地操作...)。
/etc/php/7.3/fpm/pool.d/www.conf
pm.max_children
5
50
注意: 请注意,它可能会使用更多的 CPU!