我有一个 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 代理/缓存,请参见这里。