PHP-FPM与Nginx的实例

  介绍

这篇文章将为大家详细讲解有关PHP-FPM与Nginx的实例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强> PHP-FPM介绍

<强> CGI协议与FastCGI协议

每种动态语言(PHP, Python等)的代码文件需要通过对应的解析器才能被服务器识别,而CGI协议就是用来使解释器与服务器可以互相通信。PHP文件在服务器上的解析需要用到PHP解释器,再加上对应的CGI协议,从而使服务器可以解析到PHP文件。

由于CGI的机制是每处理一个请求需要叉一个CGI进程,请求结束再杀死掉这个进程,在实际应用上比较浪费资源,于是就出现了CGI的改良版本FastCGI, FastCGI在请求处理完后,不会杀死掉进程,而是继续处理多个请求,这样就大大提高了效率。

<强> PHP-FPM是什么

PHP-FPM即PHP-FastCGI进程管理器,它是FastCGI的实现,并提供了进程管理的功能。进程包含主进程和工人进程两种;主进程只有一个,负责监听端口,接收来自服务器的请求,而工人进程则一般有多个(具体数量根据实际需要进行配置),每个进程内部都会嵌入一个PHP解释器,是代码真正执行的地方。

<强> Nginx与PHP-FPM通信机制

当我们访问一个网站(如www.test.com)的时候,处理流程是这样的:

www.test.com   |   |   Nginx   |   |   路由到www.test.com/index.php   |   |   加载nginx的fast-cgi模块   |   |   fast-cgi监听127.0.0.1:9000地址   |   |   www.test.com/index.php请求到达127.0.0.1:9000   |   |   等待处理…

<强> Nginx与php-fpm的结合

在Linux上,Nginx与php-fpm的通信有tcp套接字和unix socket两种方式。

tcp套接字的优点是可以跨服务器,当Nginx和php-fpm不在同一台机器上时,只能使用这种方式。

unix socket又叫IPC(进程间通信进程间通信)插座,用于实现同一主机上的进程间通信,这种方式需要在Nginx配置文件中填写php-fpm的套接字文件位置。

两种方式的数据传输过程如下图所示:

 php-fpm与Nginx的实例

二者的不同:

由于unix socket不需要经过网络协议栈,不需要打包拆包,计算校验和,维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程,所以其效率比tcp套接字的方式要高,可减少不必要的tcp开销。不过,unix socket高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而tcp这样的面向连接的协议,可以更好的保证通信的正确性和完整性。

Nginx与php-fpm结合只需要在各自的配置文件中做设置即可:

1) Nginx中的配置

以tcp套接字通信为例

服务器{   听80;80 #监听端口,接收http请求   server_name www.test.com;#就是网站地址   根/usr/local/etc/nginx/www/huxintong_admin;#准备存放代码工程的路径   #路由到网站根目录www.test.com时候的处理   位置/{   指数index . php;#跳转到www.test.com/index.php   自动变址>=127.0.0.1:9000听   #或者下面这样   听=/var/run/php-fpm.袜子

<>强注意,在使用unix socket方式连接时,由于套接字文件本质上是一个文件,存在权限控制的问题,所以需要注意nginx进程的权限与php-fpm的权限问题,不然会提示无权限访问。(在各自的配置文件里设置用户)

通过以上配置即可完成php-fpm与nginx的通信。

<强>在应用中的选择

如果是在同一台服务器上运行的nginx和php-fpm,且并发量不高(不超过1000),选择unix插座,以提高nginx和php-fpm的通信效率。

如果是面临高并发业务,则考虑选择使用更可靠的tcp套接字,以负载均衡,内核优化等运维手段维持效率。

若并发较高但仍想用unix套接字时,可通过以下方式提高unix socket的稳定性。

1)将袜子文件放在/dev/shm目录下,此目录下将袜子文件放在内存里面,内存的读写更快。

2)提高积压

积压默认位128,这1024个值换成自己正常的每秒,配置如下。

nginx。参看文件中

服务器{   听80默认积压=1024;   }

php-fpm。参看文件中

听。以前积压=1024

3)增加袜子文件和php-fpm实例

在/dev/shm新建一个袜子文件,在nginx中通过上游模块将请求负载均衡到两个袜子文件,并且将两个袜子文件分别对应到两套php-fpm实例上。

PHP-FPM与Nginx的实例