关于Nginx和PHP之间的交互

之前说过对于nginx的了解,现在说一下一个PHP项目在服务器上部署好以后,用户访问的时候,他是如何实现由Nginx到PHP的。

首先用户请求,到了nginx这块就不具体说了,之前有解释过,接下来说一下,nginx如何到PHP的。

先看一下nginx对于PHP项目的配置


nginx.conf配置

从图中可以看到,里面有很多是关于fast_cgi的东西,还有一个就root,root就是项目的路径,看到fast_cgi应该就能明白,PHP和Nginx之间的关联肯定离不开fast_cgi,我相信部署过项目的朋友肯定知道一个玩意那就是PHP-fpm,那PHP-fpm是什么呢?他的全名就是:PHP FastCGI Process Manager(PHP FastCGI 进程管理器),所以可以知道,php-fpm从意思上就是用来有效的管理php和fastcgi的,那fastcgi又是什么呢?

CGI是通用网关协议,FastCGI则是一种常住进程的CGI模式程序。前面所说到的php-fpm就是用来管理一批fastcgi的进程。


关系图

如上图所示,FastCGI的下游,是CGI-APP,在我们的LNMP架构里,这个CGI-APP就是PHP程序。而FastCGI的上游是Nginx,他们之间有一个通信载体,即图中的socket。在我们上文的配置文件中,fastcgi_pass所配置的内容,便是告诉Nginx你接收到用户请求以后,你该往哪里转发,这里fastcgi_pass也常配置为一个http接口地址(这个可以在php-fpm.conf中配置)。而上图中的Pre-fork,则对应着我们PHP-FPM的启动,也就是在我们启动PHP-FPM时便会根据用户配置启动诸多FastCGI触发器(FastCGI Wrapper)。由此可见fastcgi上游是nginx下游是php,他做到了一个承上启下的作用。

在接着深入了解一下fastcgi :http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html ,可以从官网上去了解一下他的模块


从图中可以看到,fastcgi所申明的内容最后会传递给fastcgi server中,也就是我们Nginx+PHP模式下的PHP-FPM所管理的FastCGI进程,或者说是那个socket文件载体。在这里会有点懵逼这说的是什么意思,举个简单的例子可能就知道了,在PHP中有个$_SERVER,想象玩PHP的都不陌生,难道就不会疑问,为什么通过这个变量就能拿到用户请求过来的数据,甚至是他的IP呢?其实这些数据nginx在调用fastcgi模块的时候,fastcgi讲拿到的数据给PHP的。

推荐阅读更多精彩内容