【发布时间】:2013-11-23 19:48:09
【问题描述】:
我见过两种使用 gunicorn 和 nginx 托管 django 应用程序的策略。
一种策略是在网络端口上运行 gunicorn。例如(来自http://goodcode.io/blog/django-nginx-gunicorn/):
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:8000/;
}
另一种策略是在启动时将 gunicorn 绑定到 UNIX 套接字(例如 http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/)
upstream hello_app_server {
server unix:/tmp/gunicorn.sock fail_timeout=0;
}
...
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://hello_app_server;
break;
}
}
认为哪种策略更好?任何 cmets 的正确方法?我倾向于使用套接字方法,因为我想象 TCP 会引入开销。我最关心的是我见过的实现示例之间在标头、连接超时等方面的差异。
【问题讨论】:
-
你能解释一下
fail_timout=0吗? -
"fail_timeout=0 意味着我们总是重试上游,即使它未能返回良好的 HTTP 响应(以防 Unicorn master 核对单个 worker 超时)。"
-
The docs 说:如果组中只有一个服务器,则忽略max_fails、fail_timeout和slow_start参数,永远不会认为这样的服务器不可用。