nginx是怎么把请求转发给php的?

佛家有人生三重境界之说,即:“看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水。反观学习的各种东西,有那一个不是如此呢。
初入门的时候,被问到服务器是怎么解析php的,会很自信的回答,nginx把请求交给php,php把执行结果返回给nginx然后响应给浏览器。这样的回答,应该是没有
任何问题的。但是请求是怎么交给php的呢?当时忙碌在每天的业务代码中,无暇也无心来关注这些。

哪现在再遇到这样的问题呢

  • 1,php是这么和nginx接受nginx的请求的 ?
  • 2,当项目需要多个php版本共存的时候该怎么做 ?

要理解nginx怎么转发请求的,需要了解几个概念,Cgi,FastCgi,这些概念不只局限于nginx-php,linux里的进程通信大都基于此。

什么是Cgi,FastCgi,php-fpm ?

CGI

CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

FastCGI

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的。

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。

在安装时,./configure的时候带 –enable-fpm 参数即可开启PHP-FPM。


了解这些我们就知道,通信的流程就是,nginx接受到请求,是通过cgi与php进行通信。
具体实现,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
修改php-fpm.conf

listen = 127.0.0.1:9000
或者
listen = /dev/shm/php-cgi.sock

修改nginx配置文件server段的配置

location ~ [^/]\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
#或
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}

这样就引刃而解了第2个问题,可以首先安装多个php版本,通过 –prefix 指定不同的目录,php-fpm启动的时候,可以选择不同的端口,或者不同的sock。然后项目里nginx配置里
指定对应的php-fpm就实现了php多个版本共存。

入IT这一行已经进入了第五个年头,有时候会想工作的意义在哪里。