在杜赛的博客中,对Django+Nginx+Gunicorn这三兄弟的描述是这样的:
- 客户端发来 http 请求,Nginx 作为直接对外的服务器接口,对 http 请求进行分析
- 如果是静态资源请求,则由Nginx自己处理(效率极高)
- 如果是动态资源请求,则把它转发给 Gunicorn
- Gunicorn 对请求进行预处理后,转发给 Django,最终完成资源的返回
如果用餐馆来做比喻的话,Nginx 就是迎宾小姐,客人如果点了酒水,迎宾小姐自己就帮忙拿了;而 Gunicorn 是传菜员,Django 是厨师,他两一起满足客人对现炒美食的需求。
这个比喻具体是在说什么呢?
首先,我们要分清楚Web应用和Web服务器这两个概念。Django开发出来的程序是Web应用,它本身不能起到监听用户请求并响应这种 “收发员” 的功能。监听用户请求并响应是Web服务器的职责。
Nginx就是一个Web服务器。即使没有web应用运行,只有一大堆 html 静态页面,我们也可以通过配置路由和返回的页面来使用Nginx搞出一个静态网站。
Django开发的Web应用本身是没有和客户端(浏览器)交互的功能的。我们在本地能够运行它是只是因为Django其内置了一个小型Web服务器而已,不过它性能受限,不能用于生产环境。
那么将Nginx和Django组合是不是就大功告吉了呢?没那么简单。Python官方定义了WSGI(Web Server Gateway Interface)作为Web服务器与Python Web应用程序或框架之间的建议标准接口。这样可以提高Web应用程序和服务器之间的可移植性。显然Django需要一个实现WSGI的服务器来和它配合。然而Nginx作为一个普通的http服务器,并没有实现这个接口。
这可以通过两种方式变通:
-
使用插件,在http和wsgi协议间做转换,使得Nginx也可以对接Django
-
Nginx有组织服务器集群的能力。因此可以派遣能理解WSGI的其他web服务器代理自己去完成需要和Django打交道的工作。
这里使用的是第二种途径。Gunicorn是一个遵循WSGI的Web服务器。Nginx可以在需要和Django打交道的时候把任务交给Gunicorn处理,而在不需要的时候自己解决就行。在我们的情况下就是 /static 和 /media 这种静态资源由 Nginx 自行快速响应,其他请求通过socket传送给Gunicorn,Gunicorn通过WSGI和Django通信并返回动态响应。这就是为什么说传菜员Gunicorn和厨师Django他俩一起满足顾客对现炒美食的需求。
server {
charset utf-8;
listen 80;
server_name 118.31.35.48; # 改成你的 IP
location /static {
alias /home/sites/dusaiphoto.com/django_blog_tutorial/collected_static;
}
location /media {
alias /home/sites/dusaiphoto.com/django_blog_tutorial/media;
}
location / {
proxy_set_header Host $host;
proxy_pass http://unix:/tmp/118.31.35.48.socket; # 改成你的 IP
}
}
其实Gunicorn本身不需要Nginx的带领也是可以独立运作的,但是它的性能比较差因此不推荐这么做。Gunicorn的官方文档也强烈推荐把Gunicorn部署在如Nginx这样的代理服务器的后方,以防止安全问题。
Deploying Gunicorn
We strongly recommend using Gunicorn behind a proxy server.
Nginx Configuration
Although there are many HTTP proxies available, we strongly advise that you use Nginx. If you choose another proxy server you need to make sure that it buffers slow clients when you use default Gunicorn workers. Without this buffering Gunicorn will be easily susceptible to denial-of-service attacks. You can use Hey to check if your proxy is behaving properly.
参考好文:











网友评论