作者:Devopsontheroad
资料来源:https://www.cnblogs.com/FLY_DREAM/p/15635690.html
在学习Pythonweb开发时,您可能会遇到Engels和WSGI等名词。让我们通过梳理和总结来探究它们之间的关系。
CGICGI(公共网关接口)是一种通用网关接口,是外部应用程序(CGI程序)和网络服务器协议定义了网络服务器调用外部应用程序时需要输入的参数,以及向web服务器返回的结果。
一般来说,它指定程序如何与web服务器程序通信,以便程序可以在web服务器上运行。
起源
最早的web服务器只是响应浏览器发送的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,即静态HTML。这种场景中的服务器通常称为HTTP服务器,常见的是Apache的httpd和Nginx。
随着科技的不断发展,事情总是越来越复杂。但是,服务器不能直接运行PHP和ASP等文件。你不能自己做。将其外包给其他人,但与第三方达成协议。我给你的,然后你给我的,是保存请求参数并将它们发送给你,然后我将你的处理结果接收给客户端。
该协议是通用网关接口,简称CGI。该协议可以在VB、C、PHP和python中实现。CGI只是一种接口协议,根本不是一种语言。
CGI的引入使得客户端请求可以触发web服务器运行另一个外部程序,客户端输入的数据也将传输到外部程序。程序运行后,生成的HTML和其他数据将通过web服务器返回给客户端(即动态请求,例如基于PHP、Python和Java的应用程序)。动态信息可以根据CGI的各种变化返回给客户端。
工作原理
web服务器与CGI程序的交互
web服务器将根据CGI程序的类型确定数据到CGI程序的传输模式。通常,它通过标准的输入/输出流和环境变量使用CGI程序传输数据。如下图所示:
CGI程序通过标准输入(stdin)和标准输出(stdout)输入和输出。此外,CGI程序还通过环境变量获取输入。操作系统提供了许多环境变量,这些变量定义了程序的执行环境,应用程序可以访问这些变量。web服务器和CGI接口还设置了一些环境变量,以便将一些重要参数传递给CGI程序。
通用CGI环境变量:
变量名 | 描述 |
---|---|
CONTENT式 | 此环境变量的值指示所传递信息的MIME类型。目前环境变量CONTENT:一般来说,类型是:application/x-www-form-andyLau。他说数据来自html表单。 |
CONTENT | |
COOKIE | 客户COOKIE所容纳之物 |
HTTP_uu用户uu代理 | 提供包含版本数或其他专有数据的客户端浏览器信息。 |
路径信息 | 此环境变量的值表示CGI程序名之后的其他路径信息。它通常作为CGI程序的一个参数出现。 |
QUERY | |
REMOTE地址 | 此环境变量的值是发送请求的客户端的IP地址,如上面的192.168.1.67。这个值总是存在的。此外,它是web客户端需要向web服务器提供的唯一标识。它可以用来区分CGI程序中的不同web客户端。 |
REMOTE主持人 | |
REQUEST方法 | 提供调用脚本的方法。对于使用HTTP/1.0协议的脚本,只有get和post才有意义。 |
SCRIPT_文件名 | CGI脚本的完整路径 |
SCRIPT名字 | CGI脚本的名称 |
服务器名称 | 这是web服务器的主机名、别名或IP地址。 |
服务器_软件 | 此环境变量的值包含调用CGI程序的HTTP服务器的名称和版本号。例如,上面的值是Apache/2.2.14(Unix) |
每当客户机请求CGI时,web服务器都会请求操作系统生成新的CGI解释器进程(例如phpCGI.exe)。CGI进程在处理一个请求后退出,然后在下一个请求到来时创建一个新进程。
当然,当访问次数较少且没有并发性时,也可以这样做。然而,当访问次数增加且存在并发性时,这种方法不适用,因此存在fastcgi
FastCGIFastcgi是web服务器(例如Nginx)和语言解释器(例如uwsgi)底层通信协议的规范。它是CGI的开放扩展。
CGI的扩展,就像一个长寿的CGI,废除了CGI叉-“andexecute”的工作模式(请求被分叉,处理一个新进程,然后在处理后终止该进程)变成了一种长寿命的方法,从而减少了进程消耗,提高了性能。
Fastcgi将首先分叉一个主进程,解析配置文件,初始化执行环境,然后分叉多个工作进程(有点像Nginx)。当HTTP请求到来时,主进程会将其传递给一个工作进程,然后下一个请求可以立即被接受,从而避免重复初始化操作,效率自然会提高。
此外,当辅助进程不足时,主进程还可以根据配置提前启动多个辅助进程;当有太多空闲工作进程时,一些进程将被关闭,这不仅提高了性能,还节省了系统资源
PhpfpmFastcgi只是一个协议规范,需要在每种语言中实现,Phpfpm是Php版本中fastcgi协议的实现,用它实现了PHP脚本与web服务器(通常是Nginx)之间的通信。同时,它也是一个PHPSAPI,以便在PHP解释器和web服务器之间搭建一座桥梁。
PHPFPM的全名是PHPfastcgiprocessmanager,即PHPfastcgiprocessmanager。与fastcgi对CGI的静态唤醒相比,FPM可以根据访问压力动态激发和破坏CGI进程,动态调整CGI的数量,从而有效地利用内存。
此外,还有其他优势。例如,FPM可以平滑地重载PHP配置;因为FPM使用UNIX-socket与服务器通信,无需配置CGI端口;FPM有更好的状态输出和slowlog日志,并且可以在502处提供更多错误详细信息。
Phpfpm负责管理一个进程池,以处理来自web服务器的HTTP动态请求。在phpfpm中,主进程负责与web服务器通信,接收HTTP请求,然后将请求转发给工作进程进行处理。worker进程主要负责动态执行PHP代码,并在处理后将处理结果返回给web服务器,然后web服务器将结果发送给客户端。这就是phpfpm的工作原理
WSGI/uwsgi/uWSGI在里面python在web开发中,我们经常使用uwsgi与Nginx合作部署一个web框架,例如Django或flask。同时,我们会说框架和web服务器应该遵守WSGI协议。
让我们澄清这些概念。
Web服务器和Web框架
在讨论Marx和WSGI之前,我们首先应该了解web开发的两个部分,网络服务器和网络框架。
Web服务器是一个用于接受客户端请求、建立连接和转发响应的程序。至于转发的内容,则留给web框架来处理,也就是说,处理这些业务逻辑。如查询数据库、生成实时信息等。Nginx是网络服务器Django还是瓶子是网络框架。
那么,如何实现uWSGI与WSGI的合作呢?任何web服务器如何与任何框架匹配?这就产生了WSGI协议。只要web服务器和web框架满足WSGI协议,它们就可以相互匹配。所以WSGI只是一个协议,一个约定。而不是Python模块、框架和其他特定功能。
Marx是一个实现WSGI协议的web服务器。也就是说,用于接受客户端请求并转发响应的程序。事实上,uWSGI的web服务器加上Django这样的web框架,已经可以实现网站的功能。
WSGI
WSGI,(网络服务器网关接口)是一个web服务器网关接口,是一个web服务器网关接口。它是web服务器(如Nginx、uWSGI等服务器)与web应用程序(如flash框架编写的程序)之间通信的规范。目前,运行在WSGI协议上的web框架包括bolt、flask、,德扬戈
实现了Pythonweb程序与服务器交互的通用性。有了这个东西,webPythonweb开发框架(如py、Vattle或Django)可以轻松地部署在不同的web服务器上,而无需任何特殊配置(以及一些小的配置调整)
WSGI协议实际上定义了一种服务器和应用程序脱钩也就是说,可以有多个服务器实现WSGI服务器,也可以有多个框架实现WSGI应用程序。然后,您可以选择服务器和应用程序的任意组合来实现自己的web应用程序。
例如,Marx和gunicorn都是实现WSGI服务器协议的服务器。Django和flask是实现了WSGI应用协议的web框架,可以根据项目的实际情况一起使用。
与Django一样,flask框架有自己的简单WSGI服务器,通常用于服务器调试。建议在生产环境中使用其他WSGI服务器。WSGI服务器有很多选择,包括Marx和gunicorn
uwsgi
它是一种类似WSGI的通信协议
uwsgi协议是uWSGI服务器拥有的协议。它用于定义传输的信息类型。前4个uwsgi包字节对于传输信息类型的描述,它与WSGI相比是两件事。
Max(服务器)
它是一个web服务器,实现WSGI协议、Engels、HTTP和其他协议。它用于接收前端服务器转发的动态请求,并在处理后将其发送到web应用程序。
因为Apache和Nginx都没有解析PHP等动态语言的功能,但它们被分配到了其他模块。例如,Apache可以说内置了PHP模块,这非常酷,让人觉得Apache支持PHP。uwsgi实现了WSGI协议、uwsgi协议、HTTP协议等。《Nginx》中httpuwsgimodule的角色是与uWSGI服务器进行交换。
uWSGI是用C写的,他展示了自己的uwsgi协议web服务器。它有丰富的组件,其中核心组件包括过程管理、监控工控机以及其他功能,以实现应用服务器接口的请求插件,并支持多种语言和平台,如WSGI、rack卢阿网络管理组件WSAPI实现了负载均衡、代理和推理功能
uWSGI也可用作中间件。
如果是Nginx+uWSGI+应用,uWSGI就是一个中间件
如果是Marx+应用,则是服务器
Nginx+uwgsi
假设我们使用Python的Django框架来编写一个网站,现在要将其挂在Internet上,我们通常需要:
作为代理服务器,Nginx负责发送静态资源(JS、CSS、图片等)、转发动态请求和回复结果。
Marx作为后端服务器,负责接收Nginx转发的请求,处理后发送给Django应用,接收Django应用返回信息,转发给Nginx。
收到请求后,Django应用程序处理数据,并将相应的返回页面呈现给服务器。
Django应用程序通过WSGI协议连接Marx服务器。Marx服务器实现WSGI、HTTP等协议,通过uwsgi协议和Nginx服务器实现HTTP动态请求、转发和结果
问:有了uwgsi,Django为什么还需要Nginx?
一个普通的个人网站,只需少量访问,当然可以由uWSGI和德扬戈组成。然而,一旦流量过大,客户端将不得不等待很长时间才能请求连接。就在这个时候分布式服务器,我们可以有更多的web服务器来处理请求。
但是谁来分配客户端的请求连接和web服务器呢?Nginx就是这样一个管家的存在,谁来分发呢。这是Nginx实现的反向代理,即代理服务器。
Nginx是一个HTTP和反向代理服务器
转发代理:转发是指浏览器主动向代理服务器发送请求,由代理服务器处理,然后传输到目标服务器
反向代理:相反,无论浏览器是否同意,请求都将由代理服务器处理,然后发送到目标服务器
将Nginx用作反向代理服务器的好处:
安全
任何请求都必须通过代理服务器,它可以防止外部程序直接攻击web服务器
负载平衡
根据请求和服务器负载,将请求分发到不同的web服务器,以确保服务器性能
提高web服务器的IO性能
请求从客户端传输到web服务器需要时间。只要进程被传输,它就会被阻止。通过反向代理,反向代理可以完全接受请求,然后将其传输到web服务器,从而确保服务器性能。此外,一些简单的事情(如静态文件)可以由反向代理直接处理,而无需web服务器
总结
WSGI是一种通信协议
Engels是一种通信协议,通常用于Marx服务器和其他网络服务器之间的数据通信
Marx是一个实现Engels和WSGI协议的web服务器
百度百科全书说,uwsgi是一个线路协议,而不是一个通信协议。个人倾向于认为uwsgi是一种类似于WSGI的通信协议。uwsgi和WSGI是在CGI的基础上进行扩展的。
阿斯吉异步网关协议接口,网络协议服务和python应用程序之间的标准接口,可以处理各种常见的协议类型,包括HTTP、http2和websocket。
然而,目前常用的WSGI主要是针对HTTP风格的请求-响应模型设计的,越来越多不遵循这种模型的协议已经逐渐成为web的标准之一,比如websocket。
Asgi试图维护一个简单的应用程序接口,并提供一种抽象,即任何应用程序进程都可以随时发送和接受允许数据。它还描述了一种与HTTP请求-响应和websocket数据帧兼容的新序列格式。允许这些协议可以通过网络或本地socket传输,不同的协议可以分配给不同的进程。
WSGI和asgi之间的差异
WSGI基于HTTP协议模式,不支持websocket。Asgi的诞生是为了解决Python中常用的WSGI不支持当前web开发中的一些新协议标准的问题。同时,asgi支持WSGI的原始模式和websocket的扩展,即asgi是WSGI的扩展。
参考资源https://www.cnblogs.com/wanghetao/p/3934350.html
https://baike.baidu.com/item/fastcgi/10880685
https://www.jianshu.com/p/679dee0a4193
https://baijiahao.baidu.com/s?id=1590941335729952485&wfr=蜘蛛&;for=pc
https://blog.csdn.net/qq_35318838/article/details/61198183
最新评论