Nginx+uWSGI部署Python Web应用
web开发的过程中一定会遇到 cgi、wsgi 之类的名词,然后看着他们十分相似的解释估计还没开始写代码就晕了,这都什么鬼? 今天我就聊聊这些容易搞混的名称。
CGI(Common Gateway Inteface)
字面的意思就是通用网关接口,它是外部应用程序与Web服务器之间的接口标准,规定一个程序该如何与web服务器之间通信。当然,CGI只是一个很基本的协议,在现代常见的服务器结构中基本已经没有了它的身影,更多的是它的扩展和更新
原理篇
假如我们使用python的Flask框架写了一个网站,现在我们要把它部署到公网上,我们一般需要一下几步:
1.nginx作为反向代理服务器:负责静态资源的发送(js、css、图片等)、动态请求的转发以及结果的回复。
2.uWSGI作为后端服务器:负责接收nginx请求转发并处理后发给Flask应用以及接受Flask应用返回信息转发给ngixn。
3.Flask作为web应用程序:负责接收请求后处理数据并渲染相应的返回页面给uWSGI服务器
接下来的协议及接口就应用在以上三者之间:
uwsgi:应用于前端server(nginx)与后端server(uWSGI)的通信中,制定规范等等,让前后端服务可以理解对方在说什么。
WSGI:它是用在python web框架编写的应用程序与后端服务之间的规范(也就是flask与uWSGI之间),让你的应用程序可以与后端服务器顺利通信。在WSGI出现之前你不得不专门为某个后端服务而写特定的API,并且无法更换后端服务器,而WSGI就是一种统一规范,所有使用WSGI的服务器都可以运行使用WSGI规范的web框架,反之亦然。
uWSGI: 是一个Web应用服务器(或者说是一个进程),它实现了WSGI协议、uwsgi、http等协议。 用于接收前端服务器转发的动态请求并处理后发给 web 应用程序(这里也就是Flask应用程序)。
对于CGI,我认为在 CGI 制定的时候也许没有考虑到现代的架构,所以他只是一个通用的规范, 而后来的 WSGI 也好 Fastcgi 也好等等这些都是在 CGI 的基础上扩展并应用于现代Web Server不同地方的通信规范, 所以我在图中将 CGI 标注在整个流程之上。
做为一个 Python Web 开发者,我们最关注的是 WSGI 这里所做的事, 了解熟悉这里的规范不仅可以让我们更快速的开发 Web 应用同时我们也可以自己实现一个后端 Server
最后总结一下这几个名词:
WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information), 每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分
WSGI是一种通信协议。uwsgi同WSGI一样是一种通信协议。而uWSGI是实现了uwsgi和WSGI两种协议的Web应用服务器。
实现篇
目前常见的部署python web应用程序方案是:
1.Apache + mod_wsgi
2.Nginx + gunicorn
3.Nginx + uwsgi
以下使用nginx+uwsgi部署一个flask应用,其中nginx作用是反向代理