Nginx/fastCGI/CGI/php-fpm的学习

参考:https://www.cnblogs.com/skynet/p/4173450.html
Nginx是什么?
Nginx(“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

Php-fpm是什么
cgi、fast-cgi协议
cgi的历史
早期的webserver只处理html等静态文件,但是随着技术的发展,出现了像php等动态语言,webserver处理不了了,那就交给php解释器来处理。
交给php解释器处理很好,但是,php解释器如何与webserver进行通信?
为了解决不同的语言解释器(如PHP、python解释器)与webserver的通信,于是出现了cgi协议。只要你按照cgi协议去编写程序,就能实现语言解释器与webserver的通信。如php-cgi程序。

fast-cgi的改进
有了cgi协议,解决了php解释器与webserver通信的问题,webserver终于可以处理动态语言了。但是webserver每收到一个请求,都会去fork一个cgi进程,请求结束在kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次。
这样很浪费资源,于是出现了cgi的改良版本,fast-cgi。fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了,大大提高了效率。

php-fpm是什么
php-fpm即php-Fastcgi Process Manager.
php-fpm是FastCGI的实现,并且提供了进程管理的功能。
进程包含master进程和worker进程两种进程。
mater进程只有一个,负责监听端口,接收来自webserver的请求,而worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都要嵌入了一个PHP解释器,是PHP代码真正执行的地方。
总结:Nginx不只有处理http请求的功能,还能做反向代理。Nginx通过反向代理功能将动态请求转向后端php-fpm。

nginx和php-fpm的结合,完整的流程是:

  1. www.example.com。
  2. Nginx。
  3. 路由到www.example.com/index.php。
  4. 加载nginx的fast-cgi模块。
  5. fast-cgi监听127.0.0.1:9000地址。
  6. www.example.com/index.php请求到达127.0.0.1:9000。
  7. php-fpm监听127.0.0.1:9000。
  8. php-fpm接收到请求,启动worker进程处理请求。
  9. php-fpm处理完请求,返回给nginx。
    10.nginx将结果通过http返回给浏览器。

CGI
通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI独立于任何语言的,CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在系统上运行。
CGI是93年由美国国家超级电脑应用中心为NCSA HTTPd web服务器开发的。这个Web服务器使用了Unix shell环境变量来保存从web服务器传递出去的参数,然后生成一个运行CGI的独立的进程。cgi的处理流程:
10. web服务器接收到浏览器的请求http request,启动CGI程序,并通过环境变量、标准输入传递数据。
11. CGI进程启动解析器、加载配置、连接其他服务器(如数据库服务器)、逻辑处理等。
12.CGI进程将处理结果通过标准输出、标准错误,传递给web服务器。
12. web服务器接收到CGI返回的记过,构建http response返回给客户端,并杀死cgi进程,web服务器与cgi通过环境变量、标准输入、标准输出、标准错误互相传递数据。
环境变量
GET请求,他将数据打包放置在环境变量QUERY_STRING中,CGI从环境变量QUERY_STIRNG中获取数据。
标准输入
环境变量的大小是由一定的限制的,当需要传送的数据量大时,存储环境变量的空间可能会不足,造成数据接收不完全,甚至无法执行CGI程序。因此后来又发展出另外一种方法:POST,也就是利用IO重新导向的技巧让CGI程序可以由STDIN和STDOUT直接跟浏览器沟通。
当我们指定用这种方法传递请求数据时,web服务器收到数据后会先放在一块输入缓冲区中,并且将数据的大小记录在CONTENT_LENGTH这个环境变数,然后利用CGI程序并将CGI程序的STDIN指向这块缓冲区,于是我们就可以很顺利的通过STDIN和环境变量CONTENT_LENGTH得到所有的资料,再没有资料大小的限制了。

总结:CGI使外部程序与Web服务器之间交互称为可能。CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。
FastCGI
快速通用网关接口(Fast Common Gateway Interface /FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于奸杀Web服务器与CGI程式之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。

当进来一个请求时,web服务器把环境变量和这个页面请求通过一个unix domain socket(都位于同一物理服务器)或者一个IP Socket(FastCGI部署在其他物理服务器)传递给FastCGI进程。
FastCGI处理流程:

  1. Web服务器启动时载入初始化FastCGI执行环境。例如IIS ISAPI、 apache mod_fastcgi、nginx ngx_http_fastcig_module、lighttpd mod_fastcgi。
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web服务器的连接。启动FastCGI进程时,可以配置以IP和Unix域socket两种方式启动。
  3. 当客户端接收到web服务器时,web服务器将请求采用socket方式转发到FastCGI主进程,FastCGI主进程选择并连接到一个CGI解释器。Web服务器将CGI环境变量标准输入发送到FastCGI子进程。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一个socket连接返回Web服务器。当FastCGI子进程关闭连接时,请求变处理完成。
  5. FastCGI子进程接着等待并处理来自Web服务器的下一个连接。

总结:由于FastCGI程序并不需要不断的产生新进程,可以大大降低服务器的压力并且产生较高的应用效率。他的速度效率最少好比CGI技术提高5倍以上。他还支持分布式的部署,即FastCGI程序可以在Web服务器以外的主机上执行。CGI就是所谓的短生存期应用程序,FastCGI就是所谓的长生存期应用程序。FastCGI像是一个常驻型的CGI,他可以一直执行着,不会每次都要话费时间去fork一次,这是CGI最为人诟病的fork-and-execute模式。

FastCGI相对于CGI的优点:(如果有说错漏说的,还望指正一下)

  1. 最明显的就是CGI是那种web服务器来一个请求,就会产生一个CGI的处理进程,逻辑处理结束之后就会杀死该进程。但是FastCGI是管理一个进程池,当webserver收到一个请求的时候,会以socket的形式发送个FastCGI进程管理器,FastCGI把发来的环境变量和标准输入发给FastCGI子进程。子进程处理结束之后,不会结束,而是死循环一直等服务器发来处理请求。
  2. CGI进程不会共享资源,FastCGI把环境变量和标准输入都给自己的子进程去处理。可以共享环境变量。
  3. CGI进程是由webserver进行管理的,但是FastCGI自己是进程管理器,管理子进程。和webserver是分开的。中间通过socket通信。
  4. FastCGI可以分布式部署。可以不在webserver本机上。
  5. CGI是接收到请求时才会启动CGI进程,FastCGI会在一开始就启动好的。
    Nginx cgi/fastcgi
    nginx不能像apache那样直接执行外部可执行程序,但ngixn可以作为代理服务器,将请求转发给后端服务器,这也是nginx的主要作用之一。其中nginx就支持FastCGI代理,接收客户端的请求,然后将请求转发给后端fastcgi进程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值