在讲述什么是WSGI前,我们先来看一下客服端对网站发起请求的流程是怎样的。
图片来自 https://www.toptal.com
我们可以看到流程是这样的:
1.客服端向web server发起请求
2.web server 接收到请求,把请求发送到对应的web app
3.web app将请求进行处理
4.处理完后推给server端
5.server端对客服端返回请求
6.客服端加载内容完毕
为什么web要分不同端?不能直接就一个端吗?
简单的说,是为了解耦,server端与web端要完成的任务不同,从而可以让不同类型的开发者,只针对自己的业务进行开发优化,而不需要考虑他不需要知道的东西。另外,这样可以更好地支持分布式架构的开发以及理解。
其实,你可以直接写成一个端,就像为什么要把代码写成方法的道理一样。
不同端间的协议说明
server端以及app端都各有不同的框架实现,为了降低开发者的学习成本,所以不同端的框架之间的通信应当保持一个统一的标准。不然用不同的框架要学不同的标准,不会崩溃么?
一、客户端向web server端请求
客户端和web server端间交互的标准,叫网络协议,主要利用的是大名鼎鼎的TCP/IP协议。相信这个大家都知道的,就算不知道也听过的
当然还有其他网络协议。。但本文并不是为了探讨网络协议,所以只讲寻常使用的网络协议。
二、web server 与web app端的交互
那web server 与web app端的交互的标准又是什么呢?
那就是本文的标题,WSGI协议,他是属于server端与app端的之间的通信协议。
三、web server端与web server端的交互
如果有所了解的话,你会发现存在server端之间交互的情况,那server端之间的交互又是什么协议呢。server端之间的方式我现在接触到的有两种:
1.uwsgi协议,是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,用于与nginx等代理服务器通信,它与WSGI相比是两样东西。
- http协议,其中一个server端是另外一个server端的客户端。
那python的框架对应的server端以及app端都有什么呢?
我们用一张图来展示吧
简易图
其中,nginx与不同框架间用的协议会有所不同,这里就不细写了,可以去看看对应框架的官方文档。
为什么有了server端了,还要前面挂一个Nginx?
因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。如果网站没有什么访问量,不用也是可以的
总结
大家发现图上有一个uWSGI没有?uwsgi,WSGI,uwsgi晕了没?
总结一下
协议名 | 解释 |
---|---|
WSGI | server端与app端之间的交互协议 |
uwsgi | server端与server端之间的交互协议 |
uWSGI | 是web服务器,它实现了WSGI协议、uwsgi、http等协议 |
python有一个uWSGI框架就叫uWSGI,所以我把uWSGI服务器叫server端,不用混淆
一个网站的响应,是需要有一个web server以及web app端。而常用的Django以及flask只提供了一个简易的server端在开发时候做简易测试,官方不建议线上使用。而tornado是一个完整的web框架,既有server也有app端,也可以拆出来,例如用tornado的server端做flask的server端。
曾经有一个朋友问我,为什么他的flask在本地测试的时候是可以访问的,到了生产环境就不行,我问了一下,你有用nginx或者Apache吗?有挂uWSGI吗?
网友评论