一次WEB部署的小收获

本文最后更新于 2024年6月7日 下午

经过几次的WEB的开发,我对WEB项目的开发、部署也算基本了解了。在我的理解中,都是使用语言的框架,例如:Flask , Django 等,开发一个WEB服务器。之后 NginxApache 负责代理、分发请求,二者相互配合。这样就可以简单将开发完成的项目部署到公网供大家访问。

但最近我的一个朋友正在着手开发了一个“个人社区”项目,这是一个很普通的WEB项目,使用 Django 进行开发,我负责帮他将项目部署到服务器,在部署前本着先学习一下前人的经验的想法,我搜索了一下关于”Django 部署“的内容,发现所有的帖子不管内容是否相同,但是他们都不约而同的指出需要使用 Django + uwsgi + Nginx的方式,他们不约而同地指出需要先用一个简单的方式命令行启动uwsgi进行测试Flaskuwsgi的配合是否正常,接着编辑uwsgi的配置文件,进而配置Nginx,但是这些帖子只是说出了方法,却没有指明为什么要这样做,往往使人知其然不知其所以然。

本着学习一个知识应该将其彻底弄懂的原则,我进而深究了一小下这背后的道理。

先说结论:“uwsgiNginx 都不是必须的”。但是这个结论是有前提的,且听我接着说。

想要弄懂这个问题,我见到有一位前辈这样说:“还是先弄懂什么是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应用服务器的工具。

    推荐阅读:What is a Web Framework?

OK,现在我们对于 NginxDjango 的性质都大体上清楚了,可 uwsgi 呢?其实 uwsgi 本质上是一个WEB服务器,他实现了 WSGI 协议,同时他还实现了 uWSGI 协议,通过 uWSGI 协议它可以和 WEB服务器进行数据通信。

uWSGI协议:uWSGI程序实现的一个自有的协议。

所以整体的流程我们就清楚了,整体的架构如下所示:

uwsgi

  • Nginx 作为WEB服务器负责与客户端通信,之后判断请求类型,静态请求自己处理,拿到资源返回给客户端,动态资源通过 uWSGI 协议交给 uwsgi 处理。
  • uwsgi 通过 WSGI 协议将请求传递给 Django 处理
  • Django 按照逻辑处理后将处理结果返回上层。

但按照目前的所诉的:三者各司其职,又怎么能说“uwsgiNginx 都不是必须的”呢?

  • 因为 uwsgi 本身同时也是一个WEB服务器,所以它可以顶替 Nginx ,也就是说 Nginx 不是必须的,需要他只是因为 Nginx 在处理静态资源的效率较高。
  • 与此同时,Python的WEB框架,如 FlaskDjango 一般都自带 wsgi 服务器,但是性能不好,只作测试用途。所以如果说 uwsgi 不是必须的,那么这句话也是成立的。

一次WEB部署的小收获
https://siegelion.cn/2020/10/12/一次WEB部署的小收获/
作者
siegelion
发布于
2020年10月12日
许可协议