基于 Docker 的 php-fpm 如何使用 socket 方式进行连接

现有两个容器:nginxphp-fpm,我们通常的连接方式是采用 tcp 形式,配置 127.0.0.1:9000 将 php 相关请求转发给 php-fpm,而使用 socket 的连接方式,将获得更好的性能。

具体配置示例如下:

  1. 配置 docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    version: '3'

    services:

    # Nginx
    nginx:
    build:
    context: ./build/nginx
    args:
    VERSION: 1.14
    image: lnmp/nginx:1.14
    ...
    volumes:
    .....
    - ./conf/php_fpm/sock:/sock
    links:
    - php_fpm

    # PHP with fpm
    php_fpm:
    build:
    context: ./build/php70_fpm
    args:
    - VERSION=7.0
    image: lnmp/php_fpm:7.0
    .....
    volumes:
    .....
    # php-fpm 的配置
    - ./conf/php_fpm/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
    # 挂载宿主机 socket 目录,因为 nginx 服务也需要访问
    - ./conf/php_fpm/sock:/sock
  2. 修改 php-fpm 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [global]

    daemonize = no

    [www]
    ;listen = 127.0.0.1:9000
    listen = /sock/php70-fpm.sock
    listen.mode = 0666

    .....

  3. 修改对应项目的 nginx 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    server {
    listen 80;
    server_name test.local;
    index index.html index.htm index.php;

    root /usr/share/nginx/html/testProject;

    .....

    # 处理 php 文件
    location ~ \.php {
    # fastcgi_pass php_fpm:9000;
    fastcgi_pass unix:/sock/php70-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html/testProject/$fastcgi_script_name;
    include fastcgi_params;
    }

    .....

    }

以上操作完成后,重新使用 docker-compose up 启动服务。

提示:如果出现 502 或 找不到 xx.sock 文件的错误,请检查确认用户权限或相关设置是否正确。