nginx、gunicorn 和 django 奇怪的 504 网关超时

nginx、gunicorn 和 django 奇怪的 504 网关超时

我有一个 nginx / gunicorn / django 设置,如下所示:

Nginx

server {
    listen 80;
    server_name myserver.com;

    root /www/python/apps/pyapp/;

    access_log /var/log/nginx/myserver.com.access.log;
    error_log /var/log/nginx/myserver.com.error.log;


    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8081/;
    }
}

我的 gunicorn upstart 脚本

description "pyapp"
start on [2345]
stop on [06]

respawn

# start from virtualenv path
chdir /www/python/apps/pyapp/
exec /usr/bin/gunicorn  -w 11 -b 0.0.0.0:8081 --error-logfile=/var/log/nginx/pyapp.log wsgi:application

服务器运行良好,请求响应良好。但是,当我开始将流量从旧服务器引导到此设置时,页面开始出现 504 网关超时错误。

请求所做的只是从数据库获取数据并使用 django-rest-framework 进行渲染。查看 MySQL 进程列表,那里似乎没有任何卡住的查询。这有点奇怪。

有什么建议吗?

答案1

首先,你可以尝试一下在没有前端 nginx 的情况下后端(django/gunicorn)的运行情况。ab(apache 基准测试)是完成此任务的一个简单工具。

您可以直接从服务器运行它,或者如果您的 8081 端口没有被任何机器的防火墙保护:

ab -c 50 -n 500 http://localhost/path-xyz/

(ab 可通过 apache2-utils 包获得,至少在基于 Debian 的系统上)-c 代表“并发”,-n 代表请求数。

如果后端是瓶颈,而且你正在使用 nginx - 可以选择进行一些缓存(不知道你的应用程序,但也许……)。如果你的 API 公开经常更改的数据,你可以将缓存时间设置得很短。(1 到 10 秒)- 因此,如果你每秒有 100 个请求,其中只有一个必须到达后端,其他的将获得缓存的响应。

对于 nginx 代理/缓存,请参见这里

相关内容