概述
本章,您将学习到 Apache httpd 的安装。
您可以采用三种方式来安装 Apache httpd:
- 使用存储库来安装 Apache httpd
- 使用 Docker 容器技术运行 Apache httpd
- 编译 Apache httpd 的源代码进行安装
使用存储库进行安装
作者使用的操作系统为 RL 8.10,相关操作如下:
Shell > dnf module list httpd
Rocky Linux 8 - AppStream
Name Stream Profiles Summary
httpd 2.4 [d] common [d], devel, minimal Apache HTTP Server
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
# 这里使用 httpd 的默认流即可
Shell > dnf -y module enable httpd:2.4 && dnf -y module install httpd:2.4/common
Shell > dnf module list httpd
Last metadata expiration check: 0:03:18 ago on Sat 13 Jun 2026 07:30:14 PM CST.
Rocky Linux 8 - AppStream
Name Stream Profiles Summary
httpd 2.4 [d][e] common [d] [i], devel, minimal Apache HTTP Server
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
使用 Docker 容器技术运行 Apache httpd
Apache httpd 有两种镜像,一种是 Docker 官方构建的社区版镜像,一种是适用于企业级生产环境的 DHI(Docker Hardened Images,增强版镜像),前者可以被匿名用户拉取,后者需要使用者登录(docker login)。
这里使用的是社区版镜像,相关操作如下:
Shell > systemctl start docker.service
Shell > docker pull httpd:latest
# 绑定数据卷,即目录映射过文件映射
## 若您已经在宿主机中准备好了 httpd.conf 配置文件,也可以使用 "-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf"
Shell > mkdir -p /httpd/ && cd /httpd/
Shell > docker run -d --name "my-httpd" -p 80:80 -p 443:443 \
-v $PWD/www/:/usr/local/apache2/htdocs/ \
-v $PWD/logs/:/usr/local/apache2/logs/ \
httpd:latest
Shell > docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
966be10672d5 httpd:latest "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp my-httpd
编译 Apache httpd 的源代码进行安装(推荐)
对于 Apache httpd 而言,除非主版本与次要版本发生变化,否则通常情况下都不太需要对软件包进行升级变更,所以这里推荐使用编译源代码的方式进行安装。
编译安装所需的前提条件:
- 需要 APR 和 APR-Util - 这是一个软件库,主要目的是提供一个 API ,保证移植在不同平台时其行为和特性都是可预测和相同的,相关下载需要点击 这里
- PCRE2 - 必需的正则表达式库,相关下载需要点击 Github PCRE2
- 磁盘空间 - 至少保证有 200MB 的空闲磁盘空间
- 必要的 ANSI-C 编译器以及构建工具 - 常见如
gcc和make - 准确的时间 - 可利用 chrony 工具来同步时间
- Perl 5 - 可选,一些脚本可能需要 Perl 5 解释器
前提条件准备:
Shell > cd
Shell > wget https://dlcdn.apache.org//apr/apr-1.7.6.tar.gz
Shell > wget https://dlcdn.apache.org//apr/apr-util-1.6.3.tar.gz
Shell > wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.47/pcre2-10.47.tar.gz
# APR
Shell > tar -vxf apr-1.7.6.tar.gz -C /usr/local/src/
Shell > cd /usr/local/src/apr-1.7.6/
Shell > ./configure --prefix=/usr/local/apr && make && make install
# APR-Util
Shell > cd
Shell > tar -vxf apr-util-1.6.3.tar.gz -C /usr/local/src/
Shell > dnf -y install expat-devel
Shell > cd /usr/local/src/apr-util-1.6.3/
Shell > ./configure --with-apr=/usr/local/apr/bin/apr-1-config --prefix=/usr/local/apr-util && make && make install
# PCRE 2
Shell > cd
Shell > dnf -y install gcc gcc-c++
Shell > tar -vxf pcre2-10.47.tar.gz -C /usr/local/src/
Shell > cd /usr/local/src/pcre2-10.47/
Shell > ./configure --prefix=/usr/local/pcre2 && make && make install
开始编译 Apache httpd 并进行安装:
Shell > cd
Shell > wget https://dlcdn.apache.org/httpd/httpd-2.4.68.tar.bz2
Shell > tar -xvf httpd-2.4.68.tar.bz2 -C /usr/local/src/
下面列出了一些常见且比较关键的编译选项:
| 编译选项 | 说明 | 可选或必选 |
|---|---|---|
--prefix=PATH |
指定 httpd 的安装根目录 | 必选 |
--enable-so |
启用 DSO(Dynamic Shared Object,动态共享对象)支持 | 必选 |
--enable-ssl |
启用 HTTPS 支持(mod_ssl) | 必选 |
--enable-rewrite |
启用 URL 重写模块(mod_rewrite) | 必选 |
--with-apr=PATH |
指定 apr-1-config 文件路径 | 必选 |
--with-apr-util=PATH |
指定 apu-1-config 文件路径 | 必选 |
--with-pcre=PATH |
指定 PCRE 或 PCRE 2 的目录路径位置 | 必选 |
--with-zlib=PATH |
指定 zlib 压缩库的路径,配合 mod_deflate 使用,可对 HTTP 内容进行 gzip 压缩,节省带宽 | 必选 |
--with-openssl=PATH |
指定 OpenSSL 库的安装路径,供 mod_ssl 使用 | 必选 |
--enable-expires |
允许设置 HTTP 缓存过期头,有助于浏览器缓存管理,优化性能 | 必选 |
--enable-charset-lite |
启用字符集转换支持,方便处理不同编码的页面 | 必选 |
--enable-mpms-shared=all |
将所有 MPM(多处理模块)编译为动态模块,之后可在配置中灵活切换 prefork、worker、event 等工作模式。配合 --with-mpm=MPM 可指定默认模式,例如 --with-mpm=event | 必选 |
有些编译选项不带选项值时会自动从操作系统中寻找相关的库。若需要查看所有的编译选项,查阅 这里
Shell > cd /usr/local/src/httpd-2.4.68/
Shell > ./configure \
--prefix=/usr/local/apache2/ \
--enable-so \
--enable-ssl \
--enable-rewrite \
--with-apr=/usr/local/apr/bin/apr-1-config \
--with-apr-util=/usr/local/apr-util/bin/apu-1-config \
--with-pcre=/usr/local/pcre2/ \
--with-zlib \
--with-openssl \
--enable-expires \
--enable-charset-lite \
--enable-mpms-shared=all \
&& make && make install
# 这是编译安装过后的相关目录
Shell > ls -l /usr/local/apache2/
total 56
drwxr-xr-x 2 root root 4096 Jun 13 22:42 bin
drwxr-xr-x 2 root root 4096 Jun 13 22:42 build
drwxr-xr-x 2 root root 4096 Jun 13 22:42 cgi-bin
drwxr-xr-x 4 root root 4096 Jun 13 22:42 conf
drwxr-xr-x 3 root root 4096 Jun 13 22:42 error
drwxr-xr-x 2 root root 4096 Jun 13 22:42 htdocs
drwxr-xr-x 3 root root 4096 Jun 13 22:42 icons
drwxr-xr-x 2 root root 4096 Jun 13 22:42 include
drwxr-xr-x 2 root root 4096 Jun 13 22:42 logs
drwxr-xr-x 4 root root 4096 Jun 13 22:42 man
drwxr-xr-x 14 root root 12288 Jun 13 22:42 manual
drwxr-xr-x 2 root root 4096 Jun 13 22:42 modules
目录说明
-
bin 目录 - 存放二进制可执行文件的目录
-
build 目录 - 保存当初构建时的一些,信息比如 /usr/local/apache2/build/config.nice 文件的内容即当初编译的选项
-
cgi-bin 目录 - 专门用来存放 CGI 程序(通用网关接口程序)的特殊目录。历史上,/cgi-bin/ 目录下曾出现过多次严重的安全漏洞,所以在使用该目录下的文件时需要严格控制权限。所谓 CGI,即一种根据请求信息动态产生回应内容的技术,现如今的 CGI 普遍是经过改良的 FastCGI
-
conf 目录 - 存放配置文件的目录
-
error 目录 - 存放错误信息页面的目录
-
htdocs 目录 - 存放网页文件的目录,默认只有一个 index.html
-
icons 目录 - 小图标文件的存放位置,比如目录图标、文件图标以及不同文件类型(文本、图片、压缩文件、未知文件等)的图标
-
logs 目录 - 日志文件所存放的目录。通常情况下会存在三个文件:access_log(访问日志)、error_log(错误日志)、httpd.pid(进程 ID 文件)。如果服务器启用了 SSL/TLS,logs 目录下还可能额外出现 ssl_access_log、ssl_error_log 和 ssl_request_log 三个专用于记录 HTTPS 相关访问、错误及握手请求信息的日志文件。
-
man 目录和 manual 目录 - 手册文件所存放的目录
-
modules 目录 - 存放 DSO(Dynamic Shared Object,动态共享对象)文件的专用目录,这些文件都以 .so 后缀结尾
配置文件结构简短说明
Shell > ls -l /usr/local/apache2/conf/
total 104
drwxr-xr-x 2 root root 4096 Jun 13 22:42 extra
-rw-r--r-- 1 root root 18664 Jun 13 22:42 httpd.conf
-rw-r--r-- 1 root root 13064 Jun 13 22:42 magic
-rw-r--r-- 1 root root 61109 Jun 13 22:42 mime.types
drwxr-xr-x 3 root root 4096 Jun 13 22:42 original
在 conf 目录中除了主配置文件 httpd.conf 外,还存在 extra 目录和 original 目录:
- extra 目录 - 存放着按功能拆分的扩展配置文件的目录,默认情况下里面的文件都没有被加载
- original 目录 - 在初次安装或升级 Apache httpd 时,安装程序会把原始的、未经修改的配置文件备份到该目录里
如果要修改 Apache httpd 的配置,既可以把所有的配置参数写入到 httpd.conf 文件中,也可以在 httpd.conf 中使用 Include 指令加载其他的配置文件。
关于配置文件的具体内容说明,后面会有专有文档进行说明。
DSO 技术
Apache httpd 采用的是模块化架构,其核心只包含主要功能,而拓展功能则通过模块实现。所谓模块化,指将各个功能和特性进行分离,这么做的好处有:
- 拓展性强 - 需要什么功能就加载什么模块,不用修改核心代码,通过 LoadModule 指令配置后 reload 即可生效或停用,非常灵活
- 依赖性弱 - 各个模块功能独立、接口清晰,一个模块的改动不会影响其他模块,模块之间通过标准化的钩子(hook)机制协作,耦合度很低
- 方便后期维护 - 问题定位更容易,出问题时可以快速排查是哪个模块导致的;升级、修复也只需要替换对应的模块,不需要重新编译整个服务器
提到模块,就不得不提到 DSO(Dynamic Shared Object,动态共享对象)技术,模块的动态加载就是通过 DSO 实现的。所谓「动态加载」,指的是需要新功能时,只需要把功能模块编译出来并通过配置文件加载到 Apache httpd 服务当中,而不需要重新编译整个 Apache httpd。不像有些开源的程序/服务,一旦编译且安装完成后,其功能都是固定的,当需要添加新功能时,必须要重新编译整个程序/服务。
列出所有已经编译进 Apache 内核的静态模块:
Shell > /usr/local/apache2/bin/apachectl -l
Compiled in modules:
core.c
mod_so.c
http_core.c
显示当前 Apache 服务器已加载的所有模块(包括编译进内核的静态模块,也包括通过 LoadModule 指令动态加载的模块):
Shell > /usr/local/apache2/bin/apachectl -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
mpm_event_module (shared)
authn_file_module (shared)
authn_core_module (shared)
authz_host_module (shared)
authz_groupfile_module (shared)
authz_user_module (shared)
authz_core_module (shared)
access_compat_module (shared)
auth_basic_module (shared)
reqtimeout_module (shared)
filter_module (shared)
mime_module (shared)
log_config_module (shared)
env_module (shared)
headers_module (shared)
setenvif_module (shared)
version_module (shared)
unixd_module (shared)
status_module (shared)
autoindex_module (shared)
dir_module (shared)
alias_module (shared)
括号里标注 static,表示该模块已静态编译进 Apache 内核,即所谓的静态编译模块;而标注为 shared,则表示该模块以 DSO 方式动态加载,即所谓的动态加载模块。











