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
    

    如果安装后决定更改配置选项,需要重新运行 configuremakemake install。 只需重启 Apache 即可使新模块生效,无需重新编译 Apache httpd。

    请注意,除非另有说明,make install 还会安装 » PEARphpize 等各种 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-FPMmod_proxy_fcgi

注意:

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

添加备注

用户贡献的备注 2 notes

up
13
nmmm at nmmm dot nu
17 years ago
When I upgrade to apache 2.2, this:

AddType application/x-httpd-php .php5
AddType application/x-httpd-php .php42
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtm
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .asp

...does not worked for me, so I did this:

<FilesMatch "\.(php*|phtm|phtml|asp|aspx)$">
SetHandler application/x-httpd-php
</FilesMatch>

Another interesting point with Apache 2.2 is following.
Let suppose we installed PHP as module. But for some directory, we need to use PHP as CGI (probably because of custom configuration). This can be done using:

<FilesMatch "\.(php*|phtm|phtml|asp|aspx)$">
SetHandler none
</FilesMatch>

AddType application/x-httpd-php-custom .php
Action  application/x-httpd-php-custom  /cgi-bin/php-huge

Note type must be different than "application/x-httpd-php" and also you need to deactivate the handler on sertain extention. You can do mixed configuration:

<FilesMatch "\.(php)$">
SetHandler none
</FilesMatch>

AddType application/x-httpd-php-custom .php
Action  application/x-httpd-php-custom  /cgi-bin/php-huge

in such case files like *.php5 and so on will be parsed via module, but *.php will go to php-huge executable.
up
7
Morning Star
3 years ago
I had just installed php8.1.12 on a machine used for writing C code. 

Below are some libraries that I needed to download on a debian-based OS. 

apt-get install libpcre3 libpcre3-dev 
apt-get install apache2-dev
apt-get install libxml2-dev
apt-get install libsqlite3-dev

These were the missing packages that I required. 
If you get an error regarding a missing package or library, for example when I needed sqlite3, run the command: 

apt search sqlite3

And you'll be able to see if there's any dev or lib packages. 

The apache2 instructions worked flawlessly at the time of php8.1.12; and in order to get certain requirements for an application, I had to run the php configure file like so:

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql --with-mysqli --with-zip --enable-gd

The extra flags allowed me to use both types of mysql, allowed me to utilize PHP zip archiving, and allowed me to use Gnatt stuff.