Linux Apache2 高可用架构与落地步骤
一、总体架构与方案选型
- 主备高可用(Active/Standby):两台或多台 Apache 节点共享一个虚拟 IP(VIP),通过 Keepalived + VRRP 实现故障自动切换,客户端始终访问同一个 VIP。适合无状态或会话可重建的场景。
- 横向扩展(Active/Active):使用 Apache 的 mod_proxy_balancer 做反向代理与负载均衡,将请求分发到多个后端 Apache 节点;可叠加 Keepalived 为负载均衡器本身提供高可用。适合有状态或无状态服务,结合会话粘滞或会话共享使用。
二、方案一 主备高可用 Keepalived + VIP
- 适用目标:消除单点故障,保障同一 IP 持续对外服务。
- 核心思路:两台服务器运行 Apache,安装并配置 Keepalived;主节点持有 VIP,健康检查失败(如 httpd 不可用)时自动释放 VIP,备节点接管。
- 实施要点(两台机器,示例网卡 ens160,VIP 192.168.10.252/24):
- 安装与启用服务
- Ubuntu/Debian: sudo apt update && sudo apt install keepalived apache2
- RHEL/CentOS: sudo yum install keepalived httpd && sudo systemctl enable --now httpd
- 编写健康检查脚本(/etc/keepalived/check_httpd.sh)
- #!/usr/bin/env bash
if systemctl is-active --quiet apache2; then exit 0; else exit 1; fi
- chmod +x /etc/keepalived/check_httpd.sh
- 主节点 Keepalived 配置(/etc/keepalived/keepalived.conf)
- global_defs { router_id web1 }
vrrp_script check_httpd {
script “/etc/keepalived/check_httpd.sh”
interval 3
weight -50
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication { auth_type PASS; auth_pass 1111 }
virtual_ipaddress { 192.168.10.252/24 }
track_script { check_httpd }
}
- 备节点配置:将 state 改为 BACKUP,priority 略低(如 90),其余一致。
- 启动与验证
- systemctl enable --now keepalived
- ip addr show ens160 应能看到 VIP 在主节点;停止主节点 httpd 或 keepalived,观察 VIP 漂移到备节点。
- 提示:生产环境建议将 VIP 绑定到同一二层网段;跨机房/跨网段需考虑 VRRP 兼容性与路由策略。
三、方案二 横向扩展 基于 Apache 的负载均衡集群
- 适用目标:提升吞吐与容量,多台 Apache 共同承载流量。
- 核心思路:选一台或多台作为负载均衡器(也可双机 Keepalived 保障 LB 高可用),后端部署多台 Apache 应用节点;使用 mod_proxy、mod_proxy_http、mod_proxy_balancer 实现反向代理与负载均衡。
- 实施要点(以 Ubuntu/Debian 为例):
- 在所有 Apache 节点安装并启用模块
- sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests headers
- sudo systemctl restart apache2
- 负载均衡器配置(/etc/apache2/sites-available/loadbalancer.conf)
- <VirtualHost *:80>
ServerName yourdomain.com
<Proxy balancer://mycluster>
BalancerMember http://10.0.0.11:80 route=web1
BalancerMember http://10.0.0.12:80 route=web2
ProxySet lbmethod=byrequests
ProxySet stickysession=JSESSIONID|ROUTEID # 可选:会话粘滞
ProxySet retry=30
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
可选:管理界面(仅内网开放)
<Location /balancer-manager>
SetHandler balancer-manager
Require local
- sudo a2ensite loadbalancer.conf && sudo systemctl reload apache2
- 后端节点:确保应用可独立访问(健康检查 URL 建议返回 200),静态资源与动态内容分离可进一步提升效率。
- 验证:访问域名观察多后端轮询;查看 /balancer-manager 页面检查成员状态与健康;会话粘滞对需要登录态的应用有效。
- 提示:如需 HTTPS,可在 LB 终止 TLS(启用 mod_ssl、http2),后端仍用 HTTP,减少加解密开销。
四、关键优化与稳定性加固
- 连接与会话
- 启用 KeepAlive:KeepAlive On,MaxKeepAliveRequests 100,KeepAliveTimeout 2(繁忙站点建议 1–5 秒),降低握手开销同时避免连接占用过久。
- 会话策略:无状态优先;有状态使用 stickysession(如 JSESSIONID/ROUTEID),或引入集中式会话存储(如 Redis)实现会话共享。
- 并发与资源
- 选择 MPM Event(或 Worker)替代 Prefork(高并发更友好):sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2。
- 参考 MPM Event 参数(按内存与压测调优):StartServers 4;MinSpareThreads 25;MaxSpareThreads 75;ThreadsPerChild 25;MaxRequestWorkers 150;MaxConnectionsPerChild 1000。
- 内容交付
- 启用压缩:sudo a2enmod deflate;启用缓存:sudo a2enmod cache cache_disk;启用过期头:sudo a2enmod expires,减少重复生成与带宽占用。
- 可靠性增强
- 进程守护:配置 systemd 的 Restart=on-failure,使 Apache 异常退出后自动拉起;避免用定时重启替代故障治理。
- 监控与告警:对 HTTP 5xx、后端不可用、VIP 漂移、连接数阈值设置告警;必要时引入 Prometheus + Grafana 做可视化监控。
五、快速选型与部署建议
- 小规模、简单容灾:优先采用主备 + VIP(Keepalived),部署快、切换明确,适合大多数网站与内部系统。
- 中大规模、高并发:采用Apache 负载均衡集群,前端可双 LB + Keepalived 保障入口高可用;后端无状态化并通过会话共享消除粘滞依赖。
- 安全与合规:对外启用 TLS 1.2+ 与强加密套件,限制管理接口访问;对外域名与证书统一管理,证书到期自动续期(如 ACME)。
- 发布与回滚:蓝绿发布或金丝雀发布配合负载均衡器摘除/恢复节点,降低变更风险;变更前在测试环境验证参数与容量。