uWSGI、uwsgi、WSGI、之间的关系
①WSGI:全称是Web Server Gateway Interface,WSGI不是服务器、python模块、框架、API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。server和application的规范在PEP中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle,Flask,Django。
②uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是FCGI协议的10倍快。
③uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。
一、WSGI 协议
是一种协议规范,起到规范参数的做用,就像告诉公路同样,规定超车靠右行,速度不低于90km/h,等。但这一切都是对双方进行沟通,好比重庆到武汉这条高速路,这儿重庆和武汉就各为一端,他们之间的行车规范就按照WSGI规则便可。如今须要记住,WSGI沟通的双方是wsgi server (好比uWSGI) 要和 wsgi application(好比django )
wsgi server (好比uWSGI)实现wsgi协议规范的服务器咱们叫作wsgi服务器,也就是uWSGI服务器,wsgi application(好比django )实现wsgi协议的应用,咱们叫作wsgi应用,好比Django,Falsk
二、uWSGI
是一个web服务器,或者wsgi server服务器,他的任务就是接受用户请求,因为用户请求是经过网络发过来的,其中用户到服务器端之间用的是http协议,因此咱们uWSGI要想接受而且正确解出相关信息,咱们就须要uWSGI实现http协议,没错,uWSGI里面就实现了http协议。因此如今咱们uWSGI能准确接受到用户请求,而且读出信息。
如今咱们的uWSGI服务器须要把信息发给Django,咱们就须要用到WSGI协议,恰好uWSGI实现了WSGI协议,因此。uWSGI把接收到的信息做一次简单封装传递给Django,Django接收到信息后,再通过一层层的中间件,因而,对信息做进一步处理,最后匹配url,传递给相应的视图函数,视图函数作逻辑处理,而后将处理后的数据经过中间件一层层返回,到达Djagno最外层,而后,经过WSGI协议将返回数据返回给uWSGI服务器,uWSGI服务器经过http协议将数据传递给用户,这就是整个流程
这个过程当中咱们彷佛没有用到uwsgi协议,可是他也是uWSGI实现的一种协议,鲁迅说过,存在即合理,因此说,他确定在某个地方用到了。咱们过一会再来讨论nginx
咱们能够用这条命令:python manage.py runserver,启动Django自带的服务器。DJango自带的服务器(runserver 起来的 HTTPServer 就是 Python 自带的 simple_server)。是默认是单进程单多线程的,对于同一个http请求,老是先执行一个,其余等待,一个一个串行执行。没法并行。并且django自带的web服务器性能也很差,只能在开发过程当中使用。因而咱们就用uWSGI代替了。可是uWSGI也不够好
三、为何有了uWSGI为何还须要nginx
由于nginx具有优秀的静态内容处理能力,而后将动态内容转发给uWSGI服务器,这样能够达到很好的客户端响应。支持的并发量更高,方便管理多进程,发挥多核的优点,提高性能。这时候nginx和uWSGI之间的沟通就要用到uwsgi协议。
django 的并发能力真的是使人担心,这里就使用 nginx + uwsgi 提供高并发。
nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地方,因为其底层使用 epoll 异步IO模型进行处理,使其深受欢迎服务器。
uWSGI做为一款优秀的python应用服务器,更擅长处理动态请求,实际开发中一般用nginx处理静态请求,动态请求转发给uWsgi服务器处理。如下图所示
nginx作为web服务器有以下特点:
- 它处理静态文件和索引文件效果非常高,配合uWSGI服务器会更加安全;
- 它的设计非常注重效率,最大支持 5 万个并发连接,但只占用很少的内存空间;
- 稳定性高,配置简洁
- 强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用
而uWsgi服务器虽然也能够处理静态请求,但效率远不如nginx,并且从安全性和可扩展性方面来讲,使用nginx+uwsgi是最佳方式。所以,一般python后端开发一般采取nginx+uwsgi+Django/Flask应用的方式部署。
Python须要使用nginx + uwsgi 提供静态页面访问,和高并发多线程
php 须要使用 nginx + fastcgi 提供高并发,
java 须要使用 nginx + tomcat 提供 web 服务
Python由于GIL的存在,在一个进程中,只容许一个线程工做,致使单进程多线程没法利用多核
多进程的线程之间不存在抢GIL的状况,每一个进程有一个本身的线程锁,多进程多GIL
四、可以用一个例子来进行说明
Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Django来处理这个请求。
WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给django处理。
django:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。
WSGI:Alright,那我等你。
django:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。
WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。
Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现