【相关的基础知识】
《【架构】了解常见的软件架构》
《【架构】分布式系统及相关技术栈初了解》 (*重要)
1)为什么是nginx+gunicorn+django架构?
我们在部署 flask、django 等 python web 框架(站点)时,通常有两种选择方式,nginx+django+uwsgi或者django+nginx+gunicorn。(在linux下通常都使用nginx,因为速度快,还经常做代理服务器,功能强大。)
网上最多的教程就是 nginx+gunicorn/uwsgi 的部署方式,那为什么要这么部署呢?
1、首先了解一下相关概念:
-
WSGI:
这里必须要知道的一个概念,WSGI,web service gateway interface(网络服务网关接口)。它不是 web server,也不是 web application,它是架在 server 和 application 之间的一种协议和规范。
- WSGI 的目的就是解耦 web server 和 web application,它包括两个部分,server 和 application,server 用来接收 web 客户端的请求,application 用来接收 server 传来的请求,然后传给 web server。
- 关于WSGI的详细说明可参考:https://zhuanlan.zhihu.com/p/95942024
此协议是Python语言的专利,它定义了一组在Web服务宿主程序和HTTP响应代理程序之间通信的普遍适用的接口。
- 它的产生是因为Python程序员注意到,对于Web框架和Web宿主服务器程序间,有严重的耦合性,比如说,某些框架是针对Apache的mod_python设计的。于是,WSGI就定义了一套非常低级别的接口。
- 常见的Python Web框架都实现了这个协议:如 CherryPy, Django, web.py, web2py, TurboGears, Tornado, Pylons, BlueBream, Google App Engine[dubious – discuss], Trac, Flask, Pyramid,等等.
- 关于网关协议CGI/FCGI/SCGI/WSGI对比可参考:https://landybird.github.io/python/2017/09/19/Django%E9%83%A8%E7%BD%B2/
-
gunicorn/uWSGI:
gunicorn 和 uWSGI 就是实现了 WSGI 协议的 web server。
而 flask、django 等 web 框架也是用的 wsgi 协议,所以需要在 web framework 之前加上 gunicorn 或者 uwsgi。话说回来,python web 框架都自带 wsgi 服务器,为什么还要这俩呢?一句话,性能太差,只能用于开发环节。
- 关于uWSGI和nginx可移步《【实战学习(五)】开源项目学习之uWSGI的部署以及配合nginx》
*wsgiref模块(django 框架自带)
django 框架自带的wsgiref模块是用于测试和学习的简单的WSGI服务器模块。
- 这个模块监听8000端口,把Http请求,根据WSGI协议,转换application函数中的environ参数,然后调用application函数。
- wsgiref会把application函数提供的响应头设置转换为HTTP协议的响应头,把application的返回(return)作为响应体,根据HTTP协议,生成响应,返回给浏览器。
django自带wsgi server vs 部署uwsgi+nginx后的性能对比可参考:https://www.shuzhiduo.com/A/GBJrnnQEJ0/
-
nginx:
Nginx是俄罗斯人Igor Sysoev编写的轻量级Web服务器 ,它不仅是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡服务器。
- 在性能上:Nginx占用很少的系统资源,能支持更多的并发连接(能支持高达50,000个并发连接数),达到更高的访问效率
- 在功能上:Nginx是优秀的代理服务器和负载均衡服务器
- 在安装配置上:Nginx安装简单、配置灵活
- 特点:占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好
- Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。
对于大多数使用者来说,Nginx只是一个静态文件服务器或者http请求转发器,它可以把静态文件的请求直接返回静态文件资源,把动态文件的请求转发给后台的处理程序,例如php-fpm、apache、tomcat、jetty等,这些后台服务,即使没有nginx的情况下也是可以直接访问的(有些时候这些服务器是放在防火墙的面,不是直接对外暴露,通过nginx做了转换)。
- 想要深入了解,可移步