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