本节包含在 Linux 和类 Unix 系统上使用 Apache HTTP Server 2.x 安装 PHP 的说明和提示。
不要在新安装中使用 mod_php。
保留本页说明是为了提供历史参考,以及满足少数确实需要将 PHP
直接嵌入 Apache httpd 进程的情况。
对于所有现代部署,请将 PHP-FPM
(FastCGI 进程管理器)与 Apache httpd 的 mod_proxy_fcgi
模块配合使用。PHP-FPM 可提供更好的资源管理和进程隔离,能够在不重启
Apache httpd 的情况下单独重启 PHP,并兼容 Apache httpd 的
event MPM(自 Apache httpd 2.4 起为默认 MPM)。
主流 Linux 发行版均以此作为默认配置。
mod_php 方式会将 PHP 直接嵌入每个 Apache httpd
工作进程。除非编译 PHP 时启用了线程安全(--enable-zts),
否则 mod_php 要求使用 prefork MPM,
这会显著限制并发能力。如果仍要使用 mod_php,
应充分了解其性能和安全影响。
» Apache 文档是有关 Apache httpd 2.x 服务器最权威的信息来源,其中包含 Apache httpd 安装选项的更多说明。
可从 » Apache 下载站点获取最新版本的 Apache httpd,并从前述位置获取合适的 PHP 版本。本快速指南仅介绍开始使用 Apache httpd 2.x 和 PHP 所需的基础知识。更多信息请阅读 » Apache 文档。 为避免说明因版本变化而失效,这里省略了版本号。以下示例中的“NN” 应替换为所使用 Apache httpd 的具体版本号。
这些说明适用于 Apache httpd 2.4,这是 Apache httpd 当前唯一受支持的 发布分支。更早的版本(2.2 及以下)已经终止生命周期,不应再使用。
注意:
截止到 PHP 8.4.0,apache2handler SAPI 至少需要 Apache 2.4; 不再支持已终止生命周期的 Apache 2.0 和 2.2。
从上面列出的位置获取 Apache httpd,并将其解压:
tar -xzf httpd-2.x.NN.tar.gz
同样,获取并解压 PHP 源码:
tar -xzf php-NN.tar.gz
编译并安装 Apache httpd。有关编译 Apache httpd 的更多细节,请查阅
Apache httpd 安装文档。请注意,除非编译 PHP 时启用了线程安全
(--enable-zts),否则 mod_php
要求使用 prefork MPM。如果打算改用 PHP-FPM(推荐),
可以使用默认的 event MPM,并直接参阅
PHP-FPM 安装说明。
cd httpd-2_x_NN ./configure --enable-so --with-mpm=prefork make make install
现在 Apache httpd 2.x.NN 已安装到 /usr/local/apache2, 并配置了可加载模块支持和 prefork MPM。要测试安装,请按常规方式启动 Apache httpd 服务器,例如:
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
现在配置并编译 PHP。可以在这里使用各种选项自定义 PHP, 例如启用哪些扩展。运行 ./configure --help 可列出所有可用选项。本例使用支持 Apache httpd 和 MySQL 的简单配置。
如果按上述说明从源码编译 Apache httpd,下面示例中的 apxs 路径会与之匹配;如果以其他方式安装 Apache httpd, 则需要相应调整 apxs 的路径。请注意,某些发行版可能将 apxs 重命名为 apxs2。
cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql make make install
如果安装后决定更改配置选项,需要重新运行 configure、 make 和 make install。 只需重启 Apache 即可使新模块生效,无需重新编译 Apache httpd。
请注意,除非另有说明,make install 还会安装 » PEAR、 phpize 等各种 PHP 工具、 PHP CLI 以及其他组件。
配置 php.ini。
cp php.ini-development /usr/local/lib/php.ini
可以编辑 .ini 文件来设置 PHP 选项。如果希望将
php.ini 放在其他位置,请在第 5 步使用
--with-config-file-path=/some/path。
如果改用 php.ini-production,请务必阅读其中的变更列表, 因为这些设置会影响 PHP 的行为。
编辑 httpd.conf 以加载 PHP 模块。
LoadModule 语句右侧的路径必须指向系统中的 PHP 模块。
上述 make install 可能已经添加了此配置,但务必检查。
LoadModule php_module modules/libphp.so
让 Apache httpd 将特定扩展名解析为 PHP。例如,让 Apache httpd
将 .php 文件解析为 PHP。不要仅使用 AddType
指令,以免上传或创建的 exploit.php.jpg 等潜在危险文件
被当作 PHP 执行。使用以下方式,只需添加扩展名即可将其解析为 PHP。
本例添加 .php 进行演示。
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
如果只允许 .php、.php2、
.php3、.php4、.php5、
.php6 和 .phtml 文件作为 PHP 执行,
可以使用以下配置:
<FilesMatch "\.(php[2-6]?|phtml)$">
SetHandler application/x-httpd-php
</FilesMatch>
要让 PHP 源码过滤器处理 .phps 文件并以语法高亮方式
显示源代码,请使用以下配置:
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
要在找不到其他处理程序时将 PHP 文件用作默认处理程序(例如使用路由引擎时),
可以使用 FallbackResource 指令。
由于无论文件是否存在都会应用 SetHandler 指令,
而 FallbackResource 仅在尚未设置处理程序时应用,
因此可能需要使用 If 指令确保只在文件存在时应用处理程序。
这样,FallbackResource 就能处理以 .php
结尾但实际不存在的路径,这对错误处理和路由很有用。
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler application/x-httpd-php
</If>
</FilesMatch>
FallbackResource /index.php
可以使用 mod_rewrite 将任意 .php 文件
以语法高亮方式显示为源代码,而无需将其重命名或复制为
.phps 文件:
RewriteEngine On RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
不应在生产系统上启用 PHP 源码过滤器,因为它可能暴露源代码中嵌入的 机密信息或其他敏感信息。
按常规方式启动 Apache httpd,例如:
/usr/local/apache2/bin/apachectl start
或者
service httpd restart
完成上述步骤后,将得到一个正在运行的 Apache httpd Web 服务器,
并以 SAPI 模块形式支持 PHP。Apache httpd 和 PHP
还有许多其他配置选项。要了解更多信息,请在相应源码树中运行
./configure --help。
注意: MPM 兼容性
除非编译 PHP 时启用了 Zend 线程安全 (
--enable-zts),否则mod_php要求使用preforkMPM。有关原因,请阅读 在线程化 MPM 中使用 Apache httpd的相关常见问题。大多数发行版提供的
mod_php软件包未启用 ZTS, 因此通常需要prefork。如果需要线程化 MPM (建议在负载下使用以获得更好的性能),请改用 PHP-FPM 和mod_proxy_fcgi。
注意:
Apache MultiViews 常见问题讨论了在 PHP 中使用 MultiViews。