環境
Server 1 : ubuntu-server 8.04.4 192.168.6.162
Server 2 : userver-server 8.04.4 192.168.6.188
軟體
Keepalived 1.1.15
nginx-0.8.35
pcre-8.02
1.分别在兩台伺服器上安裝nginx
tar jxvf pcre-8.02.tar.bz2
cd pcre-8.02
./configure --prefix=/usr --enable-utf8 --enable-pcregrep-libbz2 --enable-pcregrep-libz
make
make install
tar zxvf nginx-0.8.35.tar.gz
cd nginx-0.8.35
--prefix=/usr/local/nginx --with-pcre --user=www --group=www --with-file-aio --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-cc-opt=' -O3'
make install
2.分别在兩台伺服器編寫配置檔案
vim /usr/local/nginx/conf/nginx.conf
user www www;
worker_processes 1;
error_log logs/error.log notice;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
index index.html index.htm;
root /var/www;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
3.分别在兩台機器建立測試檔案
echo "192.168.6.162" > /var/www/index.html
echo "192.168.6.188" > /var/www/index.html
4.安裝 keepalived
apt-get install keepalived
5.在server 1伺服器編寫配置檔案
vrrp_script chk_http_port {
script "/opt/nginx_pid.sh" ###監控腳本
interval 2 ###監控時間
weight 2 ###目前搞不清楚
vrrp_instance VI_1 {
state MASTER ### 設定為 主
interface eth0 ### 監控網卡
virtual_router_id 51 ### 這個兩台伺服器必須一樣
priority 101 ### 權重值 MASTRE 一定要高于 BAUCKUP
authentication {
auth_type PASS ### 加密
auth_pass eric ### 加密的密碼,兩台伺服器一定要一樣,不然會出錯
track_script {
chk_http_port ### 執行監控的服務
virtual_ipaddress {
192.168.6.7 ### VIP 位址
6.在 server 2 伺服器 keepalived 配置
script "/opt/nginx_pid.sh"
interval 2
weight 2
state BACKUP ### 設定為 輔機
interface eth0
virtual_router_id 51 ### 與 MASTRE 設定 值一樣
priority 100 ### 比 MASTRE權重值 低
auth_type PASS
auth_pass eric ### 密碼 與 MASTRE 一樣
chk_http_port
192.168.6.7
}
7.編寫監控nginx監控腳本
vim /opt/nginx_pid.sh
#!/bin/bash
# varsion 0.0.2
# 根據一網友說這樣做不科學,如果nginx服務起來了,但是我把keepalived 殺掉了,我的理由是,如果nginx死掉了,我覺得就很難在起來,再有就是nagios 當然要給你報警了啊。不過這位同學說的有道理,是以就稍加改了一下腳本
A=`ps -C nginx --no-header |wc -l` ## 檢視是否有 nginx程序 把值賦給變量A
if [ $A -eq 0 ];then ## 如果沒有程序值得為 零
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived ## 則結束 keepalived 程序
fi
fi
8、測試,分别在兩個伺服器 啟動 nginx 和 keepalived
/usr/local/nginx/sbin/nginx
/etc/init.d/keepalived start
監控 server 1 的日志
Apr 20 18:37:39 nginx Keepalived_vrrp: Registering Kernel netlink command channel
Apr 20 18:37:39 nginx Keepalived_vrrp: Registering gratutious ARP shared channel
Apr 20 18:37:39 nginx Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 18:37:39 nginx Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 18:37:39 nginx Keepalived_healthcheckers: Configuration is using : 3401 Bytes
Apr 20 18:37:39 nginx Keepalived_vrrp: Configuration is using : 35476 Bytes
Apr 20 18:37:40 nginx Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr 20 18:37:41 nginx Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 20 18:37:41 nginx Keepalived_vrrp: Netlink: skipping nl_cmd msg...
Apr 20 18:37:41 nginx Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded
監控 server 2的日志
Apr2018:38:23 varnish Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 18:38:23 varnish Keepalived_healthcheckers: Configuration is using : 3405 Bytes
Apr 20 18:38:23 varnish Keepalived_vrrp: Using MII-BMSR NIC polling thread...
Apr 20 18:38:23 varnish Keepalived_vrrp: Registering Kernel netlink reflector
Apr 20 18:38:23 varnish Keepalived_vrrp: Registering Kernel netlink command channel
Apr 20 18:38:23 varnish Keepalived_vrrp: Registering gratutious ARP shared channel
Apr 20 18:38:23 varnish Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 18:38:23 varnish Keepalived_vrrp: Configuration is using : 35486 Bytes
Apr 20 18:38:23 varnish Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Apr 20 18:38:25 varnish Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded
看日志可以看出,兩台伺服器的 MASTRE 和 BACUKUP 已經都正常了
現在我們在 server 1 把 nginx 伺服器停到
Server 1 $> killall nginx
這時候看server 1的日志
Apr 20 18:41:26 nginx Keepalived_healthcheckers: Terminating Healthchecker child process on signal
Apr 20 18:41:26 nginx Keepalived_vrrp: Terminating VRRP child process on signal
可以看出keepalived 的程序已經停到
這時候看server 2的日志,看是否已經接管
Apr 20 18:41:23 varnish Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr 20 18:41:24 varnish Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 20 18:41:24 varnish Keepalived_vrrp: Netlink: skipping nl_cmd msg...
很明顯的看出 server 2 已經接管了,已經變為 MASTER 了
本文轉自Deidara 51CTO部落格,原文連結:http://blog.51cto.com/deidara/302402,如需轉載請自行聯系原作者