前言

nginx 转发 php 类型的请求可以通过 fastcgi 的方式,fastcgi 支持 TCP 和 unix domain socket 两种方式。

Unix domain socket 监听

Unix domain socket 或者 IPC socket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。

与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。

Unix domain sockets 的接口和 Internet socket 很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是 POSIX 操作系统里的一种组件。

TCP 监听

通过网络 TCP 链接建立网络通信,即使是监听 127.0.0.1,也是通过网络底层协议来通信。相对于 socket 方式,会消耗一些网络资源。

选择 TCP 还是 Unix domain socket?

如果 nginx 和 php-fpm 都在同一台机器,当然是选择 Unix domain socket 方式;但是如果 nginx 和 php-fpm 不在同一台机器,socket 方式就不能用了。

如果网站的静态资源和 php 处理的页面是分开的,需要较高的处理能力,可以选择将 nginx 和 php-fpm 分开,通过 TCP 监听的方式组成集群进行处理。(因为 fastcgi 么有转发静态资源,所以需要 nginx 将静态资源转发对应的静态资源的目录)

php 配置

php-fpm 修改 php-fpm.conf

TCP 模式:

listen = 0.0.0.0:9000

Unix domain socket模式:

listen = /opt/php/var/run/php-fpm.sock    ; 这里的目录也可以选择/dev/shm/php-fpm.sock,/dev/shm/是一个内存的目录,相对读写的速度会快一点。

nginx 修改

TCP 模式

upstream fpm_server{
    server 192.168.122.100:9000;
    server 192.168.122.101:9000;
}

server {
    listen       80;
    server_name localhost;
    root  /var/www/php;
    location ~ [^/]\.php(/|$) {
        fastcgi_pass fpm_server;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi.conf;
    }
}

Unix domain socket 模式

server {
    listen       80;
    server_name localhost;
    root  /var/www/php;
    location ~ [^/]\.php(/|$) {
    fastcgi_pass unix:/opt/php/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include fastcgi.conf;
    }
}

总结

在服务器压力不大的情况下,tcp 和 Unix domain socket 差别不大,但在压力比较满的时候,用套接字方式,效果比较好。