前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >协议:WSGI,uWSGI,Nginx,CGI协议简介

协议:WSGI,uWSGI,Nginx,CGI协议简介

作者头像
Freedom123
发布2024-03-29 15:05:16
1010
发布2024-03-29 15:05:16
举报
文章被收录于专栏:DevOpsDevOps

简介

当咱们部署完一个应用程序,浏览网页时具体的过程是怎样的呢?首先咱们得有一个 Web 服务器来处理 HTTP 协议的内容,Web 服务器得到客户端的请求,交给应用程序,应用程序处理完,返回给 Web 服务器,这时 Web 服务器再返回给客户端。Web 服务器与应用程序之间显然要进行交互,这时就出现了不少 Web 服务器与应用程序之间交互的规范,最先出现的是 CGI,后来又出现了改进 CGI 性能的FasgCGI,Java 专用的 Servlet 规范,Python 专用的 WSGI 规范等等。有了统一标准,程序的可移植性就大大提升了。

WSGI 全称是 Web Server Gateway Interface,也就是 Web 服务器网关接口,它是 Python 语言定义出来的 Web 服务器和 Web 应用程序之间的简单而通用的接口,基于现存的 CGI 标准设计,后来在不少其余语言中也出现了相似的接口。 总的来讲,WSGI 能够分为服务器和应用程序两个部分,实际上能够将 WSGI 理解为服务器与应用程序之间的一座桥,桥的一边是服务器,另外一边是应用程序。

按照 web 组件分类,WSGI 内部能够分为三类,web 应用程序,web 服务器,web 中间件。应用程序端的部分经过Python 语言的各类 Web 框架实现,好比 Flask,Django这些,有了框架,开发者就不须要处理 WSGI,框架会帮忙解决这些,开发者只需处理 HTTP 请求和响应,web 服务器的部分就要复杂一点,能够经过 uWSGI 实现,也能够用最多见的 Web 服务器,好比 Apache、Nginx,但这些 Web 服务器没有内置 WSGI 的实现,是经过扩展完成的。如 Apache,经过扩展模块 mod_wsgi 来支持WSGI,Nginx能够经过代理的方式,将请求封装好,交给应用服务器,好比 uWSGI。uWSGI 能够完成 WSGI 的服务端,进程管理以及对应用的调用。WSGI 中间件的部分能够这样理解:咱们把 WSGI 看作桥,这个桥有两个桥墩,一个是应用程序端,另外一个是服务器端,那么桥面就是 WSGI 中间件,中间件同时具有服务器、应用程序端两个角色,固然也须要同时遵照 WSGI 服务器和 WSGI 应用程序两边的限制和须要

Flask 依赖的 Werkzeug 就是一个 WSGI 工具包,官方文档的定义是 Werkzeug 是为 Python 设计的 HTTP和 WSGI 实用程序库。咱们须要注意的是,Flask 自带的 Werkzeug 是用来开发的,并不能用于生产环境,Flask 是 Web 框架,而 Werkzeug 不是 Web框架,不是 Web 服务器,它只是一个 WSGI 工具包,它在 Flask 的做用是做为 Web 框架的底层库,它方便了咱们的开发。dj

一、wsgiref

代码语言:javascript
复制
wsgiref则是官方给出的一个实现了WSGI标准用于演示用的简单Python内置库,
它实现了一个简单的WSGI Server和WSGI Application(在simple_server模块中),
主要分为五个模块:simple_server, util, headers, handlers, validate

二、cgi

代码语言:javascript
复制
公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。
CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。
格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。
几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、Java、VB 和Delphi 等。
CGI分为标准CGI和间接CGI两种。
标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。
间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入输出进行通信 。

CGI是外部扩展应用程序与 Web 服务器交互的一个标准接口。
服务器端与客户端进行交互的常见方式多,CGI 技术就是其中之一。
根据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作。
CGI规范定义了Web服务器如何向扩展应用程序发送消息,在收到扩展应用程序的信息后又如何进行处理等内容。
对于许多静态的HTML网页无法实现的功能,通过 CGI可以实现,比如表单的处理、对数据库的访问、搜索引擎、基于Web的数据库访问等等.

使用CGI实现客户端与服务器的交互有以下几个标准步骤,具体步骤如下:
(1)Web 客户端的浏览器将URL的第一部分解码与Web服务器相连。
(2)Web 浏览器将URL的其余部分提供给服务器。
(3)Web 服务器将URL转换成路径和文件名。
(4)Web 服务器发送 HTML 和别的组成请求页面的文件给客户。一旦页面内容传送完,
这个连接自动断开。
(5)在客户端,HTML脚本提示用户做动作或输入。当用户响应后,客户请求Web服务器建立一个新的连接。
(6)Web 服务器把这些信息和别的进程变量传送给由HTML以URL的形式指定CGI程序。
(7)CGI 根据输入作出响应,把响应结果传送给 Web 服务器。
(8)Web 服务器把响应的数据传给客户,完成后关闭连接。 
服务器端 CGI 程序接收信息有三种途径:环境变量、命令行和标准输入。

三、FastCGI

代码语言:javascript
复制
fastcgi 这个技术标准作为一种替代 cgi 的技术标准, fastcgi 有如下优点(稳定,安全,高性能,方便扩展)

从稳定性上看, fastcgi 是以独立的进程池运行来 cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.
从安全性上看, fastcgi 和宿主的 server 完全独立, fastcgi 怎么 down 也不会把 server 搞垮,
从性能上看, fastcgi 把动态逻辑的处理从 server 中分离出来, 大负荷的 IO 处理还是留给宿主 server, 这样宿主 server 可以一心一意作 IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态 IO 处理完全不需要逻辑程序的参与
从扩展性上讲, fastcgi 是一个中立的技术标准, 完全可以支持任何语言写的处理程序(php,java,python...)

四、WSGI

代码语言:javascript
复制
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 已基本达成它的可移植性方面的目标。
WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
WSGI标准在 PEP 333 [1]  中定义并被许多框架实现,其中包括现广泛使用的django框架。

五、uWSGI

代码语言:javascript
复制
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。

uWSGI的适用:
1.单节点服务器的简易部署
2.轻量级,好部署

**为什么不用uWSGI作为唯一服务器: **

  1. 安全问题,程序不能直接被浏览器访问到, 而是通过nginx,nginx只开放某个接口, uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。
  2. 负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行, 毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
  3. 静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为, 而且他们本身对文件的处理也不如nginx好, 所以整个静态文件的处理都直接由nginx完成, 静态文件的访问完全不去经过uwsgi以及其后面的东西。

六、uwsgi

代码语言:javascript
复制
与WSGI一样,是uWSGI服务器的独占通信协议,用于定义传输信息的类型。

每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。

七、uWSGI与uwsgi区别

代码语言:javascript
复制
uWSGI是一个 Web 服务器,它实现了WSGI 协议、uwsgi、http 等协议。
注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的Web 服务器。
uWSGI 具有超快的性能、低内存占用和多app 管理等优点,并且搭配着 Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署。
相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

七、WSGI / uwsgi / uWSGI 区分

代码语言:javascript
复制
WSGI是一种通信协议。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

**nginx、WSGI、uwsgi、uWSGI的区别: **

wsgi 本身不是服务器,也不是python模块,只是一种协议,链接着server 和 App,描述两者之间的规则

uwsgi 和wsgi一样是通信协议,是uWSGI服务器的单独形式,用于自定义传输类型

uWSGI 是一个web服务器,实现了WSGI协议,uwsgi协议

nginx web服务器,更加安全,更好的处理静态资源,缓存功能,负载均衡,配合uWSGI服务器会更加安全

八、Nginx

代码语言:javascript
复制
nginx是一个开源的,支持高性能,高并发的代理服务软件,nginx不但是一个优秀的web服务软件,还可以作为反想代理和负载均衡,以及缓存服务或使用

nginx是一个开源的高性能的HTTP服务器和反向代理:
1.作为web服务器,它处理静态文件和索引文件效果非常高;
2.它的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间;
3.稳定性高,配置简洁;
4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用。

ginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反向代理功能。

nginx的作用:
1.反向代理,可以拦截一些web攻击,保护后端的web服务器
2.负载均衡,根据轮询算法,分配请求到多节点web服务器
3.缓存静态资源,加快访问速度,释放web服务器的内存占用,专项专用

Nginx特性:

  • 支持高并发,能支持几万个并发链接;
  • 资源消耗少,三万并发编程开启10个nginx线程消耗不到200m;
  • 可以做反向代理和负载均衡;
  • 支持异步网络io事件模型epoll;

九、Nginx和uwsgi

代码语言:javascript
复制
1.使用的代理一共有两个,nginx和uwsgi,先说明一下,如果不用nginx一样可以访问web项目,使用nginx的目的是为了安全和负载均衡。配置了nginx做前端代理,uwsgi作后端代理的服务器(这里所说的前后端都是相对的位置,并无实际含义),在处理来自Internet的请求时,要先经过nginx的处理,nginx把请求再交给uwsgi,经过uwsgi才能访问到项目本身。

2.没有nginx而只有uwsgi的服务器,则是Internet请求直接由uwsgi处理,并反馈到web项目中。nginx可以实现安全过滤,防DDOS等保护安全的操作,并且如果配置了多台服务器,nginx可以保证服务器的负载相对均衡。
而uwsgi则是一个web服务器,实现了WSGI协议(Web Server Gateway Interface),http协议等,它可以接收和处理请求,发出响应等。所以只用uwsgi也是可以的。

十、nginx和uWISG 服务器之间如何配合工作的?(重点)

首先浏览器发起http请求到nginx服务器,Nginx根据接收到请求包,进行url分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器,如果请求的是动态资源就转交给uwsgi服务器,uwsgi服务器根据自身的uwsgi和WSGI协议,找到对应的Django框架,Django框架下的应用进行逻辑处理后,将返回值发送到uwsgi服务器,然后uwsgi服务器再返回给nginx,最后nginx将返回值返回给浏览器进行渲染显示给用户。

nginx和uWSGI 的消息流转:

  1. nginx接收到浏览器的http请求,将包进行解析,分析url,
  2. 如果是静态文件直接访问用户给nginx配置静态文件目录,
  3. 如果不是静态文件,是一个动态请求,nginx会转发给uwsgi,
  4. uwsgi接到请求会进行处理成wsgi可以接受的形式,并发给wsgi,
  5. wsgi根据请求调用应用程序的某个文件,
  6. 某个文件的某个函数处理完会返回给wsgi,
  7. wsgi将返回值进行打包,
  8. 打包成uwsgi能够接受的格式,
  9. uwsgi接受wsgi的发送请求,
  10. 转发给nginx,nginx最终将返回值返回给浏览器

其他

参考:https://www.jianshu.com/p/9df42347a286

https://www.cnblogs.com/guojieying/p/13741333.html

http://www.noobyard.com/article/p-coxdupld-by.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 一、wsgiref
  • 二、cgi
  • 三、FastCGI
  • 四、WSGI
  • 五、uWSGI
  • 六、uwsgi
  • 七、uWSGI与uwsgi区别
  • 七、WSGI / uwsgi / uWSGI 区分
  • 八、Nginx
  • 九、Nginx和uwsgi
  • 十、nginx和uWISG 服务器之间如何配合工作的?(重点)
  • 其他
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档