Nginx:nginx服務(wù)器的整體架構(gòu)詳解
【溫馨提醒】文章內(nèi)容僅供參考,海外服務(wù)器租用\托管方案,請咨詢YINGSOO客服,24小時免費電話400-630-3752
【熱門主機(jī)】YINGSOO云服務(wù)器丨韓國云服務(wù)器推薦丨香港云服務(wù)器租用丨云服務(wù)器 日本
【熱搜問題】海外云主機(jī)租用哪家好?海外云主機(jī)好在哪?
引言:眾所周知,nginx 服務(wù)器是一個高性能的 web 和反向代理服務(wù)器。nginx 在激烈的 web 服務(wù)器競爭中依舊保持良好的發(fā)展勢頭,一度成為 web 服務(wù)器市場的后期之秀,這一切跟 nginx 的架構(gòu)設(shè)計是分不開的。
一、nginx 模塊化設(shè)計
高度模塊化的設(shè)計是 nginx 的架構(gòu)基礎(chǔ)。nginx 服務(wù)器被分解為多個模塊,每個模塊就是一個功能模塊,只負(fù)責(zé)自身的功能,模塊之間嚴(yán)格遵循“高內(nèi)聚,低耦合”的原則。
核心模塊
核心模塊是 nginx 服務(wù)器正常運行必不可少的模塊,提供錯誤日志記錄、配置文件解析、事件驅(qū)動機(jī)制、進(jìn)程管理等核心功能。
標(biāo)準(zhǔn) Http 模塊
標(biāo)準(zhǔn) Http 模塊提供 Http 協(xié)議解析相關(guān)的功能,如:端口配置、網(wǎng)頁編碼設(shè)置、Http 響應(yīng)頭設(shè)置等。
可選 Http 模塊
可選 Http 模塊主要用于擴(kuò)展標(biāo)準(zhǔn)的 Http 功能,讓 nginx 能處理一些特殊的服務(wù),如:Flash 多媒體傳輸、解析 geoip 請求、ssL 支持等。
郵件服務(wù)模塊
郵件服務(wù)模塊主要用于支持 nginx 的郵件服務(wù),包括對 pop3 協(xié)議、imAp 協(xié)議和 smtp 協(xié)議的支持。
第三方模塊
第三方模塊是為了擴(kuò)展 nginx 服務(wù)器應(yīng)用,完成開發(fā)者自定義功能,如:Json 支持、Lua 支持等。
二、nginx 請求處理方式
nginx 是一個高性能的 web 服務(wù)器,能夠同時處理大量的并發(fā)請求。它結(jié)合多進(jìn)程機(jī)制和異步機(jī)制,異步機(jī)制使用的是異步非阻塞方式,接下來就給大家介紹一下 nginx 的多線程機(jī)制和異步非阻塞機(jī)制。
多進(jìn)程
服務(wù)器每當(dāng)收到一個客戶端時。就有服務(wù)器主進(jìn)程(master process)生成一個子進(jìn)程(worker process)出來和客戶端建立連接進(jìn)行交互,直到連接斷開,該子進(jìn)程就結(jié)束了。使用進(jìn)程的好處是各個進(jìn)程之間相互獨立,不需要加鎖,減少了使用鎖對性能造成影響,同時降低編程的復(fù)雜度,降低開發(fā)成本。其次,采用獨立的進(jìn)程,可以讓進(jìn)程互相之間不會影響,如果一個進(jìn)程發(fā)生異常退出時,其它進(jìn)程正常工作,master 進(jìn)程則很快啟動新的 worker 進(jìn)程,確保服務(wù)部中斷,將風(fēng)險降到最低。缺點是操作系統(tǒng)生成一個子進(jìn)程需要進(jìn)行內(nèi)存復(fù)制等操作,在資源和時間上會產(chǎn)生一定的開銷;當(dāng)有大量請求時,會導(dǎo)致系統(tǒng)性能下降。
異步非阻塞
每個工作進(jìn)程使用異步非阻塞方式,可以處理多個客戶端請求。當(dāng)某個工作進(jìn)程接收到客戶端的請求以后,調(diào)用 io 進(jìn)行處理,如果不能立即得到結(jié)果,就去處理其他的請求(即為非阻塞);而客戶端在此期間也無需等待響應(yīng),可以去處理其他事情(即為異步);當(dāng) io 返回時,就會通知此工作進(jìn)程;該進(jìn)程得到通知,暫時掛起當(dāng)前處理的事務(wù)去響應(yīng)客戶[臺灣服務(wù)器租用]端請求。
三、nginx 事件驅(qū)動模型
在 nginx 的異步非阻塞機(jī)制中,工作進(jìn)程在調(diào)用 io 后,就去處理其他的請求,當(dāng) io 調(diào)用返回后,會通知該工作進(jìn)程。對于這樣的系統(tǒng)調(diào)用,主要使用 nginx 服務(wù)器的事件驅(qū)動模型來實現(xiàn)。
如上圖所示,nginx 的事件驅(qū)動模型由事件收集器、事件發(fā)送器和事件處理器三部分基本單元組成。其中,事件收集器負(fù)責(zé)收集 worker 進(jìn)程的各種 io 請求,事件發(fā)送器負(fù)責(zé)將 io 事件發(fā)送到事件處理器,而事件處理器負(fù)責(zé)各種事件的響應(yīng)工作。
事件發(fā)送器將每個請求放入一個待處理事件的列表,使用非阻塞 i/o 方式調(diào)用“事件處理器”來處理該請求。其處理方式稱為“多路 io 復(fù)用方法”,常見的包括以下三種:select 模型、poll 模型、epoll 模型。
針對上面的技術(shù)我特意整理了一下,有很多技術(shù)不是靠幾句話能講清楚,所以干脆找朋友錄制了一些視頻,很多問題其實答案很簡單,但是背后的思考和邏輯不簡單,要做到知其然還要知其所以然。如果想學(xué)習(xí)Java工程化、高性能及分布式、深入淺出。微服務(wù)、spring,mybatis,netty源碼分析的朋友可以加我的Java進(jìn)階群:433540541,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費分享給大家。
四、nginx 設(shè)計架構(gòu)
nginx 服務(wù)器使用 master/worker 多進(jìn)程模式。多線程啟動和執(zhí)行的流程如下:主程序 master process 啟動后,通過一個 for 循環(huán)來接收和處理外部信號;主進(jìn)程通過 fork() 函數(shù)產(chǎn)生子進(jìn)程,每個子進(jìn)程執(zhí)行一個 for 循環(huán)來實現(xiàn) nginx 服務(wù)器對事件的接收和處理。
一般推薦 worker 進(jìn)程數(shù)與 cpu 內(nèi)核數(shù)一致,這樣一來不存在大量的子進(jìn)程生成和管理任務(wù),避免了進(jìn)程之間競爭 cpU 資源和進(jìn)程切換的開銷。而且 nginx 為了更好的利用多核特性,提供了 cpu 親緣性的綁定選項,我們可以將某一個進(jìn)程綁定在某一個核上,這樣就不會因為進(jìn)程的切換帶來 cache 的失效。
對于每個請求,有且只有一個工作進(jìn)程對其處理。首先,每個 worker 進(jìn)程都是從 master 進(jìn)程 fork 過來,在 master 進(jìn)程里面,先建立好需要 listen 的 socket(listenfd)之后,然后再 fork 出多個 worker 進(jìn)程。所有 worker 進(jìn)程的 listenfd 會在新連接到來時變得可讀,為保證只有一個進(jìn)程處理該連接,所有 worker 進(jìn)程在注冊 listenfd 讀事件前搶 accept_mutex,搶到互斥鎖的那個進(jìn)程注冊 listenfd 讀事件,在讀事件里調(diào)用 accept 接受該連接。當(dāng)一個 worker 進(jìn)程在 accept 這個連接之后,就開始讀取請求,解析請求,處理請求,產(chǎn)生數(shù)據(jù)后,再返回給客戶端,最后才斷開連接,這樣一個完整的請求就是這樣的了。我們可以看到,一個請求,完全由 worker 進(jìn)程來處理,而且只在一個 worker 進(jìn)程中處理。
在 nginx 服務(wù)器的運行過程中,主進(jìn)程和工作進(jìn)程需要進(jìn)程交互。交互依賴于 socket 實現(xiàn)的管道來實現(xiàn)。
master-worker 交互
這條管道與普通的管道不同,它[法國獨立服務(wù)器]是由主進(jìn)程指向工作進(jìn)程的單向管道,包含主進(jìn)程向工作進(jìn)程發(fā)出的指令,工作進(jìn)程 id 等;同時主進(jìn)程與外界通過信號通信;每個子進(jìn)程具備接收信號,并處理相應(yīng)的事件的能力。
worker-worker 交互
這種交互是和 master-worker 交互是基本一致的,但是會通過主進(jìn)程。工作進(jìn)程之間是相互隔離的,所以當(dāng)工作進(jìn)程 w1 需要向工作進(jìn)程 w2 發(fā)指令時,首先找到 w2 的進(jìn)程 id,然后將正確的指令寫入指向 w2 的通道。w2 收到信號采取相應(yīng)的措施。
五、總結(jié)
通過這篇文章,我們對 nginx 服務(wù)器的整體架構(gòu)有了一個整體的認(rèn)識。包括其模塊化的設(shè)計、
多進(jìn)程和異步非阻塞的請求處理方式、事件驅(qū)動模型等。通過這些理論知識,對于我們以后學(xué)習(xí) nginx 的源碼有很大的幫助;也推薦大家多看看 nginx 的源碼,才能更好地領(lǐng)悟 nginx 的設(shè)計思想。
香港服務(wù)器網(wǎng)速&下載速度解析
最近經(jīng)常有些客戶問我,我租的香港服務(wù)器帶寬是3M,是不是下載速度就應(yīng)該是3M/s,本公司在此只想告訴你,不是,你完全不了解香港服務(wù)器寬帶與下載速度之間的關(guān)系及換算方法,下面我教大家一個換算的方法。
香港服務(wù)器寬帶與下載速度的換算方法:寬帶*1024/8,也就是說,如果你的帶寬是5M,那么理論上的下載的速度就應(yīng)該為,5*1024/8=640KB/s,可是事實上,由于在傳輸?shù)倪^程中會有一些損耗,一般都只能達(dá)到80%-85%左右,當(dāng)然如果你測試后的下載速[美國cn2高防服務(wù)器]度如果能是上面換算方法的20%-30%的話,那就說明你的帶寬有問題,跑不滿,不是獨享的。如果是在高峰期測試就更加直觀了,共享的帶[香港機(jī)房服務(wù)器]寬會變得非常慢,所以大家盡量在選擇香港服務(wù)器租用或者香港服務(wù)器托管的時候,盡量先對服務(wù)器進(jìn)行各種測試,以確保能滿足自己的需求,當(dāng)然,帶寬越大,速度就越快,這點是毋庸置疑的。
下面我再來給大家解釋帶寬的概念:
共享峰值10M:一般在機(jī)柜交換機(jī)總口限制為10M,用戶端口不做限制。獨享3M:機(jī)柜交換機(jī)總口不做限制,用戶端口做限制3M。打個比方:一個機(jī)柜一般一個24口交換機(jī),按20臺服務(wù)器計算,峰值10M,每臺只能保證0.5M帶寬,在實際使用中個別服務(wù)器由于業(yè)務(wù)量大或中毒造成擠占帶寬,就無法保證其他服務(wù)器正常使用,如果按獨享每臺3M帶寬算,一個交換機(jī)最大要提供60M給客戶使用,這樣可以保證每臺服務(wù)器都正常使用。
YINGSOO免費熱線:400-630-3752
熱門文章:【英國云主機(jī)在配置上該如何選擇】【衡陽高防服務(wù)器】【vps海外服務(wù)器】【香港游戲測試服務(wù)器怎么樣】【國內(nèi)免備案服務(wù)器是怎么一回事】【外貿(mào)軟件服務(wù)器如何選擇】【新加坡游戲服務(wù)器】【IDC行情】【便宜高防服務(wù)器】【湖北武鋼大數(shù)據(jù)】【云服務(wù)器有什么好處】【游戲行業(yè)對臺灣服務(wù)器的要求有哪些】【傳奇服務(wù)器端】【云計算在醫(yī)療行業(yè)的六大重要優(yōu)勢】【站長主機(jī)】【ip租用】【Datanode節(jié)點】【站群怎么做看完別再說你不會做站群】【跨境電商】【YINGSOO云的高可用性指什么】【傳奇手游gm服務(wù)器】【韓國高速服務(wù)器租用技巧】【維護(hù)香港服務(wù)器的方法】【云主機(jī)試用三天】【物理機(jī)優(yōu)惠】【特價云服務(wù)器】【CC高防服務(wù)器】【高防主機(jī)是什么】【100M大帶寬】【共享虛擬主機(jī)不利于seo嗎】
9年韓國主機(jī)業(yè)務(wù)運營經(jīng)驗,1200家企業(yè)客戶共同選擇.韓國Korea Telecom機(jī)房核心合作伙伴,機(jī)房帶寬資源充足,到國內(nèi)速度平均在80ms左右.
http://www.sddonglingsh.com/products/cloud-kr.html
YINGSOO獨享美國主機(jī)3天免費試用. 海外云主機(jī)品牌
好網(wǎng)絡(luò),不怕曬!獨享美國主機(jī)免費試用,自主平臺更可靠,海外云服務(wù)品牌2019年度獨享美國主機(jī)銷量再度破表,超過1200家企業(yè)共同的選擇
http://www.sddonglingsh.com/products/cloud-us.html
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。