長話短說,我們用Nginx來搭建一個簡單的集群,實現Web應用的負載均衡,架構圖如下:
兩台Web服務器,一台靜態資源服務器,因為是演示,我們以網站形式部署在本機IIS中
一台Nginx代理服務器,安裝到本機的Linux虛擬機中,參考 CentOS下Nginx安裝與配置
網站部署
新建三個文件夾,用於網站部署
在IIS中新建三個站點,分別指向以上三個目錄,兩台WEB端口是9527,9528,靜態資源站點端口9529
新建兩個HTML網頁 index.html,內容分別是 This is localhost:9527 和 This is localhost:9528,發布到9527和9528網站下
<!DOCTYPE html> <html lang="en-US"> <head> <title>test</title> </head> <body> <h1>This is localhost:9527</h1> <img src="/images/cnblog.gif"> </body> </html>
到9529網站下新建一個images文件夾,放入一張圖片cnblog.gif
預覽下這三個網站,都是OK的,9527和9528網站目錄下沒有cnblog圖片,所以顯示失敗,后面圖片將從資源服務器9529去取。
配置Nginx
在CentOS命令環境下,Nginx啟動和停止的命令:
cd /usr/local/nginx/sbin/ 進入Nginx運行目錄 ./nginx 啟動 ./nginx -s reload 重新加載配置 ./nginx -s quit: 處理完畢后退出 ./nginx -s stop: 強制殺掉Nginx進程
啟動成功,在瀏覽器訪問Nginx代理服務器IP(192.168.149.129)可以看到如下頁面
下面來更改配置,用vi編輯器打開nginx.conf文件,配置服務器集群
upstream是配置集群,192.168.92.1是我本機的IP,weight是權重,9527的權重是1,9528的權重是2,訪問比率是,Nginx會將請求轉發給9527一次,然后轉發給9528兩次,如此輪詢;
ip_hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一台Web服務器,可以解決session的問題,但是客戶端IP也會變換,那這招就不好使,還是推薦用分布式緩存如Redis來保持session,這里把ip_hash注釋掉了;
第一個location配置了默認請求轉發給集群myserver,第二個請求是將指定文件的請求轉發給本機的9529端口(資源服務器)
配置好后,保存退出,用 nginx -t 測試一下配置是否正常,沒問題用 nginx -s reload 重新加載配置,直接運行
測試結果
在本機瀏覽器輸入Nginx代理服務器IP(192.168.149.129)當前顯示9527,刷新一下變成9528,刷新兩下變回9527,圖片也正常顯示,一個網頁分別從三台服務器取數據
現在我們停止9527這個站點(模擬某台服務器宕機了),再刷新網頁
網站仍然正常瀏覽,只是一直是顯示9528,這就是故障轉移
大功告成,用Nginx很容易就實現了負載均衡,當然Nginx的功能遠不止此……