这篇文章将为大家详细讲解有关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的套接字文件位置。
两种方式的数据传输过程如下图所示:
二者的不同:
由于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的实例