Nginx和uWSGI出现“504网关超时”错误

12

我正在按照教程【使用uWSGI和Nginx设置Django和Web服务器】进行操作。

uWSGI已经正常运行

我通过以下命令来配置uwsgi服务以提供Django项目。

mydjangoproj $ uwsgi --http 0.0.0.0:8002 --module wsgi --harakiri 5

当我在浏览器中访问 42.42.42.42:8002 时,它可以正常工作。

我的nginx设置

nginx作为守护进程运行,访问默认网站的80端口也是可以的。

我使用以下的mydjangoproj_nginx.conf文件将其添加为nginx的一个站点:

server {
    listen      8000;
    server_name 42.42.42.42;
    charset     utf-8;
    client_max_body_size 75M;

    location /static {
        alias /home/myuser/mydjangoproj/static; 
    }

    location / {
        uwsgi_pass 127.0.0.1:8002;
        include     /home/myuser/mydjangoproj/uwsgi_params;
    }
}

我使用教程中未修改的uwsgi_params版本:

uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

它可以完美地提供静态文件。

错误

如果我访问42.42.42.42:8000,它会长时间挂起,直到nginx超时,然后我会收到504 Gateway Time-out

uWSGI在 shell 中没有任何输出。如果直接在浏览器中访问,则确实会写入有关接收请求的内容。

只有在超时后,nginx 错误日志才会记录:

2014/12/11 05:31:12 [error] 28895#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 66.66.66.66, server: 42.42.42.42, request: "GET / HTTP/1.1", upstream: "uwsgi://42.42.42.42:8002", host: "42.42.42.42:8000"
如果我关闭了只是在Shell中运行的uWSGI,我会立即得到502 Bad Gateway错误。在网上搜索时,人们只建议将uWSGI超时时间设置为低于nginx超时时间,这就是我使用--harakiri 5运行uWSGI的原因。那么,我的问题是什么呢?
1个回答

26

我认为你正在以http模式运行uwsgi,例如--http 0.0.0.0:8002,但是你已经将nginx配置为uwsgi代理。你应该将uwsgi脚本更改为以下内容:

 uwsgi --socket :8002 --module uwsgi --harakiri 5

请注意,如果您在同一台机器上运行nginxuwsgi,最好使用Unix套接字


搞定了!我原以为nginx和uwsgi之间的通信应该是http协议,但显然它们使用的是不同类型的连接。 - Mads Skjern
我通常会等几天,看其他答案是否出现,然后选择最好的答案。我不知道这是否违反了指南。但我现在已将其标记为“已回答” :) - Mads Skjern
--harakiri 5 和 --socket-timeout 5 有什么不同? - DJ_Stuffy_K
https://dev59.com/t2EKtIcB2Jgan1zn1vWY - DJ_Stuffy_K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接