uWsgi为什么要结合nginx去部署python应用

uWsgi为什么要结合nginx去部署python应用?

WSGI: Web Server Gateway Interface, 是一个接口,定义web server 如何转发请求到python应用。这样,只要实现web server都可以调用遵守此接口的任何python应用

uWsgi: 实现了WSGI的一个中间件
uWsgi 是实现了WSGI接口的,一个完整实现http server,可以直接部署python应用,但是为何还要用nginx呢
因为nginx擅长高并发,静态文件,gzip压缩等,这些功能uWsgi不具备,如果网站访问量不大,完全可以只用uWsgi。

nginx + uWsgi 组合使用原理
nginx 来完成proxy(反向代理),静态文件等服务。动态请求转发给uWsgi调用python应用。nginx与uWsgi通过uwsgi(全部小写)协议来完成,uwsgi是一个二进制协议,允许uWsgi 与 nginx等应用服务器交互,python代码里包括了wsgi app和简易的http server(不建议用于线上环境)

比如在flask 中的 app = Falsk(name) 这个app就是个wsgi app, 他只是一个callable 对象,传入一个wsgi请求,返回一个wsgi 的响应,想象成一个函数就好了,接收一个参数,返回一个结果

一般的web框架还会提供一个简易的http server, 比如在flask 中app.run(), 其实就是启动了一个http server, 这个http server 做的事情就是监听端口,把http 请求转换为wsgi的请求,传递给wsgi app 处理,再把wsgi app 返回的wsgi 响应转换为http 响应,返回给客户端

至于nginx, 其实就是扮演了一个http server 的角色,就像flask 内置的http server 一样,但是提供更多的功能,也有更强的性能和稳定性。nginx可以
通过如下方式调用wsgi app:

  1. 插件, 就是nginx 用一个插件来在http 和 wsgi 协议之间做转换
  2. 自己再提供一个http server, nginx负责转发,把http 转换成wsgi
    uWsgi为什么要结合nginx去部署python应用