Apache服务器配置教程

结论: 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,两者目录约定不同,这是新手最容易混淆的地方。

bash
# 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 系):

bash
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 为例):

apache

    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 是放在网站目录下的配置文件,无需重启服务即可生效,代价是每次请求都要逐级查找并解析它,性能损耗明显。

apache
# /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:

bash
# 查看当前 MPM
apache2ctl -V | grep -i mpm
# Debian 系切换(以切到 event 为例)
sudo a2dismod mpm_prefork && sudo a2enmod mpm_event
sudo systemctl restart apache2

mpm_event 典型参数(/etc/apache2/mods-available/mpm_event.conf):

apache

    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 年仍为此策略)。

bash
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 虚拟主机示例:

apache

    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 后端"是经典组合。

对比项ApacheNginx
并发模型进程/线程(event 为事件驱动)事件驱动、异步非阻塞
高并发内存开销较高低(每连接约几 KB)
静态文件性能良好更优
目录级配置支持 .htaccess(无需 reload)不支持,必须改主配置
模块生态极其丰富,动态模块多官方模块精简,第三方需编译
配置语法XML 风格块 + 类 .htaccess类 C 的指令块,简洁
典型场景共享虚拟主机、.htaccess 依赖、复杂 rewrite反向代理、负载均衡、静态资源、高并发
组合方案作为后端应用服务器作为前端反向代理和静态层

选型要点清单:

  • 需要客户自助改重写规则(虚拟主机业务)→ Apache。
  • 高并发 API 网关、CDN 源站 → Nginx。
  • 已有 Apache 老项目想提性能 → 前面加一层 Nginx 做反向代理和静态缓存,Apache 不动。
  • 完全新项目且无 .htaccess 依赖 → 优先 Nginx。