PHP Conference Japan 2024

Unix 系统上的 Apache 2.x

本节包含有关在 Unix 系统上安装 PHP 的 Apache 2.x 的特定说明和提示。

警告

我们不建议在生产环境中使用带线程的 MPM 与 Apache 2 一起使用。使用 prefork MPM,它是 Apache 2.0 和 2.2 的默认 MPM。有关原因的信息,请阅读与使用带线程的 MPM 的 Apache2相关的常见问题解答条目。

» Apache 文档是有关 Apache 2.x 服务器的最权威信息来源。有关 Apache 的安装选项的更多信息可以在那里找到。

Apache HTTP 服务器的最新版本可以从» Apache 下载站点获取,并且可以在上面提到的位置找到合适的 PHP 版本。本快速指南仅涵盖 Apache 2.x 和 PHP 入门的基础知识。有关更多信息,请阅读» Apache 文档。此处已省略版本号,以确保说明不正确。在下面的示例中,'NN' 应替换为正在使用的 Apache 的特定版本。

目前有两个版本的 Apache 2.x - 有 2.4 和 2.2。虽然选择每个版本的原因有很多,但 2.4 是当前的最新版本,也是推荐的版本,如果您可以使用该选项。但是,此处的说明适用于 2.4 或 2.2。请注意,Apache httpd 2.2 已正式停止支持,并且不会为其发布新的开发或补丁。

  1. 从上面列出的位置获取 Apache HTTP 服务器,并将其解压

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

    tar -xzf php-NN.tar.gz
    
  3. 构建并安装 Apache。有关构建 Apache 的更多详细信息,请参阅 Apache 安装文档。

    cd httpd-2_x_NN
    ./configure --enable-so
    make
    make install
    
  4. 现在您可以在 /usr/local/apache2 下使用 Apache 2.x.NN,配置了可加载模块支持和标准 MPM prefork。要测试安装,请使用您启动 Apache 服务器的正常程序,例如

    /usr/local/apache2/bin/apachectl start
    
    并停止服务器以继续进行 PHP 配置
    /usr/local/apache2/bin/apachectl stop
    

  5. 现在,配置并构建 PHP。在这里,您可以使用各种选项自定义 PHP,例如将启用哪些扩展。运行./configure --help以获取可用选项的列表。在我们的示例中,我们将使用 Apache 2 和 MySQL 支持进行简单的配置。

    如果您如上所述从源代码构建了 Apache,则以下示例将与您apxs的路径匹配,但如果您以其他方式安装了 Apache,则需要相应地调整apxs的路径。请注意,某些发行版可能会将apxs重命名为apxs2

    cd ../php-NN
    ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
    make
    make install
    

    如果您决定在安装后更改配置选项,则需要重新运行configuremakemake install步骤。您只需要重新启动 apache 才能使新模块生效。不需要重新编译 Apache。

    请注意,除非另有说明,否则make install还会安装» PEAR、各种 PHP 工具(如phpize)、安装 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可能已经为您添加了此路径,但请务必检查。

    对于 PHP 8

    LoadModule php_module modules/libphp.so

    对于 PHP 7

    LoadModule php7_module modules/libphp7.so
  8. 告诉 Apache 将某些扩展解析为 PHP。例如,让我们让 Apache 将.php文件解析为 PHP。我们不想仅仅使用 Apache 的AddType指令,而是要避免潜在的危险上传和创建的文件(例如exploit.php.jpg)被执行为 PHP。使用此示例,您可以通过简单地添加任何扩展来使其解析为 PHP。我们将添加.php进行演示。

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

    或者,如果我们希望允许.php.php2.php3.php4.php5.php6.phtml文件作为 PHP 执行,但其他文件不执行,我们将使用以下内容

    <FilesMatch "\.ph(p[2-6]?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>

    并且要允许.phps文件由 php 源代码过滤器处理,并显示为语法高亮显示的源代码,请使用以下内容

    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>

    mod_rewrite可用于允许显示任何任意.php文件作为语法高亮显示的源代码,而无需将其重命名或复制到.phps文件

    RewriteEngine On
    RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]

    php 源代码过滤器不应在生产系统上启用,在生产系统上,它可能会泄露嵌入在源代码中的机密或其他敏感信息。

  9. 使用您启动 Apache 服务器的正常程序,例如

    /usr/local/apache2/bin/apachectl start
    

    service httpd restart
    

按照上述步骤,您将拥有一个运行的 Apache2 Web 服务器,并支持 PHP 作为SAPI模块。当然,Apache 和 PHP 还有更多配置选项可用。有关更多信息,请在相应的源代码树中键入./configure --help

Apache 可以通过在构建 Apache 时选择worker MPM 而不是标准的prefork MPM 来构建多线程。这是通过在传递给./configure的参数中添加以下选项来完成的,如上文步骤 3 所示

--with-mpm=worker

在没有意识到此决定的后果并至少对含义有相当的了解的情况下,不应进行此操作。关于» MPM 模块的 Apache 文档更详细地讨论了 MPM。

注意:

Apache MultiViews 常见问题解答讨论了将 multiviews 与 PHP 一起使用。

注意:

要构建 Apache 的多线程版本,目标系统必须支持线程。在这种情况下,PHP 也应该使用 Zend Thread Safety (ZTS) 构建。在此配置下,并非所有扩展都可用。建议的设置是使用默认的prefork MPM 模块构建 Apache。

添加注释

用户贡献的注释 2 个注释

nmmm at nmmm dot nu
15 年前
当我升级到 apache 2.2 时,这

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

...对我不起作用,所以我做了这个

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

Apache 2.2 的另一个有趣之处在于。
假设我们将 PHP 作为模块安装。但对于某些目录,我们需要将 PHP 用作 CGI(可能是由于自定义配置)。这可以通过使用以下方法完成

<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

请注意,类型必须不同于“application/x-httpd-php”,并且您还需要停用某些扩展上的处理程序。您可以进行混合配置

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

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

在这种情况下,像 *.php5 这样的文件将通过模块解析,但 *.php 将转到 php-huge 可执行文件。
Morning Star
2 年前
我刚刚在用于编写 C 代码的机器上安装了 php8.1.12。

以下是我需要在基于 Debian 的操作系统上下载的一些库。

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

这些是我需要的缺失包。
如果您收到有关缺少包或库的错误,例如当我需要 sqlite3 时,请运行以下命令

apt search sqlite3

您将能够看到是否有任何 dev 或 lib 包。



在 php8.1.12 版本时,apache2 的指令运行完美;为了满足应用程序的某些需求,我不得不像这样运行 php 配置文件

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

这些额外的标志允许我使用两种类型的 mysql,允许我利用 PHP zip 归档,并允许我使用 Gnatt 相关功能。
To Top