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内置库
cgi,fastcgi,wsgi,uWSGI,uwsgi,wsgiref 简单介绍
最新推荐文章于 2023-05-25 05:34:16 发布