客户端发出请求==>服务器接受、处理请求与响应 的过程示意图
1. WSGI:
全称是
Web Server Gateway Interface(服务器网关接口)
。WSGI
不是服务器,python
模块,框架,API
或者任何软件,只是一种规范( 是一个**Web服务器(如nginx)与应用服务器(如uWSGI)**通信的一种规范(协议)==> 可以理解为服务器与应用程序通信的接口规范要求),描述web server
如何与web application
通信的规范。server
和application
的规范在PEP 3333中有具体描述。因为WSGI没有官方的实现, 所以WSGI更像一个协议,只要遵照这些协议,都可以在任何服务器(Server)上运行
2.uwsgi:
与
WSGI
一样是一种通信协议,是uWSGI
服务器的独占协议,用于定义传输信息的类型(type of information
),每一个uwsgi packet
前4byte
为传输信息类型的描述,与WSGI协议是两种不同的协议。该协议据说性能非常高,是fcgi
协议的10倍快;而且内存占用率低,为mod_wsgi
的一半左右,同时它还支持多应用的管理及应用的性能监控
3.uWSGI:
是一个
web
服务器,而且也可以当做中间件。它实现了WSGI
协议、uwsgi
协议、http
协议等。在生产环境中使用uWSGI作为python web的服务器,可以用来托管 Python WSGI应用。它具有应用服务器,代理,进程管理及应用监控等功能(但可以把看作是一个应用程序,帮助我们实现WSGI协议),这样我们可以不再关注网络通信的底层实现,将精力更多放在处理HTTP请求数据,返回HTML。
4.uWSGI+nginx
综上所述可以看出uWSGI可以直接当做服务器,而为了进一步的并发提升就需要加上nginx(提高负载均衡)
▲.当uWSGI+nginx使用时,nginx作为web服务器,而uWSGI作为中间件(这边不一定正确,个人理解)
uWSGI不足的地方:
-
uWIGS也可以返回静态文件(css,js,img…),但是很笨拙,所以更好的做法是用反向代理服务器(比如Nginx)来处理此类请求,减轻应用服务器的负载,获得更好的性能。
- 利用uWIGS可以是我们的web应用得到更强的并发能力,uWIGS也可以返回静态文件(css,js,img…),但是很笨拙,一般静态文件都交由Nginx进行传输,所以配置中一般不配置static-map,如果直接由uWIGS接受HTTP请求则需要设置http:xxxx,如果只需要与反向代理服务器进行交互则只需要接受socket,uWIGS与Nginx交互相当于两个进程间交互,一般使用的是.sock文件或者指定端口接受socket。指定端口时再使用浏览器访问相应端口,uWIGS会提示skip,跳过该HTTP请求。
-
同时还有的是uWSGI本身的负载均衡没有nginx牛逼。所以阉割掉不用。
5.Nginx是一个Http和反向代理服务器
什么是反向代理服务器呢?
▲正向的就是由浏览器主动的想代理服务器发出请求,经代理服务器做出处理后再转给目标服务器
▲反向的就是不管浏览器同不同意,请求都会经过代理服务器处理再发给目标服务器
这其中的区别就是必须经过Nginx反向代理服务器,这就有了使用Nginx的几个好处:
-
安全:不管什么请求都要经过代理服务器,这样就避免了外部程序直接攻击web服务器
-
负载均衡:根据请求情况和服务器负载情况,将请求分配给不同的web服务器,保证服务器性能
-
提高web服务器的IO性能:这个我也没看懂,总结来说就是请求从客户端传到web服务器是需要时间的,传递多长时间就会让这个进程阻塞多长时间,而通过反向代理,就可以在反向代理这完整接受请求,然后再传给web服务器,从而保证服务器性能,而且有的一些简单的事情(比如静态文件)可以直接由反向代理处理,不经过web服务器
总结
Author: Mrli
Link: https://nymrli.top/2018/11/02/WSGI-uWSGI-uwsgi及nginx说明/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.