Nginx是一個(gè) 輕量級(jí)/高性能的反向代理Web服務(wù)器,他實(shí)現(xiàn)非常高效的反向代理、負(fù)載平衡,他可以處理2-3萬并發(fā)連接數(shù),官方監(jiān)測(cè)能支持5萬并發(fā),現(xiàn)在中國使用nginx網(wǎng)站用戶有很多,例如:新浪、網(wǎng)易、 騰訊等。
1)跨平臺(tái)、配置簡單、方向代理、高并發(fā)連接:處理2-3萬并發(fā)連接數(shù),官方監(jiān)測(cè)能支持5萬并發(fā),內(nèi)存消耗小:開啟10個(gè)nginx才占150M內(nèi)存 ,nginx處理靜態(tài)文件好,耗費(fèi)內(nèi)存少。
2)Nginx內(nèi)置的健康檢查功能:如果有一個(gè)服務(wù)器宕機(jī),會(huì)做一個(gè)健康檢查,再發(fā)送的請(qǐng)求就不會(huì)發(fā)送到宕機(jī)的服務(wù)器了。重新將請(qǐng)求提交到其他的節(jié)點(diǎn)上。
優(yōu)點(diǎn):1)占內(nèi)存小,可實(shí)現(xiàn)高并發(fā)連接,處理響應(yīng)快
2)可實(shí)現(xiàn)http服務(wù)器、虛擬主機(jī)、方向代理、負(fù)載均衡
3)Nginx配置簡單,可以不暴露正式的服務(wù)器IP地址
缺點(diǎn):1)動(dòng)態(tài)處理差:nginx處理靜態(tài)文件好,耗費(fèi)內(nèi)存少,但是處理動(dòng)態(tài)頁面則很雞肋,所以前端一般用nginx作為反向代理抗住壓力。
1)http服務(wù)器。Nginx是一個(gè)http服務(wù)可以獨(dú)立提供http服務(wù)。可以做網(wǎng)頁靜態(tài)服務(wù)器。
2)虛擬主機(jī)。可以實(shí)現(xiàn)在一臺(tái)服務(wù)器虛擬出多個(gè)網(wǎng)站,例如個(gè)人網(wǎng)站使用的虛擬機(jī)。
3)反向代理,負(fù)載均衡。當(dāng)網(wǎng)站的訪問量達(dá)到一定程度后,單臺(tái)服務(wù)器不能滿足用戶的請(qǐng)求時(shí),需要用多臺(tái)服務(wù)器集群可以使用nginx做反向代理。并且多臺(tái)服務(wù)器可以平均分擔(dān)負(fù)載,不會(huì)應(yīng)為某臺(tái)服務(wù)器負(fù)載高宕機(jī)而某臺(tái)服務(wù)器閑置的情況。
4)nginx中也可以配置安全管理、比如可以使用Nginx搭建API接口網(wǎng)關(guān),對(duì)每個(gè)接口服務(wù)進(jìn)行攔截。
因?yàn)樗氖录幚頇C(jī)制:異步非阻塞事件處理機(jī)制運(yùn)用了epoll模型,提供了一個(gè)隊(duì)列,排隊(duì)解決。
server{ # 第一個(gè)Server區(qū)塊開始,表示一個(gè)獨(dú)立的虛擬主機(jī)站點(diǎn)
? ? listen ? 80; ? ? ??? ??? ? ? ? ? ?# 提供服務(wù)的端口,默認(rèn)80
? ? server_name ?localhost; ? # 提供服務(wù)的域名主機(jī)名
? ? location / { ? ? ? ? ? ??? ? ? ? ? ?# 第一個(gè)location區(qū)塊開始
? ? ? ? root ? html; ? ? ? ?? ??? ? # 站點(diǎn)的根目錄,相當(dāng)于Nginx的安裝目錄
? ? ? ? index ?index.html index.htm; ? ??? ?# 默認(rèn)的首頁文件,多個(gè)用空格分開
? ? } ? ? ? ? ??? ??? ??? ??? ? # 第一個(gè)location區(qū)塊結(jié)果
} ? ? ?
首先,Nginx 在啟動(dòng)時(shí),會(huì)解析配置文件,得到需要監(jiān)聽的端口與 IP 地址,然后在 Nginx 的 Master 進(jìn)程里面先初始化好這個(gè)監(jiān)控的Socket(創(chuàng)建 S ocket,設(shè)置 addr、reuse 等選項(xiàng),綁定到指定的 ip 地址端口,再 listen 監(jiān)聽)。正向代理就是一個(gè)人發(fā)送一個(gè)請(qǐng)求直接就到達(dá)了目標(biāo)的服務(wù)器。
反方代理就是請(qǐng)求統(tǒng)一被Nginx接收,nginx反向代理服務(wù)器接收到之后,按照一定的規(guī)則分發(fā)給了后端的業(yè)務(wù)處理服務(wù)器進(jìn)行處理了。
反向代理服務(wù)器可以隱藏源服務(wù)器的存在和特征。它充當(dāng)互聯(lián)網(wǎng)云和web服務(wù)器之間的中間層。這對(duì)于安全方面來說是很好的,特別是當(dāng)您使用web托管服務(wù)時(shí)。
①輪詢:Nginx根據(jù)請(qǐng)求發(fā)送來的順序,依次把請(qǐng)求循環(huán)的發(fā)給列表中的服務(wù)器;
②按權(quán)重:提前為每個(gè)服務(wù)器指定一個(gè)權(quán)重,Nginx在分配請(qǐng)求時(shí)會(huì)優(yōu)先把請(qǐng)求分配給權(quán)重較高的服務(wù)器(一般選擇給性能較好的服務(wù)器賦予較大的權(quán)重);
③hash綁定:可以為每個(gè)ip地址使用hash綁定,這樣每個(gè)訪客訪問的服務(wù)器固定,可以解決seeion存儲(chǔ)問題;常見的用法是對(duì)用戶的IP或者ID進(jìn)行這個(gè)策略,然后「負(fù)載均衡器」就能保證同一個(gè)IP來源或者同一個(gè)用戶永遠(yuǎn)會(huì)被送到同一個(gè)后端服務(wù)器上了,一般用于處理緩存、會(huì)話等功能的時(shí)候特別好用;
④響應(yīng)策略:按后端服務(wù)器響應(yīng)時(shí)間,響應(yīng)快的優(yōu)先分配;也就是說,不管后端服務(wù)器負(fù)載高不高,也不管配置如何,只要覺得這個(gè)服務(wù)器在當(dāng)前時(shí)刻能最快的響應(yīng)用戶的請(qǐng)求,那么就優(yōu)先把請(qǐng)求轉(zhuǎn)發(fā)給它,這樣的話,對(duì)于用戶而言,體驗(yàn)也最好。那「負(fù)載均衡器」是怎么知道哪一臺(tái)后端服務(wù)在當(dāng)前時(shí)刻響應(yīng)能力最佳呢?這就需要「負(fù)載均衡器」不停的去統(tǒng)計(jì)每一臺(tái)后端服務(wù)器對(duì)請(qǐng)求的處理速度了,比如一分鐘統(tǒng)計(jì)一次,生成一個(gè)后端服務(wù)器處理速度的排行榜。然后「負(fù)載均衡器」根據(jù)這個(gè)排行榜去轉(zhuǎn)發(fā)服務(wù);
⑤負(fù)載度策略:負(fù)載度策略是指當(dāng)「負(fù)載均衡器」往后端轉(zhuǎn)發(fā)流量的時(shí)候,會(huì)先去評(píng)估后端每臺(tái)服務(wù)器的負(fù)載壓力情況,對(duì)于壓力比較大的后端服務(wù)器轉(zhuǎn)發(fā)的請(qǐng)求就少一些,對(duì)于壓力比較小的后端服務(wù)器可以多轉(zhuǎn)發(fā)一些請(qǐng)求給它。這種方式就充分的結(jié)合了后端服務(wù)器的運(yùn)行狀態(tài),來動(dòng)態(tài)的分配流量了,比輪詢的方式更為科學(xué)一些。但是這種方式也帶來了一些弊端,因?yàn)樾枰獎(jiǎng)討B(tài)的評(píng)估后端服務(wù)器的負(fù)載壓力,那這個(gè)「負(fù)載均衡器」除了轉(zhuǎn)發(fā)請(qǐng)求以外,還要做很多額外的工作,比如采集 連接數(shù)、請(qǐng)求數(shù)、CPU負(fù)載指標(biāo)、IO負(fù)載指標(biāo)等等,通過對(duì)這些指標(biāo)進(jìn)行計(jì)算和對(duì)比,判斷出哪一臺(tái)后端服務(wù)器的負(fù)載壓力較大。因此這種方式帶來了效果優(yōu)勢(shì)的同時(shí),也增加了「負(fù)載均衡器」的實(shí)現(xiàn)難度和維護(hù)成本。
1)Nginx是當(dāng)下最熱的Web容器,網(wǎng)站優(yōu)化的重要點(diǎn)在于靜態(tài)化網(wǎng)站,網(wǎng)站靜態(tài)化的關(guān)鍵點(diǎn)則是是動(dòng)靜分離,動(dòng)靜分離是讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動(dòng)靜資源做好了拆分以后,我們則根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作。
2)讓靜態(tài)的資源只走靜態(tài)資源服務(wù)器,動(dòng)態(tài)的走動(dòng)態(tài)的服務(wù)器
3)Nginx的靜態(tài)處理能力很強(qiáng),但是動(dòng)態(tài)處理能力不足,因此,在企業(yè)中常用動(dòng)靜分離技術(shù)。
4)對(duì)于靜態(tài)資源比如圖片,js,css等文件,我們則在反向代理服務(wù)器nginx中進(jìn)行緩存。這樣瀏覽器在請(qǐng)求一個(gè)靜態(tài)資源時(shí),代理服務(wù)器nginx就可以直接處理,無需將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器tomcat。 若用戶請(qǐng)求的動(dòng)態(tài)文件,比如servlet,jsp則轉(zhuǎn)發(fā)給Tomcat服務(wù)器處理,從而實(shí)現(xiàn)動(dòng)靜分離。這也是反向代理服務(wù)器的一個(gè)重要的作用。
CDN ,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其目的是,通過在現(xiàn)有的 Internet中 增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)邊緣,使用戶可就近取得所需的內(nèi)容,提高用戶訪問網(wǎng)站的速度。一般來說,因?yàn)楝F(xiàn)在 CDN 服務(wù)比較大眾,所以基本所有公司都會(huì)使用 CDN 服務(wù)。
在有多個(gè)cpu的情況下,可以設(shè)置多個(gè)worker,worker進(jìn)程的數(shù)量可以設(shè)置到和cpu的核心數(shù)一樣多,如果在單個(gè)cpu上起多個(gè)worker進(jìn)程,那么操作系統(tǒng)會(huì)在多個(gè)worker之間進(jìn)行調(diào)度,這種情況會(huì)降低系統(tǒng)性能,如果只有一個(gè)cpu,那么只啟動(dòng)一個(gè)worker進(jìn)程就可以了。
漏桶算法思路很簡單,我們把水比作是請(qǐng)求,漏桶比作是系統(tǒng)處理能力極限,水先進(jìn)入到漏桶里,漏桶里的水按一定速率流出,當(dāng)流出的速率小于流入的速率時(shí),由于漏桶容量有限,后續(xù)進(jìn)入的水直接溢出(拒絕請(qǐng)求),以此實(shí)現(xiàn)限流。
令牌桶算法的原理也比較簡單,我們可以理解成醫(yī)院的掛號(hào)看病,只有拿到號(hào)以后才可以進(jìn)行診病。
系統(tǒng)會(huì)維護(hù)一個(gè)令牌(token)桶,以一個(gè)恒定的速度往桶里放入令牌(token),這時(shí)如果有請(qǐng)求進(jìn)來想要被處理,則需要先從桶里獲取一個(gè)令牌(token),當(dāng)桶里沒有令牌(token)可取時(shí),則該請(qǐng)求將被拒絕服務(wù)。令牌桶算法通過控制桶的容量、發(fā)放令牌的速率,來達(dá)到對(duì)請(qǐng)求的限制。