504 网关超时 uwsgi + nginx django 应用程序
504 Gateway Time-out uwsgi + nginx django application
我正在尝试 运行 我的 Django 应用程序使用 Nginx + uwsgi,但我在加载一分钟后收到 504 Gateway Time-out
。
我的应用需要时间来执行所需的操作,因为它会在多个网站上搜索特定内容。
我的 nginx conf 是下一个:
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/"
有人知道我怎样才能摆脱这个吗?我已经尝试了大量的 Whosebugs 解决方案,但 none 对我有用。
如果它是一个处理时间过长的内部任务,请使用 celery 来 运行 该任务。
http://docs.celeryproject.org/en/latest/userguide/tasks.html
如果它不是纯粹的内部任务,例如:- 上传大文件,则将 Nginx client_body_timeout
增加到大于 60s
。
这是因为 nginx 配置中的默认超时。编辑 Nginx 虚拟主机文件
并在 server{}
部分添加以下行。
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
# default is 60 seconds, For a 300 second timeout.
client_body_timeout 300s;
编辑:
uwsgi_read_timeout 300s;
也是需要的。但是它已经在你的配置中了。
派对迟到了。我花了几个小时配置 nginx.cfg,最后意识到它与我的 EC2 服务器的负载均衡器设置有关。如果您正在为 EC2 服务器使用 AWS 负载均衡器,请尝试同时增加 Idle timeout
以及 nginx.cfg.
的变化
我的应用环境是Django/Python/Nginx,不在AWS上。我发现了很多线索,它们表明了这些参数的修改并应用了它们,但是 none 对我有用,直到我尝试修改 /etc/nginx/sites-available/ 中找到的名为“default”的文件并添加了以下行:
uwsgi_read_timeout3600;
我在“listen 443”的位置区域做了这个修改,看起来像这样:
server {
listen 443 ...
...
location / {
uwsgi_pass django;
...
uwsgi_read_timeout 3600;
}
...
我正在尝试 运行 我的 Django 应用程序使用 Nginx + uwsgi,但我在加载一分钟后收到 504 Gateway Time-out
。
我的应用需要时间来执行所需的操作,因为它会在多个网站上搜索特定内容。
我的 nginx conf 是下一个:
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/"
有人知道我怎样才能摆脱这个吗?我已经尝试了大量的 Whosebugs 解决方案,但 none 对我有用。
如果它是一个处理时间过长的内部任务,请使用 celery 来 运行 该任务。 http://docs.celeryproject.org/en/latest/userguide/tasks.html
如果它不是纯粹的内部任务,例如:- 上传大文件,则将 Nginx client_body_timeout
增加到大于 60s
。
这是因为 nginx 配置中的默认超时。编辑 Nginx 虚拟主机文件
并在 server{}
部分添加以下行。
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout
# default is 60 seconds, For a 300 second timeout.
client_body_timeout 300s;
编辑:
uwsgi_read_timeout 300s;
也是需要的。但是它已经在你的配置中了。
派对迟到了。我花了几个小时配置 nginx.cfg,最后意识到它与我的 EC2 服务器的负载均衡器设置有关。如果您正在为 EC2 服务器使用 AWS 负载均衡器,请尝试同时增加 Idle timeout
以及 nginx.cfg.
我的应用环境是Django/Python/Nginx,不在AWS上。我发现了很多线索,它们表明了这些参数的修改并应用了它们,但是 none 对我有用,直到我尝试修改 /etc/nginx/sites-available/ 中找到的名为“default”的文件并添加了以下行: uwsgi_read_timeout3600;
我在“listen 443”的位置区域做了这个修改,看起来像这样:
server { listen 443 ... ... location / { uwsgi_pass django; ... uwsgi_read_timeout 3600; } ...