nginx与php-fpm通信方式 CGI FAST-CGI区别
一、Nginx php-fpm运行模式
Nginx 是非阻塞IO & IO复用模型,通过操作系统提供的类似 epoll 的功能,可以在一个线程里处理多个客户端的请求。
Nginx 的进程就是线程,即每个进程里只有一个线程,但这一个线程可以服务多个客户端。
PHP-FPM 是阻塞的单线程模型,pm.max_children 指定的是最大的进程数量,
pm.max_requests 指定的是每个进程处理多少个请求后重启(因为 PHP 偶尔会有内存泄漏,所以需要重启).
PHP-FPM 的每个进程也只有一个线程,但是一个线程同时只能服务一个客户端。
二、Nginx php-fpm之间的通信方式
1、在linux中,nginx服务器和php-fpm可以通过tcp socket和unix socket两种方式实现
unix socket是一种终端,可以使同一台机器上的多个进程间进行通信。这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp socket高
tcp socket的优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式。
2、配置方法
tcp socket 填写php-fpm运行的ip地址和端口号
location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; }
unix socket通信方式,需要在nginx配置文件中填写php-fpm运行的pid文件地址。
location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; }
三、CGI Fast CGI区别
客户端---->web服务器----->cgi(由web子进程创建的cgi程序)------>应用程序(比如php)
处理完这次请求后web子进程退出,cgi进程也退出。
FastCGI 是与语言无关的、可伸缩架构的 CGI 开放扩展,将 CGI 解释器进程保持在内存中,以此获得较高的性能。 CGI 程序反复加载是 CGI 性能低下的主要原因,如果 CGI 程序保持在内存中并接受 FastCGI 进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over 特性等。
FastCGI 工作流程如下:
1:FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接。
2:Web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 CGI 解释器进程。
3:CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。
4:CGI 解释器进程接着等待并处理来自 Web Server 的下一个连接。
所以fast-cgi模式下,一个客户端进行一次web服务器请求的流程为:
客户端---->web服务器---->fast-cgi进程管理器--->cgi解释器--->应用程序。