504 Gateway Time-out
我正在尝试使用 Nginx + uwsgi 运行我的 Django 应用程序,但加载一分钟后才收到。
我的应用程序需要一些时间来完成所需的操作,因为它要在多个网站上搜索特定的东西。
我的 nginx 配置如下:
upstream uwsgi {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name server_ip;
root /opt/emails/subscriptions;
index index.html index.htm index.php;
location /emailsproject/ {
root /opt/emails/subscriptions/;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://uwsgi;
proxy_set_header Host $http_host;
uwsgi_read_timeout 18000;
}
}
我的 uwsgi 脚本:
description "uWSGI server"
env PYTHONPATH=/opt/emails/subscriptions
env DJANGO_SETTINGS_MODULE=emailsproject.settings
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec uwsgi_python --http-socket 127.0.0.1:8000 -p 4 --wsgi-file /opt/emails/subscriptions/emailsproject/wsgi.py
我的 nginx 在 error.log 中给出了以下错误消息:
2015/09/28 02:15:57 [error] 4450#0: *19 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 37.235.53.246, server: my_server_ip, request: "POST /home/ HTTP/1.1", upstream: "http://127.0.0.1:8000/home/", host: "my_server_ip", referrer: "http://my_server_ip/home/"
有人知道我该如何摆脱这个问题吗?我尝试过很多 stackoverflows 解决方案,但都不起作用。
答案1
我知道我迟到了,但在尝试了许多这些建议(和其他建议)后,我最终发现我的超时是由于我的 DNS 引起的 - 如果您使用 Amazon 负载均衡器,它们的“空闲超时”默认设置为 120 秒。
答案2
这是因为您需要设置proxy_read_timeout
,而不是uwsgi_read_timeout
。反过来,这是因为您实际上没有使用 uwsgi,而是使用了 HTTP 代理。Uwsgi 后端是使用uwsgi_pass
指令声明的。
答案3
许多人认为 504 与客户端的请求有关,或者如果站点上存在一些 DDoS 攻击,则会导致大量会话堆积。504 是双向的,因为如果您的 wsgi 无法显示代码和/或服务器由于溢出而无法响应,您可能会看到错误。因此,请确保运行 manage.py 来仔细检查您的代码是否可以显示。然后尝试"curl -I yoursite.com"
命令以查看它是否仍然给您错误。您需要关注两个与 nginx 相关的文件,一个是/etc/nginx/nginx.conf
默认全局设置。第二个是您在 中自己创建的/etc/nginx/sites-available
。在您的全局/etc/nginx/nginx.conf
安装中添加以下几行
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;
此解决方案解决了不同情况下导致的 90% 504 错误。您的项目配置应该与上面提到的相同。