PHP FPM 正在运行,但忽略了 SetHandler 的版本

PHP FPM 正在运行,但忽略了 SetHandler 的版本

我们的服务器是 Ubuntu 18.04.5 LTS(GNU/Linux 4.15.0-135-generic x86_64)。

我们按照https://tecadmin.net/install-multiple-php-version-apache-ubuntu/前段时间,在 7.2 刚发布时,PHP 5.6 和 7.2 就开始运行了,直到今天早上,我升级并添加了 7.3 和 7.4,都没有问题。昨天它运行正常,但今天却不行了。我们昨天早些时候打包了更新,但它不需要重新启动,而且我不相信它会在一夜之间自行重新启动,因为uptime我们已经快 15 天了。

所以今天我们开始再次经历这个过程,并且做到了这一点,在每个步骤之后重新启动 apache2:

尝试过:

a2enmod actions fcgid alias proxy_fcgi

并得到:

ERROR: Module fcgid does not exist!

做了apt install apache2 libapache2-mod-fcgid和那工作并添加了该包。

确实a2enmod actions fcgid alias proxy_fcgi如此,它说明了一切已经启用

检查了conf文件/etc/apache2/sites-enabled

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

尝试了phpinfo()页面,得到的是 PHP 7.4.15,而不是预期的 5.6.40。我们对 7.3 做了同样的操作,phpinfo()使用 php7.3 的 SetHandler 也得到了相同的 7.4。

然后尝试systemctl status php5.6-fpmphp7.4-fpm得到两者active (running)

我的文件在这里供初学者使用,除了版本之外,/etc/apache2/conf/php5.6-fpm.conf其他都php7.4-fpm.conf相同:mod_php5/7SetHandler

# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
        </If>
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

这里是否有错误或者我应该查看其他地方?

值得一提的是,我们有另一台具有类似设置的服务器,并且遇到了同样的问题,但目前我们只需要该服务器上的 5.6 旧版应用程序,因此我们只需通过删除指针文件 /etc/apache2/conf-enabled/php7.4-fpm.conf并重新启动即可禁用 7.4 apache2。但是,此服务器需要多个版本。

答案1

改变:

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

为了:

<FilesMatch \.php$>
   <If "-f %{REQUEST_FILENAME}">
    SetHandler "proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost"
   </If>
</FilesMatch>

答案2

自从我在 2021 年 2 月 15 日更新操作系统 (ubuntu 20.04 LTS) 后,我开始遇到这个问题。现在我的所有网站都使用 php 8.0,而不是 SetHandler 配置

答案3

我在 Ubuntu WSL 设置上遇到了完全相同的问题。但是,以下文章对我的同事很有帮助,因此也可能对您有所帮助。

避免使用代理密码匹配

# don't
<IfModule mod_proxy.c>
  ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/
</IfModule>

自从代理密码匹配优先于文件匹配你用什么设置处理程序

来源: https://ma.ttias.be/apache-2-4-proxypass-for-php-taking-precedence-over-filesfilesmatch-in-htaccess/

答案4

我正在使用 Ubuntu 20.04,我遇到了完全相同的问题 - 只显示一个版本的 PHP,即最新版本。我尝试设置三个 PHP 版本以同时与同一个 Apache 一起运行。

在我看来,所有三个配置的 SetHandler 行都设置为与上次加载的配置文件相同的值。配置文件在目录中按以下顺序列出:

  • /etc/apache2/conf-enabled/php5.6-fpm.conf
  • /etc/apache2/conf-enabled/php7.4-fpm.conf
  • /etc/apache2/conf-enabled/php8.1-fpm.conf

Apache 日志显示,我创建的每个虚拟主机(应该运行不同版本的 PHP)都试图连接到 php8.1 的同一个 unix 套接字。

Alfredos 的回答本身并没有解决我的问题。

解决方案对我来说,从使用 unix 套接字切换到 TCP 套接字,作为 apache2 和 php-pfm 之间的通信形式。为此,我修改了这三个文件以设置 php-pfm 的 ip 和监听端口。

在文件中: /etc/php/5.6/fpm/pool.d/www.conf

listen = 127.0.0.1:9056

在文件中: /etc/php/7.4/fpm/pool.d/www.conf

listen = 127.0.0.1:9074

在文件中: /etc/php/8.1/fpm/pool.d/www.conf

listen = 127.0.0.1:9081

为了反映 Apache 中的上述更改,我修改了文件:/etc/apache2/conf-enabled/php*-fpm.conf/etc/apache2/sites-enabled/php*.mydomain.conf这样 Apache 就可以连接到正确的 ip/端口。配置文件包含 Alfredos 答案。

文件/etc/apache2/conf-enabled/php5.6-fpm.conf看起来像这样:

<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>
    <FilesMatch ".+\.ph(ar|p|tml)$">
        <If "-f %{REQUEST_FILENAME}">
        SetHandler "proxy:fcgi://localhost:9056"
        </If>
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        Require all denied
    </FilesMatch>
    <FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

文件/etc/apache2/conf-enabled/php7.4-fpm.conf看起来像这样:

<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>
    <FilesMatch ".+\.ph(ar|p|tml)$">
        <If "-f %{REQUEST_FILENAME}">
        SetHandler "proxy:fcgi://localhost:9074"
        </If>
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        Require all denied
    </FilesMatch>
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

文件/etc/apache2/conf-enabled/php8.1-fpm.conf看起来像这样:

<IfModule !mod_php8.c>
<IfModule proxy_fcgi_module>
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>
    <FilesMatch ".+\.ph(ar|p|tml)$">
        <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:fcgi://127.0.0.1:9081"
        </If>
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        Require all denied
    </FilesMatch>
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

我的虚拟主机文件如下所示:

/etc/apache2/sites-enabled/php56.mydomain.com.conf

<VirtualHost *:80>
    ServerName php56.mydomain.com
    ServerAlias www.php56.mydomain.com
    DocumentRoot /var/www/php56
    <Directory /var/www/php56>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:fcgi://127.0.0.1:9056"
        </If>
    </FilesMatch>

    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/php56.error.log
    CustomLog ${APACHE_LOG_DIR}/php56.access.log combined
</VirtualHost>

/etc/apache2/sites-enabled/php74.mydomain.com.conf

<VirtualHost *:80>
    ServerName php74.mydomain.com
    ServerAlias www.php74.mydomain.com
    DocumentRoot /var/www/php74
    <Directory /var/www/php74>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:fcgi://127.0.0.1:9074"
        </If>
    </FilesMatch>
    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/php74.error.log
    CustomLog ${APACHE_LOG_DIR}/php74.access.log combined
</VirtualHost>

/etc/apache2/sites-enabled/php81.mydomain.com.conf

<VirtualHost *:80>
    ServerName php81.mydomain.com
    ServerAlias www.php81.mydomain.com
    DocumentRoot /var/www/php81
    <Directory /var/www/php81>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    <FilesMatch \.php$>
        <If "-f %{REQUEST_FILENAME}">
            SetHandler "proxy:fcgi://127.0.0.1:9081"
        </If>
    </FilesMatch>
    LogLevel debug
    ErrorLog ${APACHE_LOG_DIR}/php81.error.log
    CustomLog ${APACHE_LOG_DIR}/php81.access.log combined
</VirtualHost>

以供参考:

#apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
Server built:   2021-10-14T16:24:43

我希望它能有所帮助并为您节省一些时间。

编辑: 回答你的问题,你的配置中是否有错误。如果你使用 TCP 套接字,则带有 SetHandler 的行可能会出现问题,因为未指定端口,这可能会导致 Apache 尝试连接到相同的 PHP 版本。

还有什么地方需要查找:检查这些文件中是否也有正确的 SetHandler 行:/etc/apache2/sites-enabled/php*.mydomain.conf

检查上述文件中的 SetHandler 行是否与以下文件中的“listen”行匹配: /etc/php/*/fpm/pool.d/www.conf

相关内容