Nginx 连接fastcgi 有两种方式:unix domain socket 和 TCP socket。
unix domain socket 或者 IPC socket 是一种终端,可以使同一台操作系统上的两个或者多个进程进行数据通信。与管道相比,unix domain socket 可以使用字节流和数据队列,而管道通信则只能通过字节流。unix domain socket 的接口和internet socket很像,但它不适用网络底层协议来通信。 unix domain socket 的功能是POSIX 操作系统里的一种组件。
下面对比 unix domain socket 和TCP socket两种通信方式
首先看nginx server配置信息
location ~ \.php$ { # include snippets/fastcgi-php.conf; include fastcgi_params; # With php-fpm (or other unix sockets): fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; }
使用 unix domain socket 则配置为
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
使用 TCP socket 通信方式则配置为
fastcgi_pass 127.0.0.1:9000;
对于进程间通讯的两个程序,unix domain socket的流程不会走到TCP 那层,直接以文件形式,以stream socket通讯。如果是TCP socket,则需要走到IP层。所以理论上 unix domain socket 的处理效率会更优于 TCP socket。
参考链接:http://www.cnxct.com/default-configuration-and-performance-of-nginx-phpfpm-and-tcp-socket-or-unix-domain-socket/