如何在 Apache (httpd) Web 服务器中正确定义 PHP 8.3 处理程序?

问题描述 投票:0回答:1

我正在 Rocky Linux 9.3 上设置测试服务器,其中使用 Apache 2.4.57 和来自 Remi 存储库的 PHP 8.3(以多版本模式安装),并且在 Apache 中配置 php 文件处理程序时遇到一些问题。

当我安装 php83-php 包和其中一些附加模块时,它会将其配置放入

/etc/httpd/conf.modules.d/20-php83-php.conf
中,如下所示:

<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    <IfModule prefork.c>
      LoadModule php_module modules/libphp83.so
    </IfModule>
  </IfModule>
</IfModule>

这可以通过启动 httpd 服务并执行命令

httpd -M | grep php
来验证,该命令给出以下输出:

php_module (shared)

它还定义了

/etc/httpd/conf.d/php83-php.conf
中 php 文件的处理程序:

<IfModule mod_php.c>
    #
    # Cause the PHP interpreter to handle files with a .php extension.
    #
    <FilesMatch \.(php|phar)$>
        SetHandler application/x-httpd-php
    </FilesMatch>

</IfModule>

但这不起作用,并且 php 脚本不会在浏览器中执行。经过一番谷歌搜索后,我发现了 PHP 的变更日志(https://php.watch/versions/8.0/mod_php-rename),其中提到从版本 8.0 开始,Apache 处理程序的模块标识符已更改为

php_module
,即逻辑上给出了 php 包自动放入 Apache 配置中的模块名称。

但是,如果我将定义处理程序的条件语句更改为

<IfModule php_module>
,就像 php 更改日志中提到的那样,则效果不佳,并且 php 代码不会在浏览器中执行。

关于使用

<IfModule>
指令的 Apache 文档 (https://httpd.apache.org/docs/2.4/mod/core.html#ifmodule) 提到可以使用标识符或文件名,但放置 libphp83.so也没有任何效果。

如果我完全删除处理程序周围的条件语句

<IfModule ... > ... </IfModule>
,一切都会正常工作,并且代码会像预期的那样正确执行。然而?据我了解,这(据说)不安全,因为如果 php 模块由于某种原因实际上无法加载,它可能会导致代码泄漏。

所以,我的问题是,如何在

<IfModule>
指令中为 PHP 8.3 定义 Apache php 文件处理程序以使其正常工作?

至于为什么我不使用 php-fpm,这是一个很好的问题,但我并没有一个明确的答案。我在这里要做的是准备将非常旧且高度定制的 Bitrix CRM 从 CentOS 7(即将面世)和 PHP 7.4 迁移到现代发行版和现代 PHP 版本,同时遵循某人编写的手册他和大多数 IT 员工一起离开了很长时间,这导致我不久前从文书工作岗位调到 IT 岗位,但我仍然对自己在做什么只有模糊的概念,所以任何帮助将不胜感激。

php linux apache mod-php
1个回答
0
投票

使用 mod_php 意味着您在 prefork 模式下使用 httpd,这对于安全性和性能来说是一个糟糕的主意。

从EL-8开始,httpd使用event模式,默认使用php-fpm,mod_php仍然可用。

从EL-9开始,httpd使用event模式,而php-fpm始终使用

我衷心推荐使用php-fpm

所以,正确的处理程序是(正确的路径)

   SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"

要运行多个版本,我建议您阅读我的 PHP 开发工作站

© www.soinside.com 2019 - 2024. All rights reserved.