一、nginx介紹
nginx是一款高性能的http和反向代理服務(wù)器,也是一個imap/pop3/smtp服務(wù)器(電子郵件代理),最早開發(fā)這個產(chǎn)品的目的之一也是作為郵件代理服務(wù)器。因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗及其高并發(fā)性能強(qiáng)而廣泛應(yīng)用于各種生產(chǎn)部署之中。而且nginx是基于事件驅(qū)動模型(epoll)實現(xiàn)的i/o多路復(fù)用,并通過異步、非阻塞的方式處理請求。在高連接并發(fā)的情況下,nginx是apache服務(wù)器不錯的替代品。而我們?yōu)槭裁匆x擇nginx呢?
二、Nginx特點
-
高并發(fā)、高性能;
-
高可靠(可以7*24小時不間斷運行);
-
可擴(kuò)展性強(qiáng)(高度模塊化設(shè)計,添加模塊平穩(wěn));
-
作為 Web 服務(wù)器:相比 Apache,Nginx 使用更少的資源,支持更多的并發(fā)連接;
-
作為負(fù)載均衡服務(wù)器:可以進(jìn)行自定義配置,支持虛擬主機(jī)、支持URL重定向、支持網(wǎng)絡(luò)監(jiān)控等。
-
Nginx 安裝非常的簡單,配置文件 非常簡潔(還能夠支持perl語法),Bugs少;
-
處理靜態(tài)文件,索引文件以及自動索引;
-
反向代理加速(無緩存),簡單的負(fù)載均衡和容錯;
-
支持熱部署(可在不停止服務(wù)器的情況下升級nginx)。
這就是為什么要選擇Nginx的原因。而且Nginx的功能特點還不止這些,上面只是簡單列舉了幾點常見功能。
三、Nginx負(fù)載均衡
在我們實際生產(chǎn)中,一臺服務(wù)器的處理能力、存儲空間是有限的, 不要企圖去換更強(qiáng)大的服務(wù)器,對大型網(wǎng)站而言,不管多么強(qiáng)大的服務(wù)器,都滿足不了網(wǎng)站持續(xù)增長的業(yè)務(wù)需求。這種情況下,更恰當(dāng)?shù)淖龇ㄊ窃黾右慌_服務(wù)器來分擔(dān)原有服務(wù)器的訪問及存儲壓力。實際上這就是我們所謂的負(fù)載均衡,Nginx作為負(fù)載均衡服務(wù)器,它通過反向代理來對后端多臺服務(wù)器負(fù)載均衡。首先來說一下Nginx負(fù)載均衡策略及負(fù)載均衡算法。
3.1 認(rèn)識 upstream 模塊
upstream 這個模塊是寫一組被代理的服務(wù)器地址(即定義的后端服務(wù)器列表中選取一臺服務(wù)器接受用戶的請求 ),然后配置負(fù)載均衡的算法。 來看一下最基本的負(fù)載均衡實例:
upstream?test?{? ??????server?10.20.151.114:80; ??????server?10.20.151.115:80; } server?{ ??????.... ??????location?/?{????????? ?????????????proxy_pass??http://test;?????--請求轉(zhuǎn)向?test?定義的服務(wù)器列表????????? ??????}
3.2 Nginx負(fù)載均衡策略
(1)輪詢
最基本的配置方法,上面的例子就是輪詢的方式,它是upstream模塊默認(rèn)的負(fù)載均衡默認(rèn)策略。每個請求會按時間順序逐一分配到不同的后端服務(wù)器。
upstream?test?{? ??????server?10.20.151.114:80;?weight=1; ??????server?10.20.151.115:80;?weight=2; }
(2)ip_hash
每個請求按訪問IP的hash結(jié)果分配,同一個IP客戶端固定訪問一個后端服務(wù)器。可以保證來自同一ip的請求被打到固定的機(jī)器上,可以解決session問題。
upstream?test?{? ??ip_hash;??--同一個IP客戶端固定訪問一個后端服務(wù)器 ??????server?10.20.151.114:80;?weight=1; ??????server?10.20.151.115:80;?weight=2; }
(3)url_hash
按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器。一旦緩存住了資源,再此收到請求,就可以從緩存中讀取。
upstream?test?{? ??hash?$request_uri;??--實現(xiàn)每個url定向到同一個后端服務(wù)器 ??????server?10.20.151.114:80;?weight=1; ??????server?10.20.151.115:80;?weight=2; }
(4)least_conn
把請求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器。輪詢算法是把請求平均的轉(zhuǎn)發(fā)給各個后端,使它們的負(fù)載大致相同;但是,有些請求占用的時間很長,會導(dǎo)致其所在的后端負(fù)載較高。這種情況下,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果。
upstream?test?{? ??least_conn;??--把請求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器 ??????server?10.20.151.114:80;?weight=1; ??????server?10.20.151.115:80;?weight=2; }
(5)weight
權(quán)重方式,在輪詢策略的基礎(chǔ)上指定輪詢的幾率。
upstream?test?{? ??????server?10.20.151.114:80;?weight=1; ??????server?10.20.151.115:80;?weight=2;??--輪詢的幾率相對上一條要大 }
(6)fair
此種算法可以依據(jù)頁面大小和加載時間長短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。
upstream?test?{? ??????server?10.20.151.114:80;?weight=1; ??????server?10.20.151.115:80;?weight=2; ??????fair;??--實現(xiàn)響應(yīng)時間短的優(yōu)先分配 }
nginx負(fù)載均衡配置狀態(tài)參數(shù)
down:表示當(dāng)前的server暫時不參與負(fù)載均衡。
backup:預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時候,才會請求backup機(jī)器,因此這臺機(jī)器的壓力最輕。
max_fails:允許請求失敗的次數(shù),默認(rèn)為1。當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤。
fail_timeout:在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時間單位秒。max_fails可以和fail_timeout一起使用。
Nginx可分為二層、三層、四層、七層負(fù)載均衡。 所謂的二層就是基于MAC地址的負(fù)載均衡, 三層就是基于IP地址的負(fù)載均衡,四層就是基于IP+端口的負(fù)載均衡,七層就是基于URL等應(yīng)用層信息的負(fù)載均衡。因篇幅較長這里不再做具體的介紹,有興趣的可自行百度。這里以七層負(fù)載均衡來做實例。
3.3 Nginx負(fù)載均衡實例
環(huán)境準(zhǔn)備:準(zhǔn)備3臺Nginx服務(wù)器,一臺作為負(fù)載均衡服務(wù)器,其它兩臺作為后端服務(wù)器。
10.20.151.240 —-proxy_server(負(fù)載均衡服務(wù)器)
10.20.151.112 —-server1(后端服務(wù)器1)
10.20.151.113 —-server2(后端服務(wù)器2)
(1)負(fù)載均衡服務(wù)器配置
vim?/etc/nginx/nginx.conf????????--配置主配置文件 vim?/etc/nginx/conf.d/test.conf??--配置子配置文件
(2)后端服務(wù)器配置
vim?/usr/local/nginx/conf/nginx.conf????--修改配置文件 vim?/usr/local/nginx/html/index.html????--添加測試數(shù)據(jù)
(3)負(fù)載均衡測試
在瀏覽器端訪問http://10.20.151.240/,在實際生產(chǎn)中,這兩個頁面返回的結(jié)果是一樣的,這里是為了測試效果,所以返回了不同的內(nèi)容。而為什么刷新后又會返回不同結(jié)果呢?那是因為負(fù)載均衡默認(rèn)的均衡策略(或算法)是輪詢,所以每刷新一次就會從不同的后端服務(wù)器返回不同的請求結(jié)果,減輕單個后端服務(wù)器的訪問量,提升客戶端的訪問效率,從而達(dá)到負(fù)載均衡的效果。
當(dāng)我添加權(quán)重(weight)時
再次訪問http://10.20.151.240/
加權(quán)重和沒加權(quán)重有什么區(qū)別呢?在實際生產(chǎn)中,我們一般會將配置較高的服務(wù)器的權(quán)重設(shè)置高一點,其實就是客戶端在訪問時,權(quán)重較高的服務(wù)器會被多次請求,這樣能減輕配置較低的服務(wù)器的請求量,從而更好的實現(xiàn)負(fù)載均衡。
當(dāng)我添加backup狀態(tài)參數(shù)時
再次訪問http://10.20.151.240/
此時我故意停掉第一臺后端服務(wù)器,繼續(xù)訪問http://10.20.151.240/
當(dāng)我給113這臺后端服務(wù)器添加backup后,它就會作為熱備服務(wù)器,添加的主要目的就是當(dāng)我其他后端服務(wù)器都宕機(jī)的情況下,我的熱備服務(wù)器還能繼續(xù)提供同樣的服務(wù)(注意:在其他后端服務(wù)器還未宕機(jī)之前,該熱備服務(wù)器是不工作的)。因此負(fù)載均衡不僅能達(dá)到各個后端服務(wù)器負(fù)載的均衡,同時通過配置相關(guān)轉(zhuǎn)態(tài)參數(shù)還能保證客戶端請求時不造成服務(wù)器宕機(jī)的情況,保證了后端服務(wù)器的穩(wěn)定性。其他狀態(tài)參數(shù)這里我不再做演示(因為配置方式都一樣)。