Unix 系统上的 Apache 2.x

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

警告

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

有关 Apache 2.x 服务器的权威信息来源是 » Apache 文档。更多关于 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
    

    如果您决定在安装后更改配置选项,则需要重新运行配置、make 和 make 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 来构建多线程。这可以通过在上面的步骤 3 中传递给 ./configure 的参数中添加以下选项来完成

--with-mpm=worker

在没有意识到此决定的后果,并且至少对这些含义有一定了解的情况下,不应该这样做。有关 » MPM-模块 的 Apache 文档更详细地讨论了 MPM。

注意:

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

注意:

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

添加注释

用户贡献的注释 17 个注释

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
1 年前
我刚刚在用于编写 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 包。

apache2 指令在 php8.1.12 期间运行良好;为了满足应用程序的某些需求,我必须像这样运行 php 配置文件

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

额外的标志允许我使用两种类型的 mysql,允许我利用 PHP zip 归档,并允许我使用 Gnatt 东西。
Tom420.Duhamel
15 年前
我已经成功地在配备 Pentium 166 和 32 MB 内存的 Red Hat 9.0 上安装了 Apache 2.2.11 和 PHP 5.2.8。

虽然我使用了 RH9(最糟糕的情况),但这些说明可能也适用于基于 RH 的发行版(Red Hat Enterprise、Fedora、CentOS…)

如果您想安装 MySQL,它需要在 PHP 之前安装,因为 PHP 需要一些库可用。

选择 MySQL 二进制发行版时,有一点很重要,那就是下载所有四个软件包:MySQL-server、MySQL-devel、MySQL-client 和 MySQL-shared。注意:MySQL 与 PHP 4 捆绑在一起,但在 PHP 5 中不再捆绑。

然后你需要在 PHP 之前安装 Apache,因为 PHP 又需要一些库可用。我从源代码安装了 Apache 2,使用的是最新的可用版本,即 2.2.11。

我从源代码安装了 PHP 5.2.8。在这里,我遇到了一些问题,但没有一个是我无法轻松解决的,其中一些问题是在 Google 上找到的不同论坛的帮助下解决的。

记住:当它说你需要一个名为 xyz 的软件包时,你注意到还有一个名为 xyz-devel 的软件包,就获取它。

我从以下位置获取的大多数软件包:
http://legacy.redhat.com/pub/redhat/linux/9/en/os/i386/RedHat/RPMS/
其他版本的 Red Hat 也存在类似的页面
以及
http://rpmfind.net/
此站点提供了一些软件包的更新版本。确保只使用标记为你的版本的软件包(在我的情况下,是 Red Hat 9.0),否则它可能无法正常工作。

你已经安装了 glibc 和 glibc-common,但你需要获取 glibc-devel 和 glibc-kernheaders。确保与 glibc 的版本匹配(rpm -q glibc)。注意:当它说 kernel-header 是必需的依赖项时,那是 glibc-kernheader(不是 kernel-source)。你还需要 binutils(无需匹配版本),以及 gcc 和 cpp(版本必须匹配)。

你需要 zlib-devel(zlib 可能已经安装,匹配你的版本)。

如果你安装了 GD 扩展,实际库已经与 PHP 5 捆绑在一起(使用那个,他们在那里做了一些更改,所以不要升级),但你需要安装 libpng 和 libpng-devel(匹配版本,或者如果你不想要就禁用在配置中)和 libjpeg(那个没有 -devel)。

你还需要 libxml2。现在出现了一个问题,因为 PHP 需要 libxml2 版本为 2.6 或更高,但 Red Hat 只为 RH9 提供了 2.5.4-1(如果你有更新的发行版,你可能会更幸运)。在寻找了一段时间后,我决定从官方网站(http://xmlsoft.org/)获取最新发行版的源代码并编译。

希望我的帖子对某人有用。请在为你的特定平台和设置编译/安装时分享你的经验。记住你第一次经历有多难。我承认,我的第一个服务器安装花了近一周的时间,我很高兴其他人帮助了我。
1097625354 at qq dot com
5 年前
解析 PHP,需要 Apache 2.4.9 以后
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
happyboy at php dot org
19 年前
文件被截断!

在 make 过程中,如果你收到一个声明 ext/ctype/ctype.lo(或另一个文件)被截断的错误,那么你需要在进行健康的 'make' 和 'make install' 之前执行 'make clean'。

查看你的 ext/ 目录,你可能会发现有问题的文件只有 1 字节长。
Anonymous
7 年前
在 Debian 8 上使用 mysql 5.7.17 和 httpd 2.4.25 构建 php 7.1.3,步骤 5 对我来说失败了。不是

--with-mysql

尝试

--with-pdo-mysql



--with-mysqli
svepa at milestone42 dot com
12 年前
在 64 位 Fedora 系统上(我使用的是 Fedora 14),如果你按照本手册中的默认说明,将 PHP 配置为使用作为发行版的一部分安装的 MySQL 库,会导致以下错误。

无法在 /usr 下找到 libmysqlclient

修改以下对 configure 的调用,如下所示

./configure --with-apxs2=/path/to/apxs --with-libdir=lib64 --with-mysql

应该可以工作。

注意增加了 --with-libdir=lib64
这将配置脚本指向寻找 64 位 mysqlclient 库的位置。
felixcca at yahoo dot ca
18 年前
我(痛苦地)发现,在 SuSe 9.2 下使用 "make install" 安装 PHP5 不是一个好主意。
http://www.aditus.nu/jpgraph/apache2suse.php
此页面解释了如何在不破坏 Apache2 配置中与 php 相关的任何内容的情况下安装它。不过,它的首要目的是展示如何让 php 4 和 5 正确地共存。
praveen dot k at masconit dot com
19 年前
嗨,我也遇到了与多视图相同的问题,例如,当我执行 http://huey/admin/test.php 时,它曾经可以编译,但当我使用 http://huey/admin/test 时,它无法识别它为 php 文件……我通过在不同的行中使用 addhandler 方法和 AddType 以及为指令设置多视图解决了这个问题

"multiviews Options Indexes FollowSymLinks MultiViews"

你可以将这些指令设置到根目录,因此现在当你键入 pn test 时,它将按优先级顺序搜索 test.php、test.html(如果有)……

它在我的 Solaris 上的 apache2.0.47 和 php 4.3.9 上运行良好

praveen
Anonymous
15 年前
Fedora 的解决方案是 yum install mysql-devel。然后设置 --with-mysql=/usr/include/mysql/
monguesto
frank@ethisoft
18 年前
使用 Apache2 & PHP5 可以完美地安全地协同工作。
- 所有核心模块在 Zend Engine 2 中都是安全的
- 应该避免使用第三方库
- 信号量和共享内存使你能够确保你的应用程序/网站在使用非线程安全的 PHP 模块时也是线程安全的!
Dan Scott (dan dot scott at acm dot org)
19 年前
在 SuSE Professional 9.1/9.2 上使用 Apache2 构建 PHP 5.x

SuSE 使用一组相当分散的 Apache 配置文件,存储在 /etc/apache2/ 中。当你使用以下命令配置 PHP 5.x 时

$ ./configure --with-apxs2=/usr/sbin/apxs2
$ make

一切都构建得很好;但当你发出以下命令时
$ su -c "make install"

非传统的 Apache conf 文件布局会混淆 Makefile 中的 install-sapi 部分,并且该过程会因以下错误而停止

apxs:Error: Config file /etc/apache2/httpd2-prefork.conf not found.
make: *** [install-sapi] Error 1

此时,只有 PHP SAPI 库已被复制到指定位置;其余文件(如 PEAR 脚本、PHP-CLI 等)尚未安装。但不要害怕!你可以通过以下步骤克服这个问题

1. 编辑 Makefile 并更改以下行以删除 "install-sapi"
install_targets = install-sapi install-cli install-pear install-build install-headers install-programs

2. 再次发出 make install 命令
$ su -c "make install"

3. 将 PHP 模块和类型说明添加到 Apache 配置中。以 root 身份创建一个新文件 /etc/apache2/conf.d/php5.conf,其中包含以下几行

LoadModule php5_module /usr/lib/apache2/libphp5.so
AddType application/x-httpd-php php

--- 就这样。其他一切如文档所述。
neil
19 年前
要使用 PHP5 安装 mysql 和 mysqli,请执行以下操作

在完成以下操作之后

./configure --with-mysql=/path/to/mysql_config --with-mysqli=/path/to/mysql_config

执行此操作

"
如果你想同时使用旧的 mysql 和新的 mysqli 接口,请将 Makefile 加载到你的编辑器中,并搜索以 EXTRA_LIBS 开头的行;它包含 -lmysqlclient 两次;删除第二个实例
"

然后你可以

make
make install

.....
请注意:你必须安装 mysql-dev(RPM 或源代码),否则你根本没有 mysql_config 文件。MySQL 的标准、服务器和客户端安装不包含它。我从某个地方读到 mysql 和 mysqli 的路径必须相同。

摘自 Michael Kofler 在以下链接中的内容
http://www.kofler.cc/forum/forumthread.php?rootID=3571
chris@gerlt -dot- net
17 年前
Redhat 上的安装问题,特别是已经安装了 php4 的 RHEL4

我发现 redhat 在另一个与 httpd.conf 文件分离的文件中加载 php4 导致了一个问题!这让我花了几个小时才发现。确保你知道 apache 配置文件 (httpd.conf) 是否也在从目录(或其他文件)加载配置。如果是这样,请查看其中是否有任何 php 模块加载,这可能会与你正在编译/安装的新模块发生冲突。
dfeprado at gmail dot com
10 个月前
在为 Ubuntu 22.04 + Apache2 HTTPD(默认仓库提供的那个)编译时,在启动 apache2.service 时,你可能会遇到以下错误

"Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP."

所以,我回到 PHP 源代码并像这样配置它

$ make clean
$ ./configure [...所有构建需求] --enable-zts
$ make
$ sudo make install

然后它就成功了。
susie91
17 年前
适用于使用 apache2、mysql5 尝试安装 php5 的 slackware 10.2 用户

按照上面的说明,完成以下步骤之后

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql

我一直收到这个错误
"无法找到 MySql 头文件..."

我能够使用 php5 并获得 mysql 支持的唯一方法是从源代码编译 MySql5,而不是使用 mysql 网站推荐的二进制文件。

然后我能够成功地执行 ./configure,但由于某种原因,php 被配置为编译 CGI 版本。

因此,我不得不使用以下 ./configure 行

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql --disable-cgi

或者,你可以安装捆绑了 MySql 客户端文件的 php4。
jaya
18 年前
在 Solaris 9(Sparc)上安装 PHP 5.1.4

已安装的 Solaris9 软件包

验证所需软件包的安装
root# pkginfo SUNWbtool SUNWsprot SUNWtoo SUNWhea SUNWarc \
SUNWlibm SUNWlibms SUNWdfbh SUNWxglh SUNWcg6h

卸载默认的 Apache 软件包
root# /etc/init.d/apache stop
root# pkginfo |grep Apache
root# pkgrm SUNWaclg SUNWapchd SUNWapchr SUNWapchu

创建安装目录
root# mkdir /phpdata/

从 Sunfreeware 下载所需的软件包

安装 libiconv-1.8 和 gcc3.3.2 软件包
root# pkgadd -d ./libiconv-1.8-sol9-sparc-local
root# pkgadd -d ./gcc-3.3.2-sol9-sparc-local

设置 LD_LIBRARY_PATH、CC 和 PATH 变量
root# LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/sparcv9/:\
/usr/lib:/usr/openwin/lib:/opt/local/lib:/usr/local/ssl/lib:\
/usr/local/apr/lib:/opt/mysql/mysql/lib
root# CC=gcc
root# PATH=$PATH:/usr/ucb:/usr/local/bin/
root# export LD_LIBRARY_PATH CC PATH

安装 apr-1.2.2 和 aprutil-1.2.2 软件包

root# gzcat apr-1.2.2.tar.gz |tar xvf -
root# cd apr-1.2.2
root# ./configure
root# make
root# make install
root# cd ..

root# gzcat aprutil-1.2.2.tar.gz |tar xvf -
root# cd apr-util-1.2.2/
root# ./configure --with-apr=/usr/local/apr/
root# make
root# make install

安装 gawk-3.1.4、expat-1.95.5、db-4.2.52.NC、
gdbm-1.8.3、libgcc-3.3 和 libxml2-2.6.16 软件包
root# cd ..
root# pkgadd -d ./gawk-3.1.4-sol9-sparc-local
root# pkgadd -d ./expat-1.95.5-sol9-sparc-local
root# pkgadd -d ./db-4.2.52.NC-sol9-sparc-local
root# pkgadd -d ./gdbm-1.8.3-sol9-sparc-local
root# pkgadd -d ./libgcc-3.3-sol9-sparc-local
root# pkgadd -d ./libxml2-2.6.16-sol9-sparc-local

安装 GNU make 软件包
root# gzcat make-3.81.tar.gz |tar xvf -
root# cd make-3.81
root# ./configure
root# make
root# make install
root# cd ..

安装 mysql-standard-5.0.22 软件包
搜索用户 mysql
root# grep mysql /etc/passwd
root# grep mysql /etc/group

如果未找到,创建用户和组 mysql
root# groupadd mysql
root# useradd -G mysql mysql
root# pkgadd -d ./mysql-standard-5.0.22-solaris9-sparc.pkg.gz

安装 openssl-0.9.7g 包
root# gzcat openssl-0.9.7g.tar.gz |tar xvf -
root# cd openssl-0.9.7g
root# ./config shared
root# make
root# make install
root# cd ..

安装 Apache2 包
root# gzcat httpd-2.2.0.tar.gz |tar xvf -
root# cd httpd-2.2.0
root# ./configure --enable-so
root# /usr/local/bin/make
root# /usr/local/bin/make install
root# cd ..

安装 php-5.1.4 包
root# gzcat php-5.1.4.tar.gz |tar xvf -
root# cd php-5.1.4
root# ./configure --with-apxs2=/usr/local/apache2/bin/apxs\
--with-ldap --with-mysql=/opt/mysql/mysql/
root# /usr/local/bin/make
root# /usr/local/bin/make install
root# cp php.ini-dist /usr/local/lib/php.ini

编辑 httpd.conf 以加载 PHP 模块
并将某些扩展解析为 PHP
root# vi /usr/local/apache2/conf/httpd.conf
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php .phtml

启动 Apache
root# /usr/local/apache2/bin/apachectl start

在 HTTPD 下添加环境变量
root# vi /usr/local/apache2/bin/apachectl
LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/sparcv9/
/usr/lib:/usr/openwin/lib:/opt/local/lib:/usr/local/ssl/lib
/usr/local/apr/lib:/opt/mysql/mysql/lib
PATH=/bin:/sbin:/usr/ccs/bin:/usr/sbin:/usr/openwin/bin:\
/usr/ucb:/usr/local/bin/
export LD_LIBRARY_PATH PATH

创建 Apache 启动脚本
To Top