PHP开发知识必备-Nginx与PHP如何交互

普及Nginx与Php-fpm相关知识点

nginx是什么

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。cgi的历史

早期的webserver只处理html等静态文件,但是随着技术的发展,出现了像php等动态语言。webserver处理不了了,怎么办呢?那就交给php解释器来处理吧!交给php解释器处理很好,但是,php解释器如何与webserver进行通信呢?

为了解决不同的语言解释器(如php、python解释器)与webserver的通信,于是出现了cgi协议。只要你按照cgi协议去编写程序,就能实现语言解释器与webwerver的通信。如php-cgi程序。cgi: 是服务器(Apache/nginx)与应用程序(php/java)之间数据交换的一种协议fastcgi: 是cgi的优化版,更加高效(常驻型cgi)php-fpm: fpm(fastcgi process manager) fastcgi的实现 php的fastcgi进程管理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 进程两种进程。master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

fpm是FastCGI Process Manager的缩写,那么,fpm就是FastCGI进程管理器的简称。php-fpm就是php中的FastCGI进程管理器。对于php5.3之前的版本来说,php-fpm是一个第三方的补丁包,旨在将FastCGI进程管理整合进PHP包中。在php5.3之后的版本中,php-fpm不再是第三方的包,它已经被集成到php的源码中了。php-fpm提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以php-fpm被PHP官方收购了

PHP开发知识必备-Nginx与PHP如何交互_第1张图片

Nginx如何与Php-fpm结合

我们知道Nginx不只有处理http请求的功能,还能做反向代理。故Nginx通过反向代理功能将动态请求转向后端Php-fpm。

打开 nginx/conf/nginx.conf , 里面include 的内容才是真正的server,每一个server对应一个conf配置

PHP开发知识必备-Nginx与PHP如何交互_第2张图片nginx统一配置

查看其中的一个server (chumt.conf) :

PHP开发知识必备-Nginx与PHP如何交互_第3张图片一个模块的配置

当我访问: http://127.0.0.1:8281/ 的时候,会路由到 root位置 找到index.php 文件

当请求模块下的某个php文件的时候,会通过反向代理到达php-fpm

下面是 fastcgi_params 的内容:

PHP开发知识必备-Nginx与PHP如何交互_第4张图片nginx跟php联系起来

fast-cgi 监听9991端口,9991端口就是php-fpm服务的端口

即:php-fpm模块监听127.0.0.1:9000端口,等待请求到来去处理。

下面是php-fpm的服务进程

PHP开发知识必备-Nginx与PHP如何交互_第5张图片php-fpm进程

Common Gateway Interface/CGI 通用网关接口:CGI描述了服务器和请求处理程序之间传输数据的一种标准。

用一张图表示nginx fastcgi wrapper php之间的关系

PHP开发知识必备-Nginx与PHP如何交互_第6张图片

PHP开发知识必备-Nginx与PHP如何交互_第7张图片

CGI是通用网关协议,FastCGI则是一种常驻进程的CGI模式程序。我们所熟知的PHP-FPM的全称是PHP FastCGI Process Manager,即PHP-FPM会通过用户配置来管理一批FastCGI进程,例如在PHP-FPM管理下的某个FastCGI进程挂了,PHP-FPM会根据用户配置来看是否要重启补全,PHP-FPM更像是管理器,而真正衔接Nginx与PHP的则是FastCGI进程。图中,FastCGI的下游CGI-APP就是PHP程序。而FastCGI的上游是Nginx,他们之间有一个通信载体,即图中的socket。在我们上文图的配置文件中,fastcgi_pass所配置的内容,便是告诉Nginx你接收到用户请求以后,你该往哪里转发,在我们图中是转发到本机的一个socket文件,这里fastcgi_pass也常配置为一个http接口地址(这个可以在php-fpm.conf中配置)。而上图中的Pre-fork,则对应着我们PHP-FPM的启动,也就是在我们启动PHP-FPM时便会根据用户配置启动诸多FastCGI触发器(FastCGI Wrapper)一句话总结

一句话总结:nginx接到请求,根据监听端口找到要访问的php文件,并通过socket与其中一个常驻内存fast-cgi程序建立连接,并将接收到的数据传给fast-cgi,php-fpm管理fast-cgi进程,挂了后就再启动起来,fast-cgi执行php程序,完成数据的获取后再通过该连接返回给nginx,返回到用户client。

你可能感兴趣的:(PHP开发知识必备-Nginx与PHP如何交互)