Unix 系统上的 Apache httpd 2.x

本节包含在 Linux 和类 Unix 系统上使用 Apache HTTP Server 2.x 安装 PHP 的说明和提示。

警告

请改用 PHP-FPM

不要在新安装中使用 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。

  1. 从上面列出的位置获取 Apache httpd,并将其解压:

    tar -xzf httpd-2.x.NN.tar.gz
    
  2. 同样,获取并解压 PHP 源码:

    tar -xzf php-NN.tar.gz
    
  3. 编译并安装 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
    
  4. 现在 Apache httpd 2.x.NN 已安装到 /usr/local/apache2, 并配置了可加载模块支持和 prefork MPM。要测试安装,请按常规方式启动 Apache httpd 服务器,例如:

    /usr/local/apache2/bin/apachectl start
    
    然后停止服务器,继续配置 PHP:
    /usr/local/apache2/bin/apachectl stop
    

  5. 现在配置并编译 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 以及其他组件。

  6. 配置 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 的行为。

  7. 编辑 httpd.conf 以加载 PHP 模块。 LoadModule 语句右侧的路径必须指向系统中的 PHP 模块。 上述 make install 可能已经添加了此配置,但务必检查。

    LoadModule php_module modules/libphp.so
  8. 让 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 源码过滤器,因为它可能暴露源代码中嵌入的 机密信息或其他敏感信息。

  9. 按常规方式启动 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 要求使用 prefork MPM。有关原因,请阅读 在线程化 MPM 中使用 Apache httpd的相关常见问题。

大多数发行版提供的 mod_php 软件包未启用 ZTS, 因此通常需要 prefork。如果需要线程化 MPM (建议在负载下使用以获得更好的性能),请改用 PHP-FPM 和 mod_proxy_fcgi。

注意:

Apache MultiViews 常见问题讨论了在 PHP 中使用 MultiViews。