• 通用网关协议


    背景

    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原理图

  • 相关阅读:
    认识 liunx 文件属性
    laravel 配置mongodb 出现 Database [text] not configured 问题【已解决】
    php 判断字符串的长度的两种方法
    php 循环里面套sql怎么解决
    php 给入门新手们填的第一个坑
    Vue 调用其他Vue或自己Vue中的方法时,this指向不生效
    绑定点击事件触发多次
    computed 计算属性的获取和设置
    el-Cascader 最后一项删不掉
    前端 --- 格式化的配置
  • 原文地址:https://www.cnblogs.com/myeric/p/8920170.html
Copyright © 2020-2023  润新知