我见过两种使用 Gunicorn 和 nginx 托管 django 应用程序的策略。
一种策略是在网络端口上运行 Gunicorn。例如(来自goodcode https://goodcode.io/articles/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;
}
}
认为哪种策略更优越?对于每一项的正确方法有什么评论吗?我倾向于套接字方法,因为我认为开销是由 TCP 引入的。我最关心的是我见过的实现示例之间关于标头、连接超时等的差异。
除了 TCP/IP 开销较小之外,没有太大区别。每个listen()套接字都会获得一个连接队列,而accept()只是从该队列中弹出一个连接。在 Gunicorn 中,每个工作人员都会尽可能地从该队列中弹出一个新连接,这样就不会改变。区别在于性能(套接字更快一点)和可移植性(端口:IP 更灵活)。 Unix 域套接字将为您提供更好的性能,而连接到 localhost 的套接字将为您提供更好的可移植性,如果您将服务器应用程序移动到不同的操作系统,您只需将 IP 地址从 localhost 更改为不同的主机名即可做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)