fastcgi,Fastcgi漏洞

http://www.itjxue.com  2023-01-08 01:25  来源:未知  点击次数: 

跟我学Nginx,配置 FastCGI 代理

CGI 全称 "通用网关接口"(Common Gateway Interface),用于 HTTP 服务器与其它机器上的程序服务通信交流的一种工具,CGI 程序须运行在网络服务器上。

传统 CGI 接口方式的主要缺点是性能较差,因为每次 HTTP 服务器遇到动态程序时都需要重启解析器来执行解析,然后结果被返回给 HTTP 服务器。这在处理高并发访问几乎是不可用的,因此就诞生了FastCGI。另外传统的 CGI 接口方式安全性也很差。

FastCGI 是一个可伸缩地、高速地在 HTTP 服务器和动态脚本语言间通信的接口(FastCGI 接口在 Linux 下是 socket(可以是文件 socket,也可以是 ip socket)),主要优点是把动态语言和 HTTP 服务器分离开来。多数流行的 HTTP 服务器都支持 FastCGI,包括 Apache、Nginx 和 lightpd。

同时,FastCGI 也被许多脚本语言所支持,比较流行的脚本语言之一为 PHP。FastCGI 接口方式采用 C/S 架构,可以将 HTTP 服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当 HTTP 服务器每次遇到动态程序时,可以将其直接交付给 FastCGI 进程执行,然后将得到的结构返回给浏览器。这种方式可以让 HTTP 服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

FastCGI 的重要特点:

Nginx 可用于将客户端请求路由到 FastCGI 服务器,这些 FastCGI 服务器是使用各种框架和编程语言(如:PHP)构建的应用程序。

与 FastCGI 服务器一起使用的最基本的 nginx 配置包括使用 fastcgi_pass 指令而不是 proxy_pass 指令,以及 fastcgi_param 指令来设置传递给 FastCGI 服务器的参数。

假设 FastCGI 服务器可在 localhost:9000 上访问。 以上一节中的代理配置为基础,将 proxy_pass 指令替换为 fastcgi_pass 指令,并将参数更改为 localhost:9000。在 PHP 中,SCRIPT_FILENAME 参数用于确定脚本名称,QUERY_STRING 参数用于传递请求参数。生成的配置如下:

上面配置将设置一个 server,该 server 将通过 FastCGI 协议将除静态图像请求之外的所有请求路由到 localhost:9000 上运行的代理服务器。

关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?

fastcgi是一个通用网关接口,用于web服务器(iis, apache)和应用程序通信。

php-cgi是php平台的cgi程序

以上两个结合,可以使php整合在web服务中

php-fpm是一个独立的php-fcgi管理软件,它要整合进web服务中,需要使用代理模式

一般与nginx搭配。也可以与apache搭配

php-fpm一般不直接作为服务容器提供外网访问,而是通过常用web容器作代理

php作为服务器端的解析程序,运行模式分很多种,fastcgi, mod_php, proxy(代理)等。

与iis搭配时一般采用fast-cgi模式,iis自带fast-cgi引擎,配置好php参数即可

与apache搭配,在windows平台下,一般也是fast-cgi模式,在linux系统中一般是mod_php模式,把php作为一个子模块加载

也可以配置php-fpm 然后在apache中配置代理模式

与nginx搭配,一般就是用php-fpm+代理模式了

Nginx配置里的Fastcgi是干啥用的?

前一段时间又重读了《HTTP权威指南》一书,觉得有一些理论知识还是蛮重要的,需要进行一番整理,让自己之后对整条web链路有个更清晰的认识。

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

1)用户输入 。

2)浏览器解析出主机名。

3)浏览器查询这个主机名的ip地址如192.168.0.1(即dns解析)并获得端口号如80

4)浏览器发起到192.168.0.1:80的连接。(tcp连接握手)

5)浏览器向服务器发送一条http get或post报文。(有可能会先发送给proxy或gateway,再由它们转发给服务器,如nginx做反向代理以实现负载均衡)

6)浏览器从服务器读取http响应报文。

7)浏览器关闭连接。

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

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

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

web服务器可以用来表示web服务器的软件,也可以表示提供web页面的特定设备或机器。这边主要是指通用软件web服务器,如apache或nginx。

《http权威指南》中有一份用perl脚本写的web服务器的源码,实现了最简单的收发客户端报文的功能。

当然,实际的web服务器比这要复杂的多,核心步骤整理如下:

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

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

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

4)访问资源,访问报文中指定的资源,有可能是缓存好的html静态页面或图片资源,也有可能是动态资源,如php文件,此时web server会通过fastcgi请求php应用程序以此产生动态资源,下面会详细讲。

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

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

讲Fastcgi之前需要先讲CGI,CGI是为了保证web server传递过来的数据是标准格式的,它是一个协议,方便CGI程序的编写者。Fastcgi是CGI的更高级的一种方式,是用来提高CGI程序性能的。

web server(如nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态资源。

如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。此时CGI便是规定了要传什么数据/以什么格式传输给php解析器的协议。

当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

那么CGI相较于Fastcgi而言其性能瓶颈在哪呢?CGI针对每个http请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。

而Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。注:swoole作为httpserver,实际上也是类似这样的工作方式。

那PHP-FPM又是什么呢?它是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。现已在PHP内核中就集成了PHP-FPM,使用--enalbe-fpm这个编译参数即可。另外,修改了php.ini配置文件后,没办法平滑重启,需要重启php-fpm才可。此时新fork的worker会用新的配置,已经存在的worker继续处理完手上的活。

FastCGI错误如何解决?

FastCGI经理无法处理请求

////////////////////////////////////////

错误细节:

超出的FastCGI过程配置了活动暂停

错误数字:

258

(0x80070102)。

误差描述:

被计时的等待操作。

HTTP错误500

-服务器错误。

互联网信息服务(IIS)

cgi、fastcgi、php-cgi、php-fpm异同

1. cgi

? ? - 通用网关接口,就是外部应用程序(cgi程序)与web服务器之间的接口标准。

? ? - nginx是内容分发者,如果是请求index.php,根据配置文件内容得知不是静态文件,就会去找对应的cgi程序进行解析

? ? - cgi就是规定要传那些数据,以什么格式传递给后方进行处理的协议

? ? - cgi工作模式,一个请求发送过来,启动cgi解释器(创建进程)- 逻辑处理 - 退出 (fork and exec 模式) 每次都需要重新创建进程,加载配置,浪费系统资源

2. fastcgi

? ? - 快速通用网关接口,常驻型的cgi,不用每次都fork进程,其会使cgi解解释器进程常驻内存,所以性能较高

? ? - master-worker模型,服务器启动时载入fastcgi进程管理器

? ? - fastcgi会进行自身初始化,初始化时会创建多个进程

? ? - 请求到达web服务器后,fastcgi进程管理器会选择并通过socket连接到一个cgi解释器

3. php-cgi

? ? - php自带的cgi管理器

? ? - php-cgi的缺点,不能平滑重启,需要重启php-cgi才能使php.ini生效

4. php-fpm

? ? - php-fpm是php的一种fastcgi的实现,管理php的fastcgi进程池

? ? - 能够调度php-cgi程序

? ? - 能够实现平滑重启

? ? - php-fpm创建一个master进程,然后创建进程池,监听socket,fork出多个子进程,子进程各自accept请求,php-fpm的子进程同时只能响应一个请求,处理完一个请求才可以accept下一个请求,多进程,同步阻塞模型

? ? - master和worker进程之间不直接进行通信,master通过共享内存获取worker进程信息,master进程发送信号通知worker进程

? ? - php-fpm可以同时监听多个端口,每个端口对应一个worker pool

? ? - worker是cgi程序,php-fpm是fastcgi协议的php是实现

什么是FastCGI?

PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec。FastCGI应用速度很快 是因为他们持久稳定。不必对每一个请求都启动和初始化。这使得应用程序的开发成为可能,否则在CGI范例是不切实际的(例如一个大型的脚本,或者一个需要 连接单个或多个数据库的应用)。1. FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。2. FastCGI 可在任何平台上使用,Netscape Enterprise 及 IIS 都有 FastCGI 的模块可供使用,阿帕契 (Apache,以及利用 Apache 衍生出做的服务器) 上也有 mod_fastcgi 可用。3. FastCGI 支持 C/C++、Java、PHP、Python、Ruby、Perl,Tcl 等程序语言。4. FastCGI 的应用程序亦兼容于 CGI。即 FastCGI 的应用程序也可以当成 CGI 来执行。5. 现有的 CGI 程序要改写成 FastCGI 非常简单,最少可能只需要多加入三行程序代码。6. FastCGI 的侦错方式与 CGI 大同小异,只要带入程序所需的环境变量及参数,即可在命令列模式执行或侦错。7. FastCGI 应用程序的写作方式与 CGI 类似,除了几项原则要特别注意外,FastCGI 的写作方式跟 CGI 几乎一样,与学习 Web Server API 比较起来, FastCGI 简单多了。8. FastCGI 支授分布式运算 (distributed computing),即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。好处1. PHP脚本运行速度更快(3到30倍)。PHP解释程序被载入内存而不用每次需要时从存储器读取,极大的提升了依靠脚本运行的站点的性能。2. 需要使用更少的系统资源。由于服务器不用每次需要时都载入PHP解释程序,你可以将站点的传输速度提升很高而不必增加cpu负担。因为dll文件不再每次都载入了,那么数据库的持久连接也将可以起到它设计初的效果。3. 不需要对现有的代码作任何改变。潜在问题1. 对所有的子目录(/home/USERNAME/public_html/php.ini)你只有一个可用的php.ini文件。这是优化网站代码所必需的。如果你需要多个php.ini文件以适应不同的脚本需要,你可以在任何子目录禁用PHP的快速CGI,而其余的地方则继续有效。2. 你对PHP环境做的任何升级(如php.ini文件的改变)都有几分钟的延迟。这是因为为了更快的速度 你的php.ini文件已经被载入内存,而不是每次需要时再从存储器重新读取。

(责任编辑:IT教学网)

更多

相关网络工程师文章

推荐网络工程师文章