cgi,fastcgi,wsgi,uWSGI,uwsgi,wsgiref 简单介绍


CGI(Common Gateway Interface)通用网关接口:
    早期Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI,简单理解,可以认为CGI是Web服务器和运行其上的应用程序进行“交流”的一种约定。
	CGI是Web服务器和一个独立的进程之间的协议,它会把HTTP请求Request的Header头设置成进程的环境变量,HTTP请求的Body正文设置成进程的标准输入,进程的标准输出设置为HTTP响应Response,包含Header头和Body正文。
	只要编程语言具有标准输入、标准输出和环境变量,就可以用来编写CGI程序。
	每次用户请求动态脚本,Web服务器都要重新Fork创建一个新进程去启动CGI程序,由CGI程序来处理动态脚本,处理完成后进程随之关闭,其效率是非常低下的。	

FastCGI
FastCGI是Web服务器与处理程序之间通信的一种协议,是CGI的改进版本。FastCGI就是常驻型的CGI,可以一直运行。在请求到达时不会耗费时间去Fork创建一个进程来处理。FastCGI是语言无关的、可伸缩架构的CGI开放扩展,它将CGI解释器进程保持在内存中,因此获得较高的性能。
=================================================================================


WSGI是一种通信协议。

uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。


WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。
WSGI规定:
	1. 应用程序需要是一个可调用的对象
		在Python中:
			--可以是函数
			--可以是一个实例,它的类实现了__call__方法
			--可以是一个类,这时候,用这个类生成实例的过程就相当于调用这个类
	2. 可调用对象接收两个参数
		--def application(environ, start_response):
    		  return [HELLO_WORLD]

		--class Application:
    		def __init__(self, environ, start_response):
        		pass
			def __iter__(self):
        		yield HELLO_WORLD

		--class ApplicationObj:
    		def __call__(self, environ, start_response):
        		return [HELLO_WORLD]

	3.可调用对象要返回一个值,这个值是可迭代的
		
		HELLO_WORLD = b"Hello world!\n"

	4.服务器程序需要调用应用程序
	def run(application):
        environ = {}

        def start_response(status, response_headers, exc_info=None):
            pass

        result = application(environ, start_response)

        def write(data):
            pass

        for data in result:
            write(data)
	WSGI规定了应用程序需要一个可调用对象,有两个参数,返回一个可迭代对象。在服务器 程序		中,针对这几个规定,做了以下几件事:
            把应用程序需要的两个参数设置好
            调用应用程序
            迭代访问应用程序的返回结果,并将其传回客户端


WSGI
WSGI是一种通信协议。WSGI 不是框架,也不是一个模块,而是介于 Web应用程序(Web框架)与 Web Server 之间交互的一种规范。只要大家都遵循WSGI规范实现 Web 框架,就可以 使用 Gunicorn 来运行

WSGI 规定了Web服务器(Server)和应用程序(Application)双方各自需要实现什么接口,以便两者能完美的配合使用,这个和 USB Type-C 规范很像, 只要手机和充电线都遵循了 Type-C 接口规范, 大家的充电线就可以复用,不同的是充电谁快谁慢的问题,而苹果没有遵循Type-C规范,所以只有他自家的线才能充苹果手机。

一个完整的 Web 应用包含两部分,一个是服务器程序(Server),一个是应用程序(Application),服务器程序负责接收浏览器发送过来的请求,应用程序负责处理具体的业务逻辑。 比如我基于 Django 框架开发一个博客应用,部署在生产环境时会用 Gunicorn 或者 Uwsgi 作为服务器程序。

Python 中 Web 框架非常多,Flask、Django、Bottle、Pyramid、Tornado 等等,甚至你也自己也可以造一个 Web 框架,那么这么多框架,为什么他们都可以用 Gunicorn 或者 Uwsgi 来部署呢?

答案就是 WSGI 规范。

uwsgi
uwsgi是一个二进制协议,能够携带任何类型的信息。uwsgi数据包的前4个字节用于描述信息的类型。uwsgi协议主要工作在TCP方式下。uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。 

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uwsgi数据包头

Struct uwsgi_packet_header{
uint8_t modifier1;
uint16_t datasize;
uint8_t modifier2;
}; 



uWSGI
uWSGI是一个快速的、自维护、对开发者和系统管理者友好的应用程序容器,是纯c语言开发的服务器。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

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

对于管理人员来说,uWSGI服务器提供了各种配置方法:命令行、环境变量、XML、INI、YAML、JSON、SQlite3数据库和LDAP。

除此之外,它的设计完全模块化,这意味着,可以使用不同的插件以便满足不同的技术应用,从而实现兼容性

=================================================================================
wsgiref则是官方给出的一个实现了WSGI标准用于演示用的简单Python内置库


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值