Apache在Ubuntu上实现高可用的核心方案:Keepalived + 负载均衡/高可用集群
高可用(High Availability, HA)旨在通过冗余和故障转移机制,确保Apache服务持续可用。在Ubuntu上,常用Keepalived实现故障转移(虚拟IP漂移),结合Apache负载均衡模块(如mod_proxy_balancer)分散请求,提升整体可用性。以下是具体实现步骤:
ubuntu-master、ubuntu-backup),确保网络互通(同一局域网),安装相同版本的Apache(sudo apt update && sudo apt install apache2)。/etc/hosts文件,添加对方服务器的IP和主机名映射(避免DNS依赖):echo "192.168.1.10 ubuntu-master" | sudo tee -a /etc/hosts
echo "192.168.1.11 ubuntu-backup" | sudo tee -a /etc/hosts
net-tools(查看网络信息)、vim(编辑配置)等工具:sudo apt install -y net-tools vim
调整Apache的多处理模块(MPM)和核心参数,提升性能与稳定性:
event模块(适合异步非阻塞场景):sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2
/etc/apache2/apache2.conf,设置:KeepAlive On
MaxKeepAliveRequests 100 # 单个连接最大请求数
KeepAliveTimeout 2 # 连接保持时间(秒)
mpm_event配置(/etc/apache2/mods-enabled/mpm_event.conf):<IfModule mpm_event_module>
StartServers 2 # 启动时的进程数
MinSpareThreads 25 # 最小空闲线程数
MaxSpareThreads 75 # 最大空闲线程数
ThreadLimit 64 # 线程数上限
ThreadsPerChild 25 # 每个子进程创建的线程数
MaxRequestWorkers 150 # 最大并发请求数(根据内存调整,如1GB内存约150)
MaxConnectionsPerChild 1000 # 单个子进程处理的最大请求数(避免内存泄漏)
</IfModule>
重启Apache使配置生效:sudo systemctl restart apache2。若有多台后端Apache服务器(如backend1:192.168.1.20、backend2:192.168.1.21),可通过mod_proxy_balancer将请求分发到后端,提升整体吞吐量:
sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
sudo systemctl restart apache2
/etc/apache2/sites-available/loadbalancer.conf,添加以下内容:<VirtualHost *:80>
ServerName yourdomain.com
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.20:80 route=1 # 后端服务器1
BalancerMember http://192.168.1.21:80 route=2 # 后端服务器2
ProxySet lbmethod=byrequests # 按请求数均匀分配(可选:bytraffic按流量、bysession按会话)
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
sudo a2ensite loadbalancer.conf
sudo systemctl restart apache2
测试:访问http://yourdomain.com,通过日志(/var/log/apache2/access.log)确认请求被分发到后端服务器。Keepalived通过VRRP协议实现虚拟IP(VIP)的自动漂移,当主服务器故障时,备服务器接管VIP,确保服务连续性。
在主(ubuntu-master)、备(ubuntu-backup)服务器上均安装:
sudo apt install -y keepalived
编辑/etc/keepalived/keepalived.conf,设置主节点参数:
global_defs {
router_id LVS_MASTER # 唯一标识(主备需不同,如MASTER/BACKUP)
}
vrrp_script chk_apache {
script "/etc/keepalived/check_apache.sh" # 健康检查脚本(检测Apache是否运行)
interval 2 # 检查间隔(秒)
weight 2 # 检查失败时权重降低2
}
vrrp_instance VI_1 {
state MASTER # 主节点状态
interface ens160 # 网卡名(通过`ip a`查看,如ens33)
virtual_router_id 51 # 虚拟路由ID(主备需相同,1-255)
priority 101 # 优先级(主备需不同,主>备,如101/100)
advert_int 1 # 心跳间隔(秒)
authentication {
auth_type PASS
auth_pass 12345 # 密码(主备需相同)
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP(VIP,客户端访问的地址)
}
track_script {
chk_apache # 关联健康检查脚本
}
}
修改/etc/keepalived/keepalived.conf,设置备节点参数(与主节点差异部分):
global_defs {
router_id LVS_BACKUP # 唯一标识
}
vrrp_instance VI_1 {
state BACKUP # 备节点状态
interface ens160 # 网卡名(与主节点一致)
virtual_router_id 51 # 虚拟路由ID(与主节点一致)
priority 100 # 优先级(低于主节点)
advert_int 1
authentication {
auth_type PASS
auth_pass 12345 # 密码(与主节点一致)
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP(与主节点一致)
}
track_script {
chk_apache # 关联相同的健康检查脚本
}
}
编写脚本检测Apache是否运行,若未运行则重启Apache(避免因进程崩溃导致VIP漂移)。在主、备服务器上均创建/etc/keepalived/check_apache.sh:
#!/bin/bash
if ps ax | grep -v grep | grep apache2 > /dev/null; then
exit 0 # Apache运行正常
else
systemctl restart apache2 # 重启Apache
if [ $? -eq 0 ]; then
exit 0
else
exit 1 # 重启失败,触发VIP漂移
fi
fi
赋予执行权限:
sudo chmod +x /etc/keepalived/check_apache.sh
在主、备服务器上启动服务并设置开机自启:
sudo systemctl enable keepalived
sudo systemctl start keepalived
ip a,应看到192.168.1.100绑定在网卡上;备服务器无此IP。sudo systemctl stop apache2),观察Keepalived日志(journalctl -u keepalived -f),确认VIP漂移到备服务器。sudo systemctl start apache2),VIP应自动漂移回主服务器。MaxRequestWorkers(并发请求数),避免资源耗尽。Zabbix、Nagios等工具监控Apache状态(如CPU、内存、请求数),设置告警规则(如VIP漂移时发送邮件/短信)。certbot申请Let’s Encrypt免费证书),并同步到备服务器。