【问题标题】:nginx and uWSGI gives "504 Gateway timeout"nginx 和 uWSGI 给出“504 网关超时”
【发布时间】:2015-02-09 19:41:05
【问题描述】:

我正在关注教程Setting up Django and your web server with uWSGI and nginx

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 的原因。

那么,我的问题是什么?

【问题讨论】:

    标签: django nginx uwsgi


    【解决方案1】:

    我认为你在 http 模式下运行 uwsgi --http 0.0.0.0:8002 但你已将 nginx 配置为 wsgi 代理将你的 uwsgi 脚本更改为:

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

    注意如果你在同一台机器上运行nginxuwsgi最好使用unix sockets

    【讨论】:

    • 做到了!我以为nginx和uwsgi之间的通信应该是http,但显然是另一种连接。
    • 我通常会等待几天其他答案弹出,然后选择最好的一个。我不知道这是否违反准则。但我现在已将其标记为已回答:)
    • --harakiri 5 与--socket-timeout 5 有何不同?
    猜你喜欢
    • 2011-10-04
    • 2019-09-29
    • 2015-12-25
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2013-02-13
    相关资源
    最近更新 更多