承接上文《利用Keepalived 搭建Nginx雙機主備模式》的部署步驟
本文主要記錄利用Keepalived 搭建Nginx雙機主備模式的部署過程。
部署準備
nginx-1.12.2
keepalived-1.2.24
CentOS 6.8
部署架構
Nginx做為反向代理伺服器,負責後端的WEB應用服務的代理,即終端使用者的Http請求,將由Nginx的負載均衡策略,轉發到不同的Web伺服器(Tomcat)上處理。
當然,在一些網際網路應用中,Nginx也可以作為http伺服器,專門負責靜態資源的處理(html,css,js等),這樣的部署架構雖然效能有所提升,但相對我們實際專案的部署能力、運維能力來說,增加了不少複雜度,容易發生一些莫名其妙的更新失敗的錯誤,所以不建議在我們的實際專案中將靜態資源單獨部署到Nginx中。
上述架構中,Nginx共部署了2臺伺服器,分為Mater(主)和Slave(備),兩臺伺服器的Nginx配置一致,但因為是單活模式,所以同一時間,只有一臺Nginx參與工作。主備模式是為了保證Nginx的高可用(HA)。
Nginx的高可用是通過Keepalived來保障的。Keepalived在每臺Nginx伺服器中都需部署。每臺伺服器的Keepalived負責監控本地的Nginx服務是否正常,一旦發現異常則會執行相應的處理指令碼(sh),完成Nginx主備的切換。
所有的Keepalived服務(主&備)均設定了同一個虛擬IP,終端使用者即通過此虛擬IP訪問WEB系統。這樣一旦伺服器端發生了故障切換,但對於終端使用者而言,他們是感覺不到的,因為系統訪問的IP地址(虛擬IP)並沒有變(會有短暫的404錯誤或其他錯誤,約3秒鐘,重新整理即可)。Keepalived虛擬IP的工作原理為VRRP協議(虛擬路由冗餘協議http://blog.csdn.net/u010391029/article/details/48311699),想了解工作原理的同學可自行百度Keepalived工作原理或VRRP協議內容。簡而言之,Keepalived的虛擬IP類似於ARP欺騙,如果你經歷或者瞭解過ARP攻擊,相信不難理解。
部署及維護
下述Keepalived & Nginx的安裝部署均以CentOS6為例 ,因為二者均沒有官方支援的Windows版本,Nginx雖有windows的實現,但並非原開源團隊維護,且不保證穩定性。http://nginx.org/en/docs/windows.html
Due to this and some other known issues version of nginx for Windows is considered to be a beta version.
Nginx
關閉防火牆#停止防火牆服務
servcie iptables stop
#設定防火牆不啟用,放置機器重啟後重新啟動
chkconfig iptables off
當然,如果你不厭其煩的配置防火牆的開放埠也是可以的,但一般防火牆策略均由機房防火牆硬體統一配置。在我們的專案中,通常伺服器的軟體防火牆都設定為關閉狀態。
安裝依賴包
yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
修改Linux連線數限制
ulimit -n 102400
#預設值為1024
安裝Nginx
將上述部署包解壓、編譯、安裝,假定安裝目錄為/usr/local
cd /usr/local
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure
make
make install
上述命令執行完畢後,如果沒有報錯,應該會在/usr/local 目錄下自動生成了一個nginx目錄,這就是我們安裝的nginx server了,此時我們可以將/usr/local/nginx-1.2.24目錄刪除或重新命名,以免在後續的運維過程當中,誤認為此目錄為Nginx安裝目錄。
配置檔案
配置檔案位置:/usr/local/nginx/conf/nginx.conf
配置項詳細說明:http://blog.csdn.net/tjcyjd/article/details/50695922
這裡有一份典型的配置檔案,供參考
需要說明的幾點如下:
1.nginx所有變數命名採用_連線符號,並且為小寫(bpmServer此類名稱不符合規則,可能會配置錯誤)
2.工作程序設定
一般程序數<=CPU核心數,一個4核CPU的典型配置如下
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
一個8核CPU的配置如下
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
這個很重要,預設值為1,在多核CPU爛大街的時下,效率很低。我在好幾個使用了Nginx做負載均衡的專案中,均發現此引數沒有做任何修改,這是一個低階的錯誤。
3.修改nginx服務監聽埠、servername
server {
#偵聽8011埠
listen 8011;
#定義使用 localhost訪問,多地址用空格分隔
server_name localhost 127.0.0.1;
...
}
4.定義應用叢集,具體訪問規則檢視配置檔案,輪詢(預設)|權重(weight)|響應時間(fair)|ip_hash(訪問ip)|url_hash(第三方)等
upstream web_server {
ip_hash;
server 192.168.3.161:7000;
server 192.168.3.160:7000;
}
5.代理引數設定
location /websjzx/ {
proxy_pass http://web_server;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_request_headers on;
}
6.更多優化,請參考
http://blog.csdn.net/moxiaomomo/article/details/19442737
維護
啟動服務
/usr/local/nginx/sbin/nginx
停止服務
/usr/local/nginx/sbin/nginx -s stop
Keepalived
關閉防火牆#停止防火牆服務
servcie iptables stop
#設定防火牆不啟用,放置機器重啟後重新啟動
chkconfig iptables off
當然,如果你不厭其煩的配置防火牆的開放埠也是可以的,但一般防火牆策略均由機房防火牆硬體統一配置。在我們的專案中,通常伺服器的軟體防火牆都設定為關閉狀態。
安裝依賴包
如果你已經按照上述nginx的安裝步驟,安裝了Nginx的依賴包,則此處不需要安裝其餘依賴,因為二者依賴重複。
如果沒有安裝nginx的依賴包,請參考nginx安裝依賴包
注:環境不同,需要安裝的依賴不同,如還需其他依賴包,請按照報錯資訊安裝。筆者的環境為CentOS 6.8 最小安裝版本,安裝了Nginx依賴包後,無需安裝其他依賴包。
安裝Keepalived
將上述部署包解壓、編譯、安裝,假定安裝目錄為/usr/local/keepalived
shell> tar -zxvf keepalived-1.2.24.tar.gz
shell> cd keepalived-1.2.24
shell> ./configure --prefix=/usr/local/keepalived
shell> make && make install
配置
1.Copy配置檔案到相應目錄
shell> mkdir /etc/keepalived
shell> cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
shell> cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
shell> cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
2.連結檔案
在命令列中,執行 keepalived
如果報錯如下 keepalived: command not found
則需要ln檔案,執行如下命令
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
3.配置檔案
配置檔案目錄為第一步中Copy的.conf檔案,具體目錄為
/etc/keepalived/keepalived.conf
如下為一份配置樣例(內有註釋,聰明的你一看就明白)
樣例配置中的nginx檢測指令碼如下(指令碼中的命令,不明白的可以自行百度,因為筆者也是從百度上抄的)
script “/usr/local/keepalived/nginx_pid.sh” ####檢測nginx狀態的指令碼路徑
Keepalived配置很豐富,更多說明,請參考
http://blog.csdn.net/xyang81/article/details/52554398 (上述連結中 keepalived.conf配置檔案說明)
維護
shell> chkconfig keepalived on #設定服務開機自啟或將啟動該命令新增到開機啟動中
shell> service keepalived start #啟動服務
shell> service keepalived stop #停止服務
shell> service keepalived restart #重啟服務
問題排查
因為nginx的負載均衡策略設定為ip_hash是極為方便和常用的一種策略,即粘性SESSION。Nginx會根據請求來源IP,通過一定hash演算法,將其所有請求固定轉發到某臺後端WEB伺服器上。
用Loadrunner做壓力測試的時候,模擬多執行緒併發訪問Web時,需在Loadrunner中設定IP欺騙,否則所有併發請求,均會採用通一個客戶端IP,會造成所有請求都會固定轉發到其中一臺WEB伺服器的尷尬。
Loadrunner IP欺騙參考:
https://www.cnblogs.com/fnng/archive/2013/03/02/2940284.html
Nginx開機自啟
https://www.cnblogs.com/whatmiss/p/7091220.html