首先最終實現目標架構圖:
下面開始:
首先: 主nginx 服務器地址:192.168.37.110
從 nginx 服務器地址:192.168.37.111
192.168.37.166 爲 keepalived虛擬VIP地址
第一步:安裝keepalived
1、這裏採用VMware安裝的linux虛擬機實現,使用的版本是 contes7.4 這裏就不貼步驟了,確保虛擬機能夠連接外網。
2、安裝gcc gcc-c++(如新環境,未安裝請先安裝)
yum install -y gcc gcc-c++
3、安裝wget(如新環境,未安裝請先安裝)
yum -y install wget
4、下載keepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
5、解壓安裝包:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
6、下載插件openssl
yum install -y openssl openssl-devel
7、開始編譯keepalived
cd /usr/local/keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
8、make一下
cd /usr/local/keepalived-1.2.18
make && make install
如果安裝報錯: eepalived執行./configure --prefix=/usr/local/keepalived時報錯:configure: error: Popt libraries is required
出現此錯誤的原因:未安裝popt的開發包
解決方法:yum install popt-devel 安裝好popt的開發包。重新./configure 即可。
9、將keepalived安裝成linux系統服務
將keepalived安裝成Linux系統服務,因爲沒有使用keepalived的默認安裝路徑(默認路徑:/usr/local),安裝完成之後,需要做一些修改工作:
首先創建文件夾,將keepalived配置文件進行復制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然後複製keepalived腳本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
執行 service keepalived start 發現會報錯
解決辦法:
cd /usr/sbin
rm -f keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
然後再次執行啓動命令:service keepalived start
keepalived 常用命令
service keepalived start
service keepalived stop
可以設置開機啓動:chkconfig keepalived on,到此我們安裝keepalived完畢!
10、使用keepalived虛擬VIP
cd /etc/keepalived rm -r keepalived.conf 刪除原有的 conf文件 然後重新創建一份 conf文件
vi /etc/keepalived/keepalived.conf
寫入一下配置信息:
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #運行腳本,腳本內容下面有,就是起到一個nginx宕機以後,自動開啓服務
interval 2 #檢測時間間隔
weight -20 #如果條件成立的話,則權重 -20
}
#定義虛擬路由,VI_1 爲虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
###MASTER 標識主 BACKUP 標識從
state MASTER #來決定主從
interface ens33 # 綁定虛擬 IP 的網絡接口,根據自己的機器填寫
virtual_router_id 121 # 虛擬路由的 ID 號, 兩個節點設置必須一樣
mcast_src_ip 192.168.37.110 #填寫本機ip
priority 100 # 節點優先級,主要比從節點優先級高
nopreempt # 優先級高的設置 nopreempt 解決異常恢復後再次搶佔的問題
advert_int 1 # 組播信息發送間隔,兩個節點設置必須一樣,默認 1s #下面是配置 安全權限 可以不需要
authentication {
auth_type PASS
auth_pass 1111
}
#將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx #執行 Nginx 監控的服務
}
###虛擬IP地址配置規範 假設192.168.37.166
virtual_ipaddress {
192.168.37.166 #虛擬ip,也就是解決寫死程序的ip怎麼能切換的ip,也可擴展,用途廣泛。可配置多個。
}
}
:wq 保存退出
第二步:安裝主的nginx服務器 gcc wget openss 前面已經安裝了 就不用繼續裝了
1、安裝PCRE庫
cd /usr/local/ && wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcre-8.33 && ./configure
make && make install
2、安裝zlib庫存
cd /usr/local/
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11 && ./configure
make && make install
3、安裝nginx
cd /usr/local/ && wget http://nginx.org/download/nginx-1.9.10.tar.gz
tar -zxvf nginx-1.9.10.tar.gz
cd nginx-1.9.10 && ./configure
make && make install
然後修改index.html 文件
cd /usr/local/nginx/html vi index.html
:wq 保存退出
啓動nginx : /usr/local/nginx/sbin/nginx
記得關閉防火牆
臨時關閉 systemctl stop firewalld
禁止開機啓動 systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
然後再本機用瀏覽器訪問nginx服務器地址:http://192.168.37.110/ 地址爲 真實ip地址
這裏標識nginx 已經 安裝啓動成功了。
然後再啓動 keepalived服務 service keepalived start
使用 ip a 查看下網絡信息
會發現多了一個 192.168.37.166 這個地址就是 keepalived 虛擬出來的
如果沒有顯示出來,可能你的配置文件,寫的有點問題,修改後關閉keepalived 再次重啓看下效果
然後我們使用 keepalived虛擬出來的ip地址進行訪問 nginx服務 192.168.37.166
發現也能訪問成功
到此,完成了一半,keepalived 和 主nginx 已經安裝完成了。
第三步,安裝nginx備機,把主nginx服務虛擬機 克隆一份,修改ip地址爲 192.168.37.111
啓動 110 111 兩臺服務器,先把 兩臺服務器的 keepalived 都停止服務
service keepalived stop
注意:由於我們是搭建一主一備,所以 拷貝的備機上面,keepalived的配置文件需要修改,不然就是兩主機,沒有備機了,修改如下 state mcast_src_ip priority :
vi /etc/keepalived/keepalived.conf
寫入一下配置信息:
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #運行腳本,腳本內容下面有,就是起到一個nginx宕機以後,自動開啓服務
interval 2 #檢測時間間隔
weight -20 #如果條件成立的話,則權重 -20
}
#定義虛擬路由,VI_1 爲虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
###MASTER 標識主 BACKUP 標識從
state BACKUP #來決定主從
interface ens33 # 綁定虛擬 IP 的網絡接口,根據自己的機器填寫
virtual_router_id 121 # 虛擬路由的 ID 號, 兩個節點設置必須一樣
mcast_src_ip 192.168.37.111 #填寫本機ip
priority 90 # 節點優先級,主要比從節點優先級高
nopreempt # 優先級高的設置 nopreempt 解決異常恢復後再次搶佔的問題
advert_int 1 # 組播信息發送間隔,兩個節點設置必須一樣,默認 1s #下面是配置 安全權限 可以不需要
authentication {
auth_type PASS
auth_pass 1111
}
#將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx #執行 Nginx 監控的服務
}
###虛擬IP地址配置規範 假設192.168.37.166
virtual_ipaddress {
192.168.37.166 #虛擬ip,也就是解決寫死程序的ip怎麼能切換的ip,也可擴展,用途廣泛。可配置多個。
}
}
:wq 保存退出
然後啓動keepalived服務 service keepalived start 會發現沒有主機上面顯示的虛擬ip的地址信息
然後修改 備機 nginx 上面的 index.html 信息
cd /usr/local/nginx/html vi index.html
:wq 保存退出
啓動nginx : /usr/local/nginx/sbin/nginx
記得關閉防火牆
臨時關閉 systemctl stop firewalld
禁止開機啓動 systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
在本地使用 nginx備機的ip地址進行訪問nginx服務,先確保 nginx服務是正常的 192.168.37.111
然後 使用 keepalived 虛擬的ip進行訪問 192.168.1.166
同時,在備機上面使用 ip a 命令,發現,存在 虛擬ip地址了,這是因爲主機的 keepalived 服務器掛掉了,把備機啓用了,把備機當成主機使用了,
此時, 重啓主nginx服務器上的keepalived服務,service keepalived start,然後再主機上面 使用 ip a 命令,發現沒有虛擬ip信息顯示,這個時候,我們需要關閉備機的keepalived服務,service keepalived stop 再去主機上使用 ip a 命令,發現,主機上面出現了 虛擬ip地址信息,然後再啓動備機的 keepalived服務 service keepalived start ,在備機使用 ip a 命令,查看,發現,備機上面不顯示 虛擬ip地址信息了。。。。這樣,主機 備機 就調整正常了。
然後,重啓主機的nginx服務: /usr/local/nginx/sbin/nginx
使用 虛擬ip地址訪問,會發現我們訪問的頁面變爲主機nginx頁面地址了
其實上面的步驟,也就直接展示了,當主機keepalived 服務出現問題的時候,我們訪問到的資源地址就是 備機的 nginx服務器地址
我們可以使用 在 110主服務器上使用命令 service keepalived stop 停止服務,然後再用 虛擬ip去訪問發現結果如下:
同時虛擬ip 會跑去 備機服務器上面
然後, 在 110主服務器上使用命令 service keepalived start 啓動服務,然後再用 虛擬ip去訪問發現結果如下:
訪問nginx服務器自動變爲了 主nginx服務器
到此,那麼完成了5分之3. keepalived nginx 主從服務器搭建好了,然後就是 keepalived 心跳機制,和 tomcat集羣。 接着往下
第4步,設置 keepalived心跳機制 以下操作 主機和備機操作一樣
其實從前面的配置文件中,能發現,我們需要寫一段shell腳本,用來檢測 nginx服務是否在正常提供功能,如果沒有,則啓動nginx服務,如果有,則繼續監聽檢測 腳本文件名爲:nginx_check.sh
echo 是爲了 手動執行腳本文件測試的時候,讓控制檯輸出 信息 也可以把信息輸出到 日誌文件中,然後把腳本文件做成 linux開機啓動 和 定時任務,這樣 實時檢測 keepalived 和 nginx進程 進行判斷
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
B=`ps -C keepalived --no-header |wc -l`
if [ $A -eq 0 ];then
echo "==================nginx_check nginx的進程數量等於0===================="
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
echo "==================啓動後還是爲0,則關閉 keepalived進程===================="
/etc/rc.d/init.d/keepalived stop
fi
fi
C=`ps -C nginx --no-header |wc -l`
if [ $C -gt 0 -a $B -eq 0 ];then
echo "===========nginx_check nginx的進程沒問題,但keepalived進程沒有,啓動keepalived ============="
/etc/rc.d/init.d/keepalived start
fi
腳本存放路徑,和 keepalived 配置文件同一個 目錄, /etc/keepalived/
然後給腳本設置權限
chmod 777 nginx_check.sh
然後測試效果,關閉 主nginx 的nginx 的進程,service keepalived stop 然後瀏覽器訪問,發現keepalived會自動重啓nginx,還能訪問到主nginx服務器,然後接着測試,關閉主機的nginx 以及和 keepalived ,然後 瀏覽器訪問,顯示的是備機的 nginx信息,此時只啓動主機的keepalived服務,然後 瀏覽器訪問,顯示的是主機的 nginx信息,keepalived啓動的時候 自動重啓了nginx服務
重啓多次失敗的話,那麼就 發送郵件通知到 運維人員,這裏就不進行配置了。
第五步、配置tomcat的主從
修改nginx配置文件 這裏使用端口號區分,生產環境肯定是每個都在不同的服務器上 這裏就不多解釋了
8080 8081 表示主機 8082 8083 標識從機 下面配置負載均衡 和故障轉移
upstream testproxy {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082 backup;
server 127.0.0.1:8083 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://testproxy;
index index.html index.htm;
}
###nginx與上游服務器(真實訪問的服務器)超時時間 後端服務器連接的超時時間_發起握手等候響應超時時間
proxy_connect_timeout 1s;
###nginx發送給上游服務器(真實訪問的服務器)超時時間
proxy_send_timeout 1s;
### nginx接受上游服務器(真實訪問的服務器)超時時間
proxy_read_timeout 1s;
}
然後啓動四個tomcat進行測試即可,這裏就不演示了,我測試過了,沒問題的
正常是:啓動四個tomcat後,訪問nginx服務,會發現,只會訪問8080 8081 兩個端口,然後停止掉 8081 ,就只會訪問 8080,當8080停止掉後,就會在 8082 8083之間負載調用
好了,到此配置結束。大功告成