nginx是俄罗斯人Igor Sysoev编写的一个轻量级的HTTP服务器,它是一个高性能的HTTP和反向代理服务器,特别适合于高并发IO密集型的web服务。
由于nginx采用了Linux的epoll网络IO模型,而Apache采用的是传统的Select模型,因此在高并发IO的情况下,nginx的表现要远远优于apache。
apache不仅可以处理静态文件,也可以通过模块的方式执行如php等的脚本文件。而nginx很简单,只能处理静态文件,对于php等的脚本文件,只能交由CGI、FastCGI、Apache等执行,然后返回结果。
这里重点介绍下FastCGI。
CGI是“通用网关接口(Common Gateway Interface)”的简称,它可以接收Web服务器的请求,执行相关的处理程序,然后返回数据给Web服务器,Web服务器最后再返回数据到用户。它独立于具体的语言,所以CGI可以用任何语言来编写,只要这种语言具有标准输入、输出和环境变量,例如php、perl、tcl等。
FastCGI是CGI的一种改进方案,CGI的缺陷在于当一个请求过来之后都需要fork一个进程来处理请求(fork-and-execute模式),这种CGI程序的反复加载导致了性能的低下。FastCGI是一种常驻的CGI,它可以一直运行,并且根据当前的服务压力,可以动态调整CGI解释器进程的数量。FastCGI启动后先进行自我初始化,开启多个CGI进程,轮番让空闲的CGI进程接收及响应请求。FastCGI有自己的内存管理机制,启动后一直停留在内存中,但处于挂起状态,只有HTTP请求时,FastCGI才会响应执行,完成后断开链接,继续挂起。
一般情况下,FastCGI的工作流程:
(1)FastCGI进程管理器启动后进行自身初始化,并且启动多个CGI解释器进程并等待来自Web服务器的请求。
(2)当客户端请求到达Web服务器时,FastCGI选择并连接到一个CGI解释器,Web服务器将CGi环境变量和标准输入发送到FastCGI子进程php-cgi;
(3)FastCGI子进程完成处理后将标准输出和错误信息从统一连接返回Web服务器,当FastGI子进程关闭连接时,请求便处理完成。