如何通过 unix socket 设置 Apache2 和 PHP-FPM?

Posted

技术标签:

【中文标题】如何通过 unix socket 设置 Apache2 和 PHP-FPM?【英文标题】:How to set up Apache2 and PHP-FPM via unix socket? 【发布时间】:2018-02-26 14:37:46 【问题描述】:

我尝试通过 unix 套接字设置 Apache2 和 php-FPM,但结果是

(111)连接被拒绝:AH02454:FCGI:尝试连接到 Unix 域套接字 /run/php/php7.2-fpm.sock (*) 失败

docker-compose.yml

version: "2"
services:
    php:
        build: "php:7.2-rc-alpine"
        container_name: "php"
        volumes:
            - "./code:/usr/local/apache2/htdocs"
            - "./php7.2-fpm.sock:/run/php/php7.2-fpm.sock"
    apache2:
        build: "httpd:2.4-alpine"
        container_name: "apache2"
        volumes:
            - "./code:/usr/local/apache2/htdocs"
            - "./php7.2-fpm.sock:/run/php/php7.2-fpm.sock"
        ports:
            - 80:80
        links:
            - php

www.conf

listen = /run/php/php7.2-fpm.sock

httpd-vhosts.conf

<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost/"
</FilesMatch>

但是通过 TCP 连接时它可以工作。

www.conf

listen = 127.0.0.1:9000

httpd-vhosts.conf

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://php:9000"
</FilesMatch>

【问题讨论】:

你看到主机上正在创建的套接字文件吗? 是的,所有的 apache、php 都使用 uid 和 gid 500 来处理。与 php7.2-fpm.sock 的所有者相同 您能否提供一个我可以测试的示例存储库 github.com/overbid/apache2-php.git 【参考方案1】:

好的,所以 repo 帮助解决了这个问题。

问题 #1 - www.conf 被复制到 apache 容器中

您的 apache 容器 Dockerfile 中有以下语句

COPY ./www.conf /usr/local/etc/php-fpm.d/www.conf

这实际上是为将运行 php-fpm 而不是 apache 容器的 php 容器设计的

问题 #2 - 从未创建过套接字

您的卷绑定- "./php7.2-fpm.sock:/run/php/php7.2-fpm.sock" 正在创建套接字,而它们不是由 php-fpm 创建的。所以你创建了一个空白文件并尝试连接它不会做任何事情

问题 #3 - php 中没有用于创建套接字的配置

docker 容器默认创建监听 fpm 容器内的0.0.0.0:9000。您需要覆盖容器内的 zz-docker.conf 文件才能解决此问题。

zz-docker.conf

[global]
daemonize = no

[www]
listen = /run/php/php7.2-fpm.sock
listen.mode = 0666
更新了 docker 文件
FROM php:7.2-rc-fpm-alpine

LABEL maintainer="Eakkapat Pattarathamrong (overbid@gmail.com)"
RUN docker-php-ext-install \
        sockets

RUN set -x \
        && deluser www-data \
        && addgroup -g 500 -S www-data \
        && adduser -u 500 -D -S -G www-data www-data

COPY php-fpm.d /usr/local/etc/php-fpm.d/

问题 #4 - 套接字作为卷共享给主机

您应该使用命名卷共享套接字,因此套接字根本不应该在主机上。

更新了 docker-compose.yml
version: "2"
services:
    php:
        build: "./php"
        container_name: "php"
        volumes:
            - "./code:/usr/local/apache2/htdocs"
            - "phpsocket:/run/php"
    apache2:
        build: "./apache2"
        container_name: "apache2"
        volumes:
            - "./code:/usr/local/apache2/htdocs"
            - "phpsocket:/run/php"
        ports:
            - 7080:80
        links:
            - php
volumes:
  phpsocket:

解决所有问题后,我能够让 php 页面正常工作

【讨论】:

感谢答案,我只是将 zz-docker.conf 添加到 php 中,一切正常。附言。我的 listen.mode 是 0666 是的,实际上套接字上不需要x 权限。应该是0666,这对我来说很糟糕

以上是关于如何通过 unix socket 设置 Apache2 和 PHP-FPM?的主要内容,如果未能解决你的问题,请参考以下文章

为 MariaDB 根用户启用密码和 unix_socket 身份验证?

通过unix socket建立http连接

通过 Unix Domain Socket 传递文件描述符

ruby 我的第一个简单的IPC解决方案,通过unix socket

tomcat设置远程监听端口(linux&windows)

Unix domain socket 简介