使用 apache proxy_fcgi_module 时出现 503

使用 apache proxy_fcgi_module 时出现 503

我在虚拟机上使用 CentOS 9 Stream,尝试设置我的 apache 服务器以便能够在网络上显示 php 内容。当服务器只有 html 时,它工作正常,但当我尝试使用 php 时,我收到这些错误(浏览器中为 503)。我的 httpd.conf 基本上是运行带有虚拟主机的服务器的最低限度,我唯一添加的是 php 文件的 SetHandler。我对 php 不是很熟悉,但据我了解,它的作用是当服务器收到对 php 文件的请求时,它会调用 php-fpm 服务来处理它。

httpd 和 php-fpm 服务都在运行,我将 SELinux bool httpd_can_network_connect 设置为 1,因为我读到这可能会导致 503。

/var/log/httpd/error.log显示:

[proxy:error] [pid 4807:tid 4812] (111)Connection refused: AH00957: FCGI: attempt to connect to [::]:8000 (*) failed
[proxy_fcgi:error] [pid 4807:tid 4812] [client 192.168.122.1:60494] AH01079: failed to make connection to backend: (null)

我的httpd.conf:

Listen                  80
Listen                  8080
User                    apache
Group                   apache
ServerRoot              /etc/httpd
ErrorLog                /var/log/httpd/error.log


LoadModule              mpm_event_module        modules/mod_mpm_event.so
LoadModule              systemd_module          modules/mod_systemd.so
LoadModule              unixd_module            modules/mod_unixd.so
LoadModule              authz_core_module       modules/mod_authz_core.so
LoadModule              dir_module              modules/mod_dir.so

LoadModule              proxy_module            modules/mod_proxy.so
LoadModule              proxy_fcgi_module       modules/mod_proxy_fcgi.so


<Directory />
        Require all denied
</Directory>

<Directory /var/www/html>
        Require all granted
</Directory>

<Directory /srv/www>
        Require all granted
</Directory>


<VirtualHost 192.168.122.60:80>
        DocumentRoot "/var/www/html"
        DirectoryIndex  index.html
</VirtualHost>

<VirtualHost 192.168.122.60:8080>
        DocumentRoot "/srv/www"
        DirectoryIndex  index.php

        <FilesMatch \.php$>
            SetHandler "proxy:fcgi:/run/php-fpm/www.sock"
        </FilesMatch>
</VirtualHost>

和我的www.conf:

listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.allowed_clients = 127.0.0.1

解决方案:正如 AlexD 指出的那样,问题在于 apache 试图通过 localhost 而不是套接字进行连接。我可以通过更改配置文件来监听 127.0.0.1:9000 来使其工作。如果我想使用 unix 套接字,我必须像这样更改 httpd.conf:

<Proxy "unix:/run/php-fpm/www.sock|fcgi://php-fpm">
   ProxySet disablereuse=off
</Proxy>

<FilesMatch \.php$>
   SetHandler proxy:fcgi://php-fpm
</FilesMatch>

在这里找到此配置:https://tecadmin.net/install-apache-php-fpm-centos-8/

答案1

错误消息(111)Connection refused: AH00957: FCGI: attempt to connect to [::]:8000 (*) failed表明您的 Apache 正在尝试连接到 TCP 端口 8000 上的后端,而您PHP-FPM正在监听 unix 套接字/run/php-fpm/www.sock。您可能忘记重新启动 Apache。

答案2

另一个可能的答案(至少,这发生在我身上)。我的配置完全正确,Apache 在配置后启动时没有问题。不幸的是,这个过程不是自动启动 PHP-FPM,需要以下行:

service php8.1-pfm start

(这是 Ubuntu 23.04 上的 PHP v8.1,您的版本可能不同)。就我而言,它进入supervisord配置文件以便在 docker 容器中使用。)

所有其他配置均保留默认设置。为了完整起见,以下是 Dockerfile 的相关部分。感谢https://www.howtoforge.com/how-to-enable-http-2-in-apache/

RUN apt-get install -y php8.1-fpm
...
RUN a2enmod http2
RUN a2dismod php8.1
RUN a2enconf php8.1-fpm
RUN a2enmod proxy
RUN a2enmod proxy_fcgi
RUN a2dismod mpm_prefork
RUN a2enmod mpm_event

相关内容