博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通用网关协议
阅读量:5086 次
发布时间:2019-06-13

本文共 4309 字,大约阅读时间需要 14 分钟。

背景

WEB服务是:用户通过浏览器发送请求给WEB服务器,web服务器接收到请求后将用户请求的资源再发送给浏览器,然后浏览器

会展示给用户看。大部分的web服务都是处理静态内容的。但是随着动态资源的出现和流行,简单的处理静态资源的服务已经不能

满足我们的需要,但是常见的WEB服务器又只能处理静态内容,这怎么办。我们可以使用一个外部程序配合web服务来提供动态

资源的访问。当用户发出的请求是一个需要处理的动态内容,我们可以将这个请求发送给第三方程序,由这个第三方程序处理完成

后再发送给web服务器,然后再发送给浏览器展示出来。所以,一个web服务和第三方程序交互的规程就出现了-----通用网关接口。

 

前提知识

HTTP请求

当用户在浏览器输入一串url地址时,到最终页面内容呈现在用户眼前时,这之间的步骤可大致整理如下:

1、用户输出url请求

2、浏览器解析出主机地址并获取其端口号

3、浏览器向这个ip:port发送连接请求(TCP连接的首次握手)

4、建立连接后,浏览器会向服务器发送http请求(有可能会先发送给proxy或gateway,再由它们转发给

服务器,如nginx做反向代理以实现负载均衡)

5、服务器接收到请求后处理相关数据然后返回给浏览器

6、浏览器回去服务器的响应报文

7、浏览器解析并展示内容

8、浏览器关闭连接

以上便是一条http请求的大致过程,理论上所有的http通信都是由tcp/ip承载的,即http使用tcp连接,其保证了在资源传输过程中是可靠的,

不会丢失或损坏的。

注:http和https比较,https就是在http层和tcp层之间接入了一个密码加密层,称之为TLS或SSL,常用于一些支付等安全性要求较高的网站。

注:关于http的性能优化,tcp连接的时延和瓶颈等,之后可能需要另整理一份

 

WEB服务

web服务器是用来运行web服务程序的机器。常见的web服务有apache或nginx。

一个完成的web事物如下:

1)接受一个客户端(浏览器)连接,或者拒绝该客户端的连接并将其关闭。

2)接受请求,从网络中读取一条http请求报文并解析。

3)处理请求,对请求报文进行解析。

4)访问资源,访问报文中指定的资源,有可能是缓存好的html静态页面或图片资源,也有可能是动态资源,如php文件,此时web 

server会通过第三方程序,如php应用程序来处理动态资源然后返回。

5)创建http响应报文,并回送给客户端。

6)纪录事务处理过程,即记log。

 

资源访问

例如:

用户通过浏览器向web服务(如nginx)请求/index.html,那么web服务会去文件系统中找这个文件,发送给浏览器,这是静态资源。

如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简

单处理后交给PHP解析器。此时需要传什么数据/以什么格式传输给php解析器就非常重要。CGI就承担这种功能。当web server收到

index.php这个请求后,会以特定的格式发送给对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初

始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

 

网关协议

CGI通用网关接口

通用网关接口用于初始化软件服务的服务器方接口。这套接口描述了Web服务器与其他软件的通信方式。

CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在

CGI程序与WEB服务器之间传递信息的规程。CGI规范允许WEB服务器执行外部程序,并将他们的输出结果发送给浏览器。CGI

将WEB一组简单的静态的超媒体文档变成一个新的完整的交互式新媒体。通俗的讲,CGI就是一座桥,他把网页和WEB服务器

中的执行程序链接起来,把从HTML接收的指令传递给服务器的执行程序,然后将执行程序执行的结果返回给HTML页面。CGI的

跨平台性极佳,他适用于各种操作系统。

 

工作模式:

CGI的方式在遇到连接请求时(用户请求),先要创建cgi的子进程,激活一个CGI进程,然后再处理请求。处理完毕后再销毁

这个子进程。这就是fork--execute的工作模式。由于这种工作方式,必须不断的创建和销毁进程,他的工作效率就会降低,当用户

请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。

 

工作流程:

  1、浏览器通过HTML表单或超链接请求指向一个CGI应用程序的URL。

  2、服务器接收到请求。

  3、服务器执行所指定的CGI应用程序。

  4、CGI应用程序执行所需要的操作,通常是基于浏览者输入的内容。

  5、CGI应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

  6、网络服务器把结果返回到浏览器中。

 

FastCGI通用网关协议

CGI是为了保证web server传递过来的数据是标准格式的,它是一个协议,是服务端与CGI程序交互的协议。Fastcgi是CGI的更高级的

一种方式,是用来提高CGI程序性能的。FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口,是CGI的升级

 

工作模式:

FastCGI会先fork一个master进程管理器,用来解析配置文件,然后初始化执行环境。然后在fork出多个worker工作进程,工作进程接受

master进程管理器的调度。当请求过来时,master会将请求传递给一个worker进程,然后立即可以接受下一个请求。这样就避免了重复

的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一

些,这样就提高了性能,也节约了资源。

 

工作流程:

  1、Web Server启动时载入FastCGI进程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)

  2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

  3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环

境变量和标准输入发送到FastCGI子进程php-cgi。

  4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,

请求便告处理完成。FastCGI子进程等待处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出。

 

CGI与FastCGI区别:

1、存活时间:CGI进程在处理一个请求后随之销毁,FastCGI是随着WEB服务一直存活在内存中,只要激活即可工作

2、接收方:CGI进程是直接接收并处理请求,FastCGI是由进程管理器接收请求,由worker子进程处理请求

3、资源消耗率:CGI由于要不断的创建和销毁进程,所以资源消耗要比FastCGI要高

4、跨服务器:CGI程序必须与WEB服务器部署在一台服务器上,不能跨服务器使用,FastCGI可以将CGI程序与Web服务分开

 

常见的CGI进程管理器

PHP-CGI

PHP-CGI是PHP自带的FastCGI管理器。PHP-CGI的不足:

1、php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启

2、直接杀死php-cgi进程php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

 

Spawn-FCGI

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,

不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险),

在php 5.3.3中可以直接使用PHP-FPM了。

Spawn-FCGI功能很单一:

1、只管fork进程,子进程挂了,主进程仅仅log记录一次,根本不会重新fork。如果挂掉,只能重启spawn-fcgi

2、不负责子进程中的网络IO,把socket放到指定位置就完了,接下来的事情由被spawn的程序处理

 

PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的。PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理

整合进PHP包中。所以他必须编译安装进PHP后才可以使用。FPM(FastCGI 进程管理器)用于替换 PHP-CGI 的大部分附加

功能,对于高负载网站是非常有用的。它的功能包括:

1、支持平滑停止/启动的高级进程管理功能;

2、可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);

3、stdout 和 stderr 日志记录;

4、在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;

5、文件上传优化支持;

6、“慢日志” – 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;

7、fastcgi_finish_request() – 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);

8、动态/静态子进程产生;

9、基本 SAPI 运行状态信息(类似Apache的 mod_status);

10、基于 php.ini 的配置文件。

 

 WSGI网关接口:参考https://www.biaodianfu.com/cgi-fastcgi-wsgi.html

 

FastCGI原理图

转载于:https://www.cnblogs.com/myeric/p/8920170.html

你可能感兴趣的文章
<s:iterator>的status
查看>>
C++入门--1.0输入输出
查看>>
让搭建在Github Pages上的Hexo博客可以被Google搜索到
查看>>
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段...
查看>>
在WPF控件上添加Windows窗口式调整大小行为
查看>>
背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu
查看>>
打开3389
查看>>
React学习记录
查看>>
nginx常见内部参数,错误总结
查看>>
对象与类
查看>>
《奸的好人2》财色战场----笔记
查看>>
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
.NET下XML文件的读写
查看>>
2009程序员考试大纲
查看>>
Linq to XML
查看>>
[HDOJ3718]Similarity(KM算法,二分图最大匹配)
查看>>
Nexus Repository3安装和maven,npm配置(Linux)
查看>>