我正在 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 岗位,但我仍然对自己在做什么只有模糊的概念,所以任何帮助将不胜感激。
使用 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 开发工作站