直接从源码编译 Apache 是一个相对复杂的过程,通常只在以下情况才会进行:

- 需要定制功能:默认安装的 Apache 包不包含你需要的特定模块(如
mod_security,mod_fcgid等)。 - 追求最新版本:你的系统仓库里的 Apache 版本过旧,需要使用最新的稳定版。
- 性能优化:针对特定的硬件和负载,进行深度编译优化。
- 学习与研究:为了深入理解 Apache 的内部工作原理。
对于绝大多数生产环境,强烈推荐使用操作系统自带的包管理器(如 apt, yum)来安装,因为它们已经处理好了依赖关系和配置,并且易于维护。
准备工作
在编译之前,必须安装好所有必需的依赖库和开发工具。
安装编译工具
# 对于 Debian/Ubuntu 系统 sudo apt update sudo apt install build-essential # 对于 CentOS/RHEL/Fedora 系统 sudo yum groupinstall "Development Tools" # 或者 (对于较新版本) sudo dnf groupinstall "Development Tools"
安装 Apache 依赖库
Apache 的许多功能都依赖于第三方库。
# 对于 Debian/Ubuntu 系统 sudo apt install libpcre3-dev libapr1-dev libaprutil1-dev libssl-dev zlib1g-dev # 对于 CentOS/RHEL/Fedora 系统 sudo yum install pcre-devel apr-devel apr-util-devel openssl-devel zlib-devel
依赖库说明:

libpcre3-dev / pcre-devel: PCRE (Perl Compatible Regular Expressions) 库,用于支持正则表达式,是mod_rewrite等模块的必需品。libapr1-dev / apr-devel: Apache 可移植运行时库,是 Apache 的核心依赖。libaprutil1-dev / apr-util-devel: APR 的工具库,提供了数据库访问等功能。libssl-dev / openssl-devel: 支持 HTTPS (SSL/TLS) 功能。zlib1g-dev / zlib-devel: 用于压缩模块,如mod_deflate。
下载 Apache 源码
从 Apache 官方网站 下载最新的稳定版源码包。
# 示例:下载 Apache 2.4.58 wget http://archive.apache.org/dist/httpd/httpd-2.4.58.tar.gz tar -zxvf httpd-2.4.58.tar.gz cd httpd-2.4.58
核心编译参数 (./configure)
./configure 脚本是编译过程的第一步,它的作用是检查你的系统环境,并根据你提供的参数生成适合当前系统的 Makefile。./configure 的参数决定了 Apache 的安装路径、启用哪些模块等。
基本语法
./configure [选项1] [选项2] ...
最简单的编译安装
这个安装会将 Apache 安装到 /usr/local/apache2,并包含最常用的模块。
./configure make sudo make install
常用编译参数详解
以下是一些最常用和重要的参数,通常组合使用。

安装路径
-
--prefix=PATH: 最重要的参数,指定 Apache 的安装根目录,默认是/usr/local/apache2。./configure --prefix=/opt/myapache
安装后,可执行文件(如
httpd)在/opt/myapache/bin,配置文件在/opt/myapache/conf。 -
--bindir=PATH: 指定可执行文件的安装目录(如httpd),默认是--prefix/bin。 -
--sysconfdir=PATH: 指定配置文件的安装目录(如httpd.conf),默认是--prefix/conf。 -
--datadir=PATH: 指定存放网页文件的目录,默认是--prefix/htdocs。 -
--logfiledir=PATH: 指定日志文件的存放目录,默认是--prefix/logs。 -
--enable-so: 强烈推荐,以 DSO (Dynamic Shared Object) 方式编译,允许在安装后动态加载/卸载模块,而不需要重新编译整个 Apache,这是现代 Apache 的标准做法。
模块控制
这是编译参数中最灵活的部分。
-
启用静态模块 (编译进主程序):
--enable-module=module_name: 启用一个静态模块,这种方式已不常用。--enable-mods-shared=ALL: 非常常用,将所有标准模块编译为 DSO 模块,动态加载,这是推荐的做法,因为它保持了核心程序的轻量。
-
启用特定模块:
--enable-rewrite: 启用mod_rewrite(URL 重写)。--enable-ssl: 启用mod_ssl(支持 HTTPS)。--enable-deflate: 启用mod_deflate(压缩传输)。--enable-expires: 启用mod_expires(控制页面缓存)。---enable-headers: 启用mod_headers(自定义 HTTP 头)。--enable-proxy: 启用代理模块。--enable-proxy-http: 启用 HTTP 代理。--enable-proxy-balancer: 启用负载均衡模块。--enable-vhost-alias: 启用基于域名的虚拟主机。
-
禁用模块:
--disable-module=module_name: 禁用一个标准模块,可以减小程序体积。
-
启用第三方模块:
- 有些模块(如
mod_security)需要先单独编译,然后通过--with-module参数指定路径,但更常见的做法是使用apxs工具在安装后动态添加。
- 有些模块(如
MPM (Multi-Processing Modules) 选择
Apache 的并发处理模型,必须选择一个。
--with-mpm=prefork: 默认值,一个进程处理一个连接,稳定,但资源消耗大,适用于需要与不兼容线程的模块(如mod_php)协同工作的场景。--with-mpm=worker: 使用多个线程来处理请求,资源利用率高,适用于处理大量并发连接,且所有模块都支持线程安全(如mod_php-fpm)。--with-mpm=event:worker的一个优化版本,专门用于处理 Keep-Alive 连接,性能更好,是目前推荐用于高并发场景的模型。
注意:只能选择一个 MPM。
性能与优化
--enable-mpm-event: 启用eventMPM 的写法。--with-mpm=event: 指定使用eventMPM 的写法。
系统用户和组
--with-username=user: 指定运行 Apache 的用户名,默认是daemon。--with-groupname=group: 指定运行 Apache 的组名,默认是daemon。 生产环境中,建议创建一个专门的用户和组,如www-data或apache。# 创建用户和组 sudo groupadd www-data sudo useradd -g www-data www-data # 编译时指定 ./configure --with-username=www-data --with-groupname=www-data
综合示例
这里提供一个比较完整的生产环境编译参数示例,它包含了常见的优化和功能需求。
#!/bin/bash
# 创建运行用户和组
sudo groupadd -r www-data
sudo useradd -r -g www-data www-data
# 进入源码目录
cd httpd-2.4.58
# 执行 configure
./configure \
--prefix=/opt/apache24 \
--enable-so \
--enable-mpm-event \
--enable-mods-shared=most \
--enable-ssl \
--enable-rewrite \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-proxy \
--enable-proxy-balancer \
--with-ssl=/usr/bin/openssl \
--with-username=www-data \
--with-groupname=www-data \
--with-included-apr
# 编译和安装
make -j$(nproc) # -j$(nproc) 使用所有CPU核心进行并行编译,加快速度
sudo make install
参数解释:
--prefix=/opt/apache24: 安装到/opt/apache24。--enable-so: 启用 DSO。--enable-mpm-event: 使用高效的 event MPM。--enable-mods-shared=most: 将大部分常用模块编译为 DSO。--enable-ssl,--enable-rewrite, ...: 启用常用功能模块。--with-included-apr: 使用源码包自带的 APR 库,避免系统库版本过低或不兼容的问题。
编译安装后的步骤
-
检查配置文件:
/opt/apache24/bin/apachectl configtest
如果输出
Syntax OK,说明配置文件没有语法错误。 -
启动服务:
/opt/apache24/bin/apachectl start
-
设置开机自启: 编译安装的 Apache 通常不会自带 systemd 服务文件,需要手动创建。 创建文件
/etc/systemd/system/apache24.service:[Unit] Description=The Apache HTTP Server After=network.target [Service] Type=forking User=www-data Group=www-data ExecStart=/opt/apache24/bin/apachectl start ExecReload=/opt/apache24/bin/apachectl graceful ExecStop=/opt/apache24/bin/apachectl stop PIDFile=/opt/apache24/logs/httpd.pid [Install] WantedBy=multi-user.target
然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable apache24 sudo systemctl start apache24
编译后动态添加模块
如果编译时忘记启用某个模块,并且该模块支持 DSO,可以使用 apxs 工具在安装后动态添加,而无需重新编译。
-
安装
apxs的依赖:# Debian/Ubuntu sudo apt install apache2-dev # CentOS/RHEL sudo yum install httpd-devel
注意:这里的
apache2-dev或httpd-devel是提供apxs工具的包,即使你编译安装了自己的 Apache,通常也需要它来辅助编译第三方模块。 -
编译并安装第三方模块(以
mod_fcgid为例):# 下载 mod_fcgid 源码 wget https://github.com/httpd-mod-fcgid/mod_fcgid/archive/refs/tags/2.3.9.tar.gz tar -xzf 2.3.9.tar.gz cd mod_fcgid-2.3.9 # 使用 apxs 编译 /opt/apache24/bin/apxs -i -a -c mod_fcgid.c
-i: 安装模块。-a: 自动在httpd.conf中添加LoadModule指令。-c: 只编译,不安装。
完成上述步骤后,模块就被动态加载了,重启 Apache 即可生效。
| 类别 | 常用参数 | 作用 |
|---|---|---|
| 基础路径 | --prefix=/path/to/install |
核心,指定安装根目录 |
| 模块 | --enable-so |
启用 DSO,强烈推荐 |
--enable-mods-shared=ALL |
将所有标准模块编译为 DSO | |
--enable-rewrite, --enable-ssl |
启用特定功能模块 | |
| MPM | --with-mpm=event |
选择高性能的 event MPM |
| 用户/组 | --with-username=www-data |
指定运行 Apache 的用户 |
| 优化 | --with-included-apr |
使用自带的 APR 库,避免兼容问题 |
| 编译 | make -j$(nproc) |
使用多核并行编译,加快速度 |
请根据你的具体需求,组合使用这些参数,编译安装意味着你需要自己承担维护和更新的责任。
