一、FastCGI是什么?
首先咱们看下CGI,CGI全称为通用网关接口 Common Cateway Interface.用于HTTP服务上的程序服务通讯交流的一种工具,可让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。 CGI程序必须运行在网络服务器上。常见的如php-cgi.exe。是php支持CGI标准的执行档。
CGI的工做原理:每当客户请求CGI的时候,WEB服务器就请求操做系统生成一个新的解释器进程(如php-cgi.exe),当CGI进程完成当前任务结束后,web服务器就会杀死这个进程。
可是CGI接口方式性能较差,因为每次HTTP服务器遇到动态程序都须要重启解析器来执行解析,拿php举例,每个web请求,php都必须从新解析php.ini、从新载入所有dll扩展并从新初始化所有数据结构,你能够想象这样多慢。这在处理高并发的问题时,几乎是不可能的。所以诞生了FastCGI.
因此,CGI解释器的反复加载是CGI性能低下的主要缘由,若是CGI解释器保持在内存中并接受FastCGI进程管理器调度,则能够提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI:是一个可伸缩、高速的在web server和脚步语言间通信的接口。其主要行为是将CGI解释器进程保持在内存中并所以得到较高的性能。
二、FastCGI在web服务器(Nginx)中的工做原理。
(1)、web Sever 启动时载入FastCGI进程管理器,如php的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manger).
(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(在任务管理器中可见多个php-cgi.exe)并等待来自web服务器的链接。启动php-cgi FastCGI进程时,能够配置以TCP协议或socker两种方式启动。
(3)、当客户端请求到达Web Server时,Web Server将请求采用TCP协议或socket方式转发到FastCGI主进程,FastCGI主进程选择并链接到一个CGI解释器(子进程php-cgi.exe)。Web Server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe.
(4)、FastCGI子进程php-cgi.exe完成处理后将标准输出和错误信息从原来的链接原路返回给web server。当FastCGI子进程关闭链接时,请求便处理完成。可是若是在传统的CGI接口中,此时php-cgi子进程便在此退出了。
下图所示的是Nginx+FastCGI的运做过程,脚本程序语言是php.
三、FastCGI的优势
(1)、php脚本运行速度更快,php解释程序被载入内存而不是每次须要时从存储器读取,极大提高了依靠脚本运行站点的性能。
(2)、须要使用的系统资源更少,因为服务器不用每次在须要时都载入php解释程序,你能够将站点的传输速度提高不少而没必要增长cpu负担。
(3)、能够把动态语言和HTTP服务器分离开来,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。多数流行的HTTP服务器都支持FastCGI包括Apache/Nginx/lighttpd等。
(4)、当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。php
用户浏览器发起对网页的访问:http://192.168.1.103/index.php
用户和nginx服务器进行三次握手进行TCP链接(还包括nginx访问控制策略、nginx防火墙等访问控制策略)
第一步:nginx接收到来自服务器的http请求。
第二步:nginx会根据用户访问的URL和后缀对请求进行判断。
(1)、例如客户端访问的index.php,nginx则会根据配置文件中的location进行匹配。
例如:html
server { listen 8054; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
用户访问的是index.php,则会匹配到location ~.php$,这个的含义是对用户经过url访问的资源进行区分大小的匹配,而且访问的资源是以.php结尾的。
这里的 fastcgi_pass 127.0.0.1:9000,表示nginx经过fastcgi的接口将http请求发给127.0.0.1:9000进行处理,这个过程就是上面fastcgi运行原理中的第三部。这里的php脚本解析服务和nginx放在同一个服务器上面。 这里我用的是php返回动态的资源,因此这里的FastCGI进程管理器用的是php-fpm。
(2)、fastcgi_pass将动态资源交给php-fpm后,php-fpm会讲资源转给php脚本解析服务器的wrapper.
(3)、wrapper收到php-fpm转过来的请求后,wrapper会生成一个新的线程调用php动态程序处理脚本并读取返回数据;好比读取mysql数据库,会触发读库操做。
(4)、php会将查询处理获得的结果返回给wrapper,一直返回到nginx。最后Nginx将返回的数据发送给客户端。
参考链接:
https://blog.csdn.net/m136663...
https://blog.csdn.net/riuhaze...
https://www.cnblogs.com/lidab...mysql