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免費證書),并同步到備服務器。