<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/install.unix.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'install.unix.apache2.php',
    1 => 'Unix 系统上的 Apache httpd 2.x',
    2 => 'Unix 系统上的 Apache httpd 2.x',
  ),
  'up' => 
  array (
    0 => 'install.unix.php',
    1 => '在 Unix 系统上安装 PHP',
  ),
  'prev' => 
  array (
    0 => 'install.unix.commandline.php',
    1 => 'CGI 和命令行设置',
  ),
  'next' => 
  array (
    0 => 'install.unix.nginx.php',
    1 => 'Unix 系统下的 Nginx 1.4.x',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'install/unix/apache2.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="install.unix.apache2" class="sect1">
 <h2 class="title">Unix 系统上的 Apache httpd 2.x</h2>

 <p class="simpara">
  本节包含在 Linux 和类 Unix 系统上使用 Apache HTTP Server
  2.x 安装 PHP 的说明和提示。
 </p>

 <div class="warning"><strong class="warning">警告</strong>
  <h1 class="title">请改用 PHP-FPM</h1>
  <p class="simpara">
   <strong>不要在新安装中使用 <code class="literal">mod_php</code>。</strong>
   保留本页说明是为了提供历史参考，以及满足少数确实需要将 PHP
   直接嵌入 Apache httpd 进程的情况。
  </p>
  <p class="simpara">
   对于所有现代部署，请将 <a href="install.fpm.php" class="link">PHP-FPM</a>
   （FastCGI 进程管理器）与 Apache httpd 的 <code class="literal">mod_proxy_fcgi</code>
   模块配合使用。PHP-FPM 可提供更好的资源管理和进程隔离，能够在不重启
   Apache httpd 的情况下单独重启 PHP，并兼容 Apache httpd 的
   <code class="literal">event</code> MPM（自 Apache httpd 2.4 起为默认 MPM）。
   主流 Linux 发行版均以此作为默认配置。
  </p>
  <p class="simpara">
   <code class="literal">mod_php</code> 方式会将 PHP 直接嵌入每个 Apache httpd
   工作进程。除非编译 PHP 时启用了线程安全（<code class="literal">--enable-zts</code>），
   否则 <code class="literal">mod_php</code> 要求使用 <code class="literal">prefork</code> MPM，
   这会显著限制并发能力。如果仍要使用 <code class="literal">mod_php</code>，
   应充分了解其性能和安全影响。
  </p>
 </div>

 <p class="simpara">
  <a href="http://httpd.apache.org/docs/current/" class="link external">&raquo;&nbsp;Apache 文档</a>是有关
  Apache httpd 2.x 服务器最权威的信息来源，其中包含 Apache httpd
  安装选项的更多说明。
 </p>

 <p class="simpara">
  可从 <a href="http://httpd.apache.org/" class="link external">&raquo;&nbsp;Apache 下载站点</a>获取最新版本的
  Apache httpd，并从前述位置获取合适的 PHP 版本。本快速指南仅介绍开始使用
  Apache httpd 2.x 和 PHP 所需的基础知识。更多信息请阅读
  <a href="http://httpd.apache.org/docs/current/" class="link external">&raquo;&nbsp;Apache 文档</a>。
  为避免说明因版本变化而失效，这里省略了版本号。以下示例中的“NN”
  应替换为所使用 Apache httpd 的具体版本号。
 </p>

 <p class="simpara">
  这些说明适用于 Apache httpd 2.4，这是 Apache httpd 当前唯一受支持的
  发布分支。更早的版本（2.2 及以下）已经终止生命周期，不应再使用。
 </p>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="simpara">
   截止到 PHP 8.4.0，apache2handler SAPI 至少需要 Apache 2.4；
   不再支持已终止生命周期的 Apache 2.0 和 2.2。
  </p>
 </p></blockquote>

 <ol type="1">
  <li class="listitem">
   <p class="simpara">
    从上面列出的位置获取 Apache httpd，并将其解压：
   </p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
tar -xzf httpd-2.x.NN.tar.gz
</pre></div>
    </div>
   </div>
  </li>

  <li class="listitem">
   <p class="simpara">
    同样，获取并解压 PHP 源码：
   </p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
tar -xzf php-NN.tar.gz
</pre></div>
    </div>
   </div>
  </li>

  <li class="listitem">
   <p class="simpara">
    编译并安装 Apache httpd。有关编译 Apache httpd 的更多细节，请查阅
    Apache httpd 安装文档。请注意，除非编译 PHP 时启用了线程安全
    （<code class="literal">--enable-zts</code>），否则 <code class="literal">mod_php</code>
    要求使用 <code class="literal">prefork</code> MPM。如果打算改用 PHP-FPM（推荐），
    可以使用默认的 <code class="literal">event</code> MPM，并直接参阅
    <a href="install.fpm.php" class="link">PHP-FPM 安装说明</a>。
   </p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
cd httpd-2_x_NN
./configure --enable-so --with-mpm=prefork
make
make install
</pre></div>
    </div>
   </div>
  </li>

  <li class="listitem">
   <p class="para">
    现在 Apache httpd 2.x.NN 已安装到 /usr/local/apache2，
    并配置了可加载模块支持和 prefork MPM。要测试安装，请按常规方式启动
    Apache httpd 服务器，例如：

    <div class="informalexample">
     <div class="example-contents screen">
<div class="cdata"><pre>
/usr/local/apache2/bin/apachectl start
</pre></div>
     </div>
    </div>

    然后停止服务器，继续配置 PHP：

    <div class="informalexample">
     <div class="example-contents screen">
<div class="cdata"><pre>
/usr/local/apache2/bin/apachectl stop
</pre></div>
     </div>
    </div>
   </p>
  </li>

  <li class="listitem">
   <p class="simpara">
    现在配置并编译 PHP。可以在这里使用各种选项自定义 PHP，
    例如启用哪些扩展。运行 <strong class="command">./configure --help</strong>
    可列出所有可用选项。本例使用支持 Apache httpd 和 MySQL 的简单配置。
   </p>

   <p class="simpara">
    如果按上述说明从源码编译 Apache httpd，下面示例中的
    <strong class="command">apxs</strong> 路径会与之匹配；如果以其他方式安装 Apache httpd，
    则需要相应调整 <strong class="command">apxs</strong> 的路径。请注意，某些发行版可能将
    <strong class="command">apxs</strong> 重命名为 <strong class="command">apxs2</strong>。
   </p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
cd ../php-NN
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
make
make install
</pre></div>
    </div>
   </div>

   <p class="simpara">
    如果安装后决定更改配置选项，需要重新运行 <strong class="command">configure</strong>、
    <strong class="command">make</strong> 和 <strong class="command">make install</strong>。
    只需重启 Apache 即可使新模块生效，无需重新编译 Apache httpd。
   </p>

   <p class="para">
    请注意，除非另有说明，<strong class="command">make install</strong> 还会安装
    <a href="https://pear.php.net/" class="link external">&raquo;&nbsp;PEAR</a>、
    <a href="install.pecl.phpize.php" class="link">phpize</a> 等各种 PHP 工具、
    PHP CLI 以及其他组件。
   </p>
  </li>

  <li class="listitem">
   <p class="simpara">
    配置 <var class="filename">php.ini</var>。
   </p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
cp php.ini-development /usr/local/lib/php.ini
</pre></div>
    </div>
   </div>

   <p class="simpara">
    可以编辑 <code class="literal">.ini</code> 文件来设置 PHP 选项。如果希望将
    <var class="filename">php.ini</var> 放在其他位置，请在第 5 步使用
    <code class="literal">--with-config-file-path=/some/path</code>。
   </p>

   <p class="simpara">
    如果改用 <var class="filename">php.ini-production</var>，请务必阅读其中的变更列表，
    因为这些设置会影响 PHP 的行为。
   </p>
  </li>

  <li class="listitem">
   <p class="simpara">
    编辑 <var class="filename">httpd.conf</var> 以加载 PHP 模块。
    <code class="literal">LoadModule</code> 语句右侧的路径必须指向系统中的 PHP 模块。
    上述 <strong class="command">make install</strong> 可能已经添加了此配置，但务必检查。
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="apache-confcode"><pre class="apache-confcode">LoadModule php_module modules/libphp.so</pre>
</div>
    </div>

   </div>
  </li>

  <li class="listitem">
   <p class="simpara">
    让 Apache httpd 将特定扩展名解析为 PHP。例如，让 Apache httpd
    将 <code class="literal">.php</code> 文件解析为 PHP。不要仅使用 <code class="literal">AddType</code>
    指令，以免上传或创建的 <var class="filename">exploit.php.jpg</var> 等潜在危险文件
    被当作 PHP 执行。使用以下方式，只需添加扩展名即可将其解析为 PHP。
    本例添加 <code class="literal">.php</code> 进行演示。
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="apache-confcode"><pre class="apache-confcode">&lt;FilesMatch \.php$&gt;
    SetHandler application/x-httpd-php
&lt;/FilesMatch&gt;</pre>
</div>
    </div>

   </div>

   <p class="simpara">
    如果只允许 <code class="literal">.php</code>、<code class="literal">.php2</code>、
    <code class="literal">.php3</code>、<code class="literal">.php4</code>、<code class="literal">.php5</code>、
    <code class="literal">.php6</code> 和 <code class="literal">.phtml</code> 文件作为 PHP 执行，
    可以使用以下配置：
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="apache-confcode"><pre class="apache-confcode">&lt;FilesMatch &quot;\.(php[2-6]?|phtml)$&quot;&gt;
    SetHandler application/x-httpd-php
&lt;/FilesMatch&gt;</pre>
</div>
    </div>

   </div>

   <p class="para">
    要让 PHP 源码过滤器处理 <code class="literal">.phps</code> 文件并以语法高亮方式
    显示源代码，请使用以下配置：
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="apache-confcode"><pre class="apache-confcode">&lt;FilesMatch &quot;\.phps$&quot;&gt;
    SetHandler application/x-httpd-php-source
&lt;/FilesMatch&gt;</pre>
</div>
    </div>

   </div>

   <p class="simpara">
    要在找不到其他处理程序时将 PHP 文件用作默认处理程序（例如使用路由引擎时），
    可以使用 <code class="literal">FallbackResource</code> 指令。
   </p>

   <p class="simpara">
    由于无论文件是否存在都会应用 <code class="literal">SetHandler</code> 指令，
    而 <code class="literal">FallbackResource</code> 仅在尚未设置处理程序时应用，
    因此可能需要使用 <code class="literal">If</code> 指令确保只在文件存在时应用处理程序。
    这样，<code class="literal">FallbackResource</code> 就能处理以 <code class="literal">.php</code>
    结尾但实际不存在的路径，这对错误处理和路由很有用。
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="apache-confcode"><pre class="apache-confcode">&lt;FilesMatch &quot;\.php$&quot;&gt;
    &lt;If &quot;-f %{REQUEST_FILENAME}&quot;&gt;
        SetHandler application/x-httpd-php
    &lt;/If&gt;
&lt;/FilesMatch&gt;
FallbackResource /index.php</pre>
</div>
    </div>

   </div>

   <p class="para">
    可以使用 <code class="literal">mod_rewrite</code> 将任意 <code class="literal">.php</code> 文件
    以语法高亮方式显示为源代码，而无需将其重命名或复制为
    <code class="literal">.phps</code> 文件：
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="apache-confcode"><pre class="apache-confcode">RewriteEngine On
RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]</pre>
</div>
    </div>

   </div>

   <p class="para">
    不应在生产系统上启用 PHP 源码过滤器，因为它可能暴露源代码中嵌入的
    机密信息或其他敏感信息。
   </p>
  </li>

  <li class="listitem">
   <p class="simpara">
    按常规方式启动 Apache httpd，例如：
   </p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
/usr/local/apache2/bin/apachectl start
</pre></div>
    </div>
   </div>

   <p class="para">或者</p>

   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
service httpd restart
</pre></div>
    </div>
   </div>
  </li>
 </ol>

 <p class="simpara">
  完成上述步骤后，将得到一个正在运行的 Apache httpd Web 服务器，
  并以 <code class="literal">SAPI</code> 模块形式支持 PHP。Apache httpd 和 PHP
  还有许多其他配置选项。要了解更多信息，请在相应源码树中运行
  <strong class="command">./configure --help</strong>。
 </p>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <strong>MPM 兼容性</strong><br />
  <p class="simpara">
   除非编译 PHP 时启用了 Zend 线程安全
   （<code class="literal">--enable-zts</code>），否则 <code class="literal">mod_php</code>
   要求使用 <code class="literal">prefork</code> MPM。有关原因，请阅读
   <a href="faq.installation.php#faq.installation.apache2" class="link">在线程化 MPM 中使用
   Apache httpd</a>的相关常见问题。
  </p>

  <p class="simpara">
   大多数发行版提供的 <code class="literal">mod_php</code> 软件包未启用 ZTS，
   因此通常需要 <code class="literal">prefork</code>。如果需要线程化 MPM
   （建议在负载下使用以获得更好的性能），请改用
   <a href="install.fpm.php" class="link">PHP-FPM</a> 和
   <code class="literal">mod_proxy_fcgi</code>。
  </p>
 </p></blockquote>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="simpara">
   <a href="faq.installation.php#faq.installation.apache.multiviews" class="link">Apache MultiViews
   常见问题</a>讨论了在 PHP 中使用 MultiViews。
  </p>
 </p></blockquote>
</div><?php manual_footer($setup); ?>