结论: Apache(httpd)配置的核心是"全局配置 + 虚拟主机(VirtualHost)+ 目录级 .htaccess 覆盖"三层结构。安装后先在 httpd.conf / apache2.conf 设全局参数,再用 定义站点,按需开启 .htaccess。性能关键是选对 MPM(多处理模块):PHP 用 mpm_prefork 或 mpm_event + PHP-FPM,纯静态和高并发推荐 mpm_event。
引言:2026 年还用 Apache 吗?
Nginx 的市场份额早已超过 Apache,但 Apache 远没有过时。它最大的两个优势至今无人替代:一是 .htaccess 目录级配置——虚拟主机商无法给每个用户 reload 服务,靠 .htaccess 让用户自己改重写规则;二是模块生态极其丰富(截至 2026 年官方与第三方模块数百个),mod_rewrite、mod_security、mod_proxy 等都是成熟方案。
Apache 的短板也很明确:进程/线程模型在高并发下内存开销大于 Nginx 的事件驱动模型。结论不是"谁更好",而是"什么场景用谁":共享虚拟主机、需要 .htaccess、依赖特定 Apache 模块时用 Apache;高并发反向代理、静态资源、API 网关用 Nginx。
本篇讲清 Apache 的完整配置路径:安装 → 目录结构 → 虚拟主机 → .htaccess → MPM → SSL → 调优。
一、安装与目录结构
先装服务,再认识文件布局。Debian 系包名是 apache2,RHEL 系是 httpd,两者目录约定不同,这是新手最容易混淆的地方。
# Debian / Ubuntu(以 Ubuntu 24.04 为例,默认提供 Apache 2.4)
sudo apt update && sudo apt install -y apache2
sudo systemctl enable --now apache2
sudo systemctl status apache2
# RHEL / Rocky / AlmaLinux
sudo dnf install -y httpd
sudo systemctl enable --now httpd| 用途 | Debian/Ubuntu 路径 | RHEL 系路径 |
|---|---|---|
| 主配置文件 | /etc/apache2/apache2.conf | /etc/httpd/conf/httpd.conf |
| 额外配置目录 | /etc/apache2/conf-available/ → conf-enabled/ | /etc/httpd/conf.d/*.conf |
| 站点配置 | /etc/apache2/sites-available/ → sites-enabled/ | /etc/httpd/conf.d/vhost.conf |
| 模块管理 | a2enmod / a2dismod | 编辑 /etc/httpd/conf.modules.d/ |
| 站点启用 | a2ensite / a2dissite | 直接建/删 conf.d 下的文件 |
| 默认网站根目录 | /var/www/html | /var/www/html |
| 日志 | /var/log/apache2/ | /var/log/httpd/ |
常用辅助命令(Debian 系):
sudo a2enmod rewrite ssl headers proxy_fcgi setenvif # 启用模块
sudo a2ensite example.com.conf # 启用站点
sudo apache2ctl configtest # 配置语法校验(等同 httpd -t)
sudo systemctl reload apache2 # 平滑重载二、虚拟主机(VirtualHost)配置
VirtualHost 让一台服务器承载多个域名,是 Apache 最核心的配置单元。分为"基于名称"(同一 IP 不同域名,最常用)和"基于 IP"(不同 IP)两种。
基于名称的虚拟主机典型配置(/etc/apache2/sites-available/example.com.conf,以 PHP-FPM 为例):
ServerName example.com
ServerAlias www.example.com
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/public
# 日志分离,便于按站点排查
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.php index.html
# PHP 交给 PHP-FPM 处理(推荐,配合 mpm_event)
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
# 隐藏敏感文件
Require all denied
关键指令说明:
ServerName:主域名;ServerAlias:附加域名(可多个,空格分隔)。DocumentRoot:站点根目录,路径末尾不要加斜杠。:对该目录做权限控制。Options -Indexes禁止目录列表(安全必备),+FollowSymLinks允许符号链接。AllowOverride All:允许.htaccess覆盖配置;不需要时设为None可显著提升性能。Require all granted:Apache 2.4 的授权语法(2.2 的Order allow,deny已废弃)。- 首个 VirtualHost 是"默认主机",未匹配域名的请求会落到它,建议单独建一个 000-default 返回 403。
配置要点清单:
- 改完必须
apache2ctl configtest(RHEL 系httpd -t)通过再reload。 DocumentRoot目录的父目录也要有执行权限,否则 403。- 若启用
mod_rewrite后仍报 404,检查AllowOverride是否为None。 - SELinux 开启时(RHEL 系默认),新目录需
chcon -R -t httpd_sys_content_t /path否则 403。
三、.htaccess:目录级覆盖的利与弊
.htaccess 是放在网站目录下的配置文件,无需重启服务即可生效,代价是每次请求都要逐级查找并解析它,性能损耗明显。
# /var/www/example.com/public/.htaccess
# 强制 HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 前端路由 SPA 兜底
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
# 自定义错误页
ErrorDocument 404 /404.html
# 静态资源缓存
ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType text/css "access plus 7 days"
.htaccess 使用要点:
- 能写进 VirtualHost 就别写进
.htaccess。官方明确说明:若有权访问主配置,应把规则放进并把AllowOverride设为None,可避免每次请求的文件系统遍历开销。 .htaccess中可用的指令受AllowOverride的类别限制(All、None、FileInfo、AuthConfig、Indexes、Limit、Options)。- 它对所有子目录递归生效,子目录可放自己的
.htaccess覆盖父级。 - 安全风险:网站程序漏洞可能让攻击者写入恶意
.htaccess(如把 .jpg 当 PHP 解析)。生产环境建议把.htaccess设为只读或干脆禁用。
四、MPM 模式对比:决定 Apache 性能上限的关键
MPM(Multi-Processing Module,多处理模块)决定 Apache 如何处理并发请求,是性能调优的第一决策点。Apache 2.4 提供三种主要 MPM。
| MPM | 模型 | 进程/线程 | 内存占用 | PHP 支持 | 适用场景 |
|---|---|---|---|---|---|
mpm_prefork | 多进程,每进程单线程 | 每请求一进程 | 高(每进程 20~40MB) | 原生 mod_php 安全 | 老程序、非线程安全的模块(如某些旧版 mod_php) |
mpm_worker | 多进程 × 多线程 | 混合 | 中 | 需 PHP-FPM | 折中方案,近年用得少 |
mpm_event | 事件驱动 + 线程 | 混合,专门线程处理 keepalive | 中低 | 需 PHP-FPM | 现代首选,高并发、长连接场景 |
要点清单:
- Apache 2.4 的默认 MPM 在不同发行版上不同(Debian 系默认
mpm_event,部分旧系统默认prefork),用apache2ctl -V | grep MPM确认当前是哪个。 - 若使用
mod_php(非线程安全),只能用prefork;现代做法是mpm_event+ PHP-FPM,性能更好。 mpm_event相比worker的改进:用专门的监听线程处理 keep-alive 连接,避免空闲连接长期占用工作线程。
查看与切换 MPM:
# 查看当前 MPM
apache2ctl -V | grep -i mpm
# Debian 系切换(以切到 event 为例)
sudo a2dismod mpm_prefork && sudo a2enmod mpm_event
sudo systemctl restart apache2mpm_event 典型参数(/etc/apache2/mods-available/mpm_event.conf):
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400 # 关键:最大并发请求数 = 进程数 × ThreadsPerChild
MaxConnectionsPerChild 10000 # 每进程处理多少请求后重启,防内存泄漏
ServerLimit 16
参数估算:MaxRequestWorkers 要根据内存算。假设每线程约 10MB、可用内存 4GB 给 Apache 用 2GB,则 MaxRequestWorkers ≈ 2048MB / 10MB ≈ 200。设太大在流量高峰会触发 swap 甚至 OOM。
五、SSL 配置与 HTTPS 站点
Apache 启用 mod_ssl 后配置 443 虚拟主机。证书可用 Let's Encrypt 免费签发(certbot),有效期 90 天,需自动续期(截至 2026 年仍为此策略)。
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com
# certbot 会自动改写 VirtualHost 并配置续期定时任务
sudo systemctl status certbot.timer # 确认自动续期计时器已启用手工配置 HTTPS 虚拟主机示例:
ServerName example.com
DocumentRoot /var/www/example.com/public
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# 安全加固:协议与套件
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5
SSLHonorCipherOrder on
# 开启 HSTS(确认全站 HTTPS 稳定后再加,否则会锁死)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# HTTP/2 提升并发加载性能
Protocols h2 http/1.1
六、Apache 与 Nginx 选型对比
两者并非互斥,"Nginx 前置 + Apache 后端"是经典组合。
| 对比项 | Apache | Nginx |
|---|---|---|
| 并发模型 | 进程/线程(event 为事件驱动) | 事件驱动、异步非阻塞 |
| 高并发内存开销 | 较高 | 低(每连接约几 KB) |
| 静态文件性能 | 良好 | 更优 |
| 目录级配置 | 支持 .htaccess(无需 reload) | 不支持,必须改主配置 |
| 模块生态 | 极其丰富,动态模块多 | 官方模块精简,第三方需编译 |
| 配置语法 | XML 风格块 + 类 .htaccess | 类 C 的指令块,简洁 |
| 典型场景 | 共享虚拟主机、.htaccess 依赖、复杂 rewrite | 反向代理、负载均衡、静态资源、高并发 |
| 组合方案 | 作为后端应用服务器 | 作为前端反向代理和静态层 |
选型要点清单:
- 需要客户自助改重写规则(虚拟主机业务)→ Apache。
- 高并发 API 网关、CDN 源站 → Nginx。
- 已有 Apache 老项目想提性能 → 前面加一层 Nginx 做反向代理和静态缓存,Apache 不动。
- 完全新项目且无
.htaccess依赖 → 优先 Nginx。
企业QQ咨询




