Nginx与PHP-FPM的通信方式

前面两篇文章,分别介绍了《PHP-FPM的原理及使用》《PHP-FPM的配置,参数详解以及性能优化》。PHP-FPM主要是和Nginx进行交互,它们交互(通信)的方式有两种:一种是TCP的方式,一种是Unix Socke方式。两种方式的特点如下:

  • TCP是使用TCP端口连接,在nginx配置为: 127.0.0.1:9000
  • Socket是使用Unix Domain Socket连接套接字,一般以文件形式:/tmp/php-cgi.sock

在实际的环境中,配置如下

一 TCP配置方式

CP通信配置起来很简单,三步即可搞定

第一步,编辑 /etc/nginx/conf.d/你的站点配置文件(如果使用的默认配置文件,修改/etc/nginx/sites-available/default),例如我这边的配置路径如下:/usr/local/nginx/conf/vhost/XXX,显示如下:

location ~ \.php$ {

      index index.php index.html index.htm;

      include /etc/nginx/fastcgi_params;

      fastcgi_pass 127.0.0.1:9000;

      fastcgi_index index.php;

      include fastcgi_params;

 }
第二步,编辑php-fpm配置文件 /etc/php/7.4/fpm/pool.d/www.conf(具体位置,要看自己的服务器配置,可以使用 whereis php来定位)

修改完成后,最后就是重启php-fpm以及nginx即可。

二 Unix Socket配置方式

二和一的操作基本一样,Unix Socket的配置也在nginx的配置文件里面,配置如下:

         location ~ [^/]\.php(/|$)
         {
              fastcgi_pass  unix:/run/php/php7.4-fpm.sock;
              fastcgi_index admin.php;
              fastcgi_split_path_info ^(.+\.php)(.*)$;
              fastcgi_param   PATH_INFO      $fastcgi_path_info;
              include fastcgi.conf;
              fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/:/tmp/:/proc/";
          }

第二步,修改listen。需要注意的是,listen的sock与fastcgi_pass要相同,不然就会收不到请求

第三步 就是重启fpm和nginx就OK了。

三 TCP方式与Unix Socke方式的区别

TCP方式:网络连接

Unix Socke方式:Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。

 原理上来说,unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源,unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,可以保证通信的正确性和完整性

Sea Bridge

古之立大志者,不惟有超世之才 亦必有坚韧不拔之志!

发表评论