如何在 Nginx 上使用 FastCGI 防止网关超时
Posted
技术标签:
【中文标题】如何在 Nginx 上使用 FastCGI 防止网关超时【英文标题】:How do I prevent a Gateway Timeout with FastCGI on Nginx 【发布时间】:2010-10-08 09:32:12 【问题描述】:我正在运行 Django、FastCGI 和 nginx。我正在创建一种 API,有人可以通过 XML 发送一些数据,我将处理这些数据,然后为每个发送过来的节点返回一些状态代码。
问题是,如果我处理 XML 的时间过长,Nginx 会抛出 504 Gateway Time-out -- 我认为超过 60 秒。
所以我想设置 Nginx,这样如果任何与位置 /api 匹配的请求都不会超时 120 秒。什么设置可以做到这一点。
到目前为止我所拥有的是:
# Handles all api calls
location ^~ /api/
proxy_read_timeout 120;
proxy_connect_timeout 120;
fastcgi_pass 127.0.0.1:8080;
编辑:我没有工作:)
【问题讨论】:
您可以将超时值设置为“2m”而不是“120”。 数据没有被流式传输似乎很糟糕......即服务器在 60 秒或更长时间内开始响应似乎是不可接受的。 【参考方案1】:代理超时很好,对于代理,而不是对于 FastCGI...
影响 FastCGI 超时的指令是 client_header_timeout
、client_body_timeout
和 send_timeout
。
编辑:考虑到 nginx wiki 上的内容,send_timeout directive 负责设置响应的一般超时(这有点误导)。对于 FastCGI,fastcgi_read_timeout
会影响 FastCGI process response timeout。
【讨论】:
对于任何使用 uwsgi 并出现此错误的人,uwsgi_read_timeout 600;解决了我的问题。 我的问题是(作为服务器管理员业余爱好者)我该去哪里改变这个? httpd.conf 文件? 如果有帮助,我在 Media Temple 的 DV 系统的 /etc/nginx/ 中。 Abdo 提供了一种很好的调试方式。如果还是有问题,可能需要在 nginx.conf 中增加最大客户端消息大小 (client_max_body_size **M;) 增加超时恕我直言不是一个合适的解决方案。【参考方案2】:对于那些使用 nginx 和 unicorn 和 rails 的用户,超时很可能在您的 unicorn.rb
文件中
在 unicorn.rb 中设置一个较大的超时时间
timeout 500
如果您仍然遇到问题,请尝试在 nginx 的上游设置 fail_timeout=0,看看这是否能解决您的问题。这是出于调试目的,在生产环境中可能很危险。
upstream foo_server
server 127.0.0.1:3000 fail_timeout=0;
【讨论】:
我认为人们反对它是因为这是关于 Django 的,但是你的回答解决了我使用 Rails + Unicorn 的网关超时问题 :)【参考方案3】:在http
nginx部分(/etc/nginx/nginx.conf)添加或修改:
keepalive_timeout 300s
在server
nginx 部分 (/etc/nginx/sites-available/your-config-file.com) 添加以下行:
client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
在php
文件中的case 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) 修改:
request_terminate_timeout = 300
希望对你有帮助。
【讨论】:
如果我将时间更改为 10000 秒,会发生什么“坏事”吗? 不会发生什么坏事,但您的服务会等待更多时间。您可以根据需要更改它的值。【参考方案4】:如果你使用独角兽。
查看您服务器上的top
。 Unicorn 现在可能正在使用 100% 的 CPU。
这个问题有几个原因。
您应该检查您的 HTTP 请求,其中一些可能非常困难。
检查独角兽的版本。可能是您最近更新了它,但出现了问题。
【讨论】:
【参考方案5】:在这样的服务器代理设置中
location /
proxy_pass http://ip:80;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
在这样的服务器 php 设置中
server
client_body_timeout 120;
location = /index.php
#include fastcgi.conf; //example
#fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn
fastcgi_read_timeout 120s;
【讨论】:
以上是关于如何在 Nginx 上使用 FastCGI 防止网关超时的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu上安装nginx+mysql+php5-fpm(PHP5 - FastCGI Process Manager)