一次WEB部署的小收获
本文最后更新于 2024年6月7日 下午
经过几次的WEB的开发,我对WEB项目的开发、部署也算基本了解了。在我的理解中,都是使用语言的框架,例如:Flask
, Django
等,开发一个WEB服务器。之后 Nginx
、Apache
负责代理、分发请求,二者相互配合。这样就可以简单将开发完成的项目部署到公网供大家访问。
但最近我的一个朋友正在着手开发了一个“个人社区”项目,这是一个很普通的WEB项目,使用 Django
进行开发,我负责帮他将项目部署到服务器,在部署前本着先学习一下前人的经验的想法,我搜索了一下关于”Django
部署“的内容,发现所有的帖子不管内容是否相同,但是他们都不约而同的指出需要使用 Django + uwsgi + Nginx
的方式,他们不约而同地指出需要先用一个简单的方式命令行启动uwsgi
进行测试Flask
与uwsgi
的配合是否正常,接着编辑uwsgi
的配置文件,进而配置Nginx
,但是这些帖子只是说出了方法,却没有指明为什么要这样做,往往使人知其然不知其所以然。
本着学习一个知识应该将其彻底弄懂的原则,我进而深究了一小下这背后的道理。
先说结论:“uwsgi
与 Nginx
都不是必须的”。但是这个结论是有前提的,且听我接着说。
想要弄懂这个问题,我见到有一位前辈这样说:“还是先弄懂什么是WEB服务器,什么是WEB框架吧!”,于是我去查了一下这两者的区别,将自己的感悟总结如下:
-
WEB服务器:例如
Nginx
,主要的作用是与客户端之间建立TCP连接,接受和发送HTTP数据包,不负责逻辑的处理。> web服务器封装的是socket。
-
WEB应用服务器:拿到HTTP数据包后,拿到必要的数据,按照逻辑处理数据、请求数据库等。同时可以存在多个WEB应用服务器,每个应用服务器对应一项服务,比如:购物、视频两项服务可以同时由一台物理服务器提供,因为其上运行着两个WEB应用服务器。
-
WSGI协议:Python用于Web开发的协议(用于处理Web服务器和WEB应用服务器的交互信息)。
Web Server Gateway Interface,Web服务器网关接口。
-
WEB框架:把HTTP的请求和响应,根据特定的规则对应到具体的处理函数上。把处理完的结果,传递到模版引擎上,生成HTML作为HTTP响应,返回给客户端。可以说WEB框架是建立WEB应用服务器的工具。
OK,现在我们对于 Nginx
与 Django
的性质都大体上清楚了,可 uwsgi
呢?其实 uwsgi
本质上是一个WEB服务器,他实现了 WSGI
协议,同时他还实现了 uWSGI
协议,通过 uWSGI
协议它可以和 WEB服务器进行数据通信。
uWSGI协议:uWSGI程序实现的一个自有的协议。
所以整体的流程我们就清楚了,整体的架构如下所示:
Nginx
作为WEB服务器负责与客户端通信,之后判断请求类型,静态请求自己处理,拿到资源返回给客户端,动态资源通过uWSGI
协议交给uwsgi
处理。uwsgi
通过WSGI
协议将请求传递给Django
处理Django
按照逻辑处理后将处理结果返回上层。
但按照目前的所诉的:三者各司其职,又怎么能说“uwsgi
与 Nginx
都不是必须的”呢?
- 因为
uwsgi
本身同时也是一个WEB服务器,所以它可以顶替Nginx
,也就是说Nginx
不是必须的,需要他只是因为Nginx
在处理静态资源的效率较高。 - 与此同时,Python的WEB框架,如
Flask
、Django
一般都自带wsgi
服务器,但是性能不好,只作测试用途。所以如果说uwsgi
不是必须的,那么这句话也是成立的。