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 socketunix 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区别

CGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。 CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。
 
个客户端进行一次web服务器请求的流程为:
客户端---->web服务器----->cgi(由web子进程创建的cgi程序)------>应用程序(比如php)
处理完这次请求后web子进程退出,cgi进程也退出。
 
 
FastCGI是CGI的一种改进方案,FastCGI像是一个常驻(long-lived)型的CGI, 它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,所以 FastCGI 程序可以在网站服务器以外的主机上执行,并且可以接受来自其它网站服务器的请求。
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解释器--->应用程序。

FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 Socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,也正是由于 FastCGI 进程管理器是基于 Socket 通信的,所以也是分布式的,Web 服务器可以和 CGI 响应器服务器分开部署。


posted @ 2020-01-07 18:18  WhoAmMe  阅读(317)  评论(0编辑  收藏  举报