Nginx:基本原理篇

Nginx基本模塊:

nginx功能模塊
  • Nginx 默認(rèn)采用守護(hù)模式啟動(dòng)贵涵,守護(hù)模式讓master進(jìn)程啟動(dòng)后在后臺(tái)運(yùn)行宾茂。在Nginx運(yùn)行期間主要由一個(gè)master主進(jìn)程和多個(gè)worker進(jìn)程

  • worker進(jìn)程數(shù)目建議設(shè)為與cpu核數(shù)相同跨晴,這樣每個(gè)worker進(jìn)程都綁定特定的CPU核心端盆,進(jìn)程間切換的代價(jià)是最小的焕妙。因?yàn)橐皇荖ginx一般做的是高并發(fā)代理弓摘,基本沒(méi)有IO操作,大多數(shù)都是CPU密集型操作末患,很少出現(xiàn)IO阻塞等情況璧针。二是進(jìn)程與CPU調(diào)度的關(guān)系,單個(gè)核心處理多個(gè)進(jìn)程的時(shí)候渤昌,是排隊(duì)處理的独柑,如果設(shè)置多個(gè)進(jìn)程的時(shí)候忌栅,是排隊(duì)處理的曲稼,如果設(shè)置多個(gè)進(jìn)程時(shí),會(huì)帶來(lái)進(jìn)程間切換的開(kāi)銷

  • master進(jìn)程不會(huì)對(duì)用戶請(qǐng)求提供服務(wù)瑞驱,只用于管理真正提供服務(wù)的worker進(jìn)程唤反,所以master進(jìn)程可以是唯一的鸭津,它僅專注于自己的純管理工作逆趋,為管理員提供命令行服務(wù)闻书,包括諸如啟動(dòng)服務(wù)魄眉、停止服務(wù)、重載配置文件楞卡、平滑升級(jí)程序等蒋腮,當(dāng)任意一個(gè)worker進(jìn)程出現(xiàn)錯(cuò)誤從而導(dǎo)致coredump時(shí),master進(jìn)程會(huì)立刻啟動(dòng)新的worker進(jìn)程繼續(xù)服務(wù)焦除。

  • 網(wǎng)絡(luò)請(qǐng)求的處理膘魄,是放在worker進(jìn)程中來(lái)完成的竭讳,而且只能在一個(gè)worker進(jìn)程中處理绢慢。多個(gè)worker進(jìn)程是相互獨(dú)立且對(duì)等競(jìng)爭(zhēng)的。
    采用這種方式的好處:

    • 節(jié)省鎖帶來(lái)的開(kāi)銷骚露。對(duì)于每個(gè)worker進(jìn)程來(lái)說(shuō)棘幸,獨(dú)立的進(jìn)程误续,不需要加鎖女嘲,所以省掉了鎖帶來(lái)的開(kāi)銷诞帐,同時(shí)在編程以及問(wèn)題查上時(shí)停蕉,也會(huì)方便很多
    • 獨(dú)立進(jìn)程慧起,減少風(fēng)險(xiǎn)蚓挤。
      采用獨(dú)立的進(jìn)程灿意,可以讓互相之間不會(huì)影響缤剧,當(dāng)一個(gè)worker進(jìn)程異常退出時(shí)荒辕,其它進(jìn)程還在工作抵窒,服務(wù)不會(huì)中斷李皇,master進(jìn)程則很快重新啟動(dòng)新的worker進(jìn)程。雖然當(dāng)前worker上的所有請(qǐng)求失敗付材,不過(guò)不會(huì)影響到所有請(qǐng)求厌衔,所以降低了風(fēng)險(xiǎn)富寿。
  • 每個(gè)worker里面只有一個(gè)主線程页徐,但一個(gè)worker可以同時(shí)處理多個(gè)請(qǐng)求变勇。nginx采取異步非阻塞的方式處理請(qǐng)求搀绣,每個(gè)請(qǐng)求進(jìn)來(lái)链患,worker線程將其注冊(cè)處理轉(zhuǎn)發(fā)給下游服務(wù)(如php-fpm)后麻捻,并不是掛起等待,而是切換處理別的請(qǐng)求巷折。采用這種輪詢的方式來(lái)并發(fā)處理大量請(qǐng)求
nginx進(jìn)程模型

nginx的處理流程

Nginx的IO通常使用epoll,epoll函數(shù)使用了I/O復(fù)用模型署拟。與I/O阻塞模型比較歌豺,I/O復(fù)用模型的優(yōu)勢(shì)在于可以同時(shí)等待多個(gè)(而不只是一個(gè))套接字描述符就緒馒铃。Nginx的epoll工作流程如下:

  1. 首先区宇,master 進(jìn)程接受到信號(hào)(如nginx -s reload)后啟動(dòng),讀取配置文件值戳,建好需要listen的socket后议谷,然后再fork出多個(gè)woker進(jìn)程,這樣每個(gè)work進(jìn)程都可以去accept這個(gè)socket

2 . 當(dāng)一個(gè)client連接到來(lái)時(shí)堕虹,所有accept的work進(jìn)程都會(huì)受到通知卧晓,但只有一個(gè)進(jìn)程可以accept成功,其它的則會(huì)accept失敗赴捞,Nginx提供了一把共享鎖accept_mutex來(lái)保證同一時(shí)刻只有一個(gè)work進(jìn)程在accept連接逼裆,從而解決驚群?jiǎn)栴}

  1. 當(dāng)一個(gè)worker進(jìn)程accept這個(gè)連接后,就開(kāi)始讀取請(qǐng)求赦政,解析請(qǐng)求胜宇,處理請(qǐng)求昼钻,產(chǎn)生數(shù)據(jù)后狈究,再返回給客戶端碎罚,最后才斷開(kāi)連接竟趾,這樣一個(gè)完成的請(qǐng)求就結(jié)束了

  2. 一個(gè)worker進(jìn)程可以同時(shí)處理多個(gè)請(qǐng)求,每個(gè)worker進(jìn)程只有一個(gè)主線程,而是采用異步非阻塞的方式來(lái)處理并發(fā)請(qǐng)求。比如同時(shí)有多個(gè)http request的時(shí)候,worker主線程與第一條request建議連接將其處理轉(zhuǎn)發(fā)給下游fast cgi后,并不會(huì)掛起等待波丰,而是立馬處理下一條纫骑,可以理解輪詢處理煤墙。與多線程相比铣减,這種事件處理方式是有很大的優(yōu)勢(shì)的劣针,不需要?jiǎng)?chuàng)建線程,每個(gè)請(qǐng)求占用的內(nèi)存也很少,沒(méi)有上下文切換,事件處理非常的輕量級(jí)。并發(fā)數(shù)再多也不會(huì)導(dǎo)致無(wú)謂的資源浪費(fèi)(上下文切換),更多的并發(fā)數(shù),只是會(huì)占用更多的內(nèi)存而已枣申。因此nginx 是非常適合處理高并發(fā)請(qǐng)求的

驚群現(xiàn)象

驚群現(xiàn)象:驚群效應(yīng)就是當(dāng)一個(gè)fd的事件被觸發(fā)時(shí)像寒,所有等待這個(gè)fd的線程或進(jìn)程都被喚醒祭芦。一般都是socket的accept()會(huì)導(dǎo)致驚群,很多個(gè)進(jìn)程都block在server socket的accept()蚕愤,一但有客戶端進(jìn)來(lái),所有進(jìn)程的accept()都會(huì)返回籍凝,但是只有一個(gè)進(jìn)程會(huì)讀到數(shù)據(jù)苹享,就是驚群宫纬。
Nginx 采用accept-mutex來(lái)解決驚群?jiǎn)栴}:當(dāng)一個(gè)請(qǐng)求到達(dá)的時(shí)候,只有競(jìng)爭(zhēng)到鎖的worker進(jìn)程才會(huì)驚醒處理請(qǐng)求,其他進(jìn)程會(huì)繼續(xù)等待椒楣,結(jié)合 timer_solution 配置的最大的超時(shí)時(shí)間繼續(xù)嘗試獲取accept-mutex

從I/O復(fù)用角度談 nginx 和apache 的區(qū)別

I/O 復(fù)用接口有select 和 epoll 兩種模型拧抖,首先介紹一下這兩種模型的執(zhí)行方式:

  • select 模型:說(shuō)的通俗一點(diǎn)就是各個(gè)客戶端連接的文件描述符也就是套接字徒仓,都被放到了一個(gè)集合中,調(diào)用select函數(shù)之后會(huì)一直監(jiān)視這些文件描述符中有哪些可讀吭净,如果有可讀的描述符那么我們的工作進(jìn)程就去讀取資源晤斩。PHP 中有內(nèi)置的函數(shù)來(lái)完成 select 系統(tǒng)調(diào)用维苔。select()所維護(hù)的 存儲(chǔ)大量文件描述符的數(shù)據(jù)結(jié)構(gòu) 褐澎,隨著文件描述符數(shù)量的增長(zhǎng)段审,其在用戶態(tài)和內(nèi)核的地址空間的復(fù)制所引發(fā)的開(kāi)銷也會(huì)線性增長(zhǎng)

由于網(wǎng)絡(luò)響應(yīng)時(shí)間的延遲使得大量TCP連接處于非活躍狀態(tài)催式,但調(diào)用select()還是會(huì)對(duì) 所有的socket進(jìn)行一次線性掃描 萌业,會(huì)

  • epoll 模型:epoll 是 select 的增強(qiáng)版授段。epoll 文件描述符數(shù)量無(wú)限制漱抓±儆颍基于事件的就緒通知方式 旨巷,select/poll方式,進(jìn)程只有在調(diào)用一定的方法后靶病,內(nèi)核才會(huì)對(duì)所有監(jiān)視的文件描述符進(jìn)行掃描煤辨,而epoll事件通過(guò)epoll_ctl()注冊(cè)一個(gè)文件描述符,一旦某個(gè)文件描述符就緒時(shí),內(nèi)核會(huì)采用類似call back的回調(diào)機(jī)制,迅速激活這個(gè)文件描述符躬它,epoll_wait()便會(huì)得到通知

調(diào)用一次epoll_wait()獲得就緒文件描述符時(shí)祖娘,返回的并不是實(shí)際的描述符失尖,而是一個(gè)代表就緒描述符數(shù)量的值,拿到這些值去epoll指定的一個(gè)數(shù)組中依次取得相應(yīng)數(shù)量的文件描述符即可渐苏,這里使用內(nèi)存映射(mmap)技術(shù)掀潮, 避免了復(fù)制大量文件描述符帶來(lái)的開(kāi)銷。

在select/poll時(shí)代琼富,服務(wù)器進(jìn)程每次都把這100萬(wàn)個(gè)連接告訴操作系統(tǒng)(從用戶態(tài)復(fù)制句柄數(shù)據(jù)結(jié)構(gòu)到內(nèi)核態(tài))仪吧,讓操作系統(tǒng)內(nèi)核去查詢這些套接字上是否有事件發(fā)生,輪詢完后鞠眉,再將句柄數(shù)據(jù)復(fù)制到用戶態(tài)薯鼠,讓服務(wù)器應(yīng)用程序輪詢處理已發(fā)生的網(wǎng)絡(luò)事件,這一過(guò)程資源消耗較大械蹋,因此出皇,select/poll一般只能處理幾千的并發(fā)連接。
epoll的設(shè)計(jì)和實(shí)現(xiàn)與select完全不同哗戈。epoll通過(guò)在Linux內(nèi)核中申請(qǐng)一個(gè)簡(jiǎn)易的文件系統(tǒng)郊艘,把原先的select/poll調(diào)用分成了3個(gè)部分:

調(diào)用epoll_create()建立一個(gè)epoll對(duì)象(在epoll文件系統(tǒng)中為這個(gè)句柄對(duì)象分配資源)
調(diào)用epoll_ctl向epoll對(duì)象中添加這100萬(wàn)個(gè)連接的套接字
調(diào)用epoll_wait收集發(fā)生的事件的連接

只需要在進(jìn)程啟動(dòng)時(shí)建立一個(gè)epoll對(duì)象,然后在需要的時(shí)候向這個(gè)epoll對(duì)象中添加或者刪除連接谱醇。同時(shí)暇仲,epoll_wait的效率也非常高,因?yàn)檎{(diào)用epoll_wait時(shí)副渴,并沒(méi)有一股腦的向操作系統(tǒng)復(fù)制這100萬(wàn)個(gè)連接的句柄數(shù)據(jù)奈附,內(nèi)核也不需要去遍歷全部的連接。

apache 采用的select模型煮剧,nginx采用epoll模型斥滤,nginx 處理請(qǐng)求是異步非阻塞的将鸵,而apache則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能佑颇。在Apache+PHP(prefork)模式下顶掉,如果PHP處理慢或者前端壓力很大的情況下,很容易出現(xiàn)Apache進(jìn)程數(shù)飆升挑胸,從而拒絕服務(wù)的現(xiàn)象痒筒。

Nginx 常用功能

  • Nginx支持FastCGI、SSL茬贵、Virtual Host簿透、URL Rewrite、Gzip等功能解藻。并且支持很多第三方的模塊擴(kuò)展老充。

  • Nginx作為Http代理、反向代理:

  • Nginx通過(guò)配置實(shí)現(xiàn)靈活的轉(zhuǎn)發(fā)功能:Nginx可以根據(jù)不同的正則匹配螟左,采取不同的轉(zhuǎn)發(fā)策略啡浊。

  • Nginx可以對(duì)返回結(jié)果進(jìn)行錯(cuò)誤頁(yè)跳轉(zhuǎn),異常判斷等胶背。

  • 如果被分發(fā)的服務(wù)器存在異常巷嚣,它可以將請(qǐng)求重新轉(zhuǎn)發(fā)給另外一臺(tái)服務(wù)器,然后自動(dòng)去除異常服務(wù)器奄妨。

  • Nginx作為負(fù)載均衡器:

  • Nginx提供的負(fù)載均衡策略有2種:內(nèi)置策略和擴(kuò)展策略涂籽。

  • 內(nèi)置策略為輪詢,加權(quán)輪詢砸抛,Ip hash。

  • 擴(kuò)展策略由第三方實(shí)現(xiàn)树枫。

  • 輪詢與加權(quán)輪詢:

  • Ip hash算法直焙,對(duì)客戶端請(qǐng)求的ip進(jìn)行hash操作,然后根據(jù)hash結(jié)果將同一個(gè)客戶端ip的請(qǐng)求分發(fā)給同一臺(tái)服務(wù)器進(jìn)行處理砂轻,可以解決session不共享的問(wèn)題奔誓。
image
  • Nginx作為Web緩存

  • 可以把靜態(tài)資源放在Nginx服務(wù)器上(比如前端頁(yè)面資源)

  • Nginx可以對(duì)不同的文件做不同的緩存處理,配置靈活搔涝。

  • 配合著第三方的ngx_cache_purge厨喂,對(duì)指定的URL緩存內(nèi)容可以的進(jìn)行增刪管理。

參考文章:http://tengine.taobao.org/book/chapter_02.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庄呈,一起剝皮案震驚了整個(gè)濱河市蜕煌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诬留,老刑警劉巖斜纪,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫母,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盒刚,警方通過(guò)查閱死者的電腦和手機(jī)腺劣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)因块,“玉大人橘原,你說(shuō)我怎么就攤上這事∥猩希” “怎么了趾断?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吓懈。 經(jīng)常有香客問(wèn)我歼冰,道長(zhǎng),這世上最難降的妖魔是什么耻警? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任隔嫡,我火速辦了婚禮,結(jié)果婚禮上甘穿,老公的妹妹穿的比我還像新娘腮恩。我一直安慰自己,他們只是感情好温兼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布秸滴。 她就那樣靜靜地躺著,像睡著了一般募判。 火紅的嫁衣襯著肌膚如雪荡含。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天届垫,我揣著相機(jī)與錄音释液,去河邊找鬼。 笑死装处,一個(gè)胖子當(dāng)著我的面吹牛误债,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妄迁,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寝蹈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了登淘?” 一聲冷哼從身側(cè)響起箫老,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎形帮,沒(méi)想到半個(gè)月后槽惫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體周叮,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年界斜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仿耽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡各薇,死狀恐怖项贺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峭判,我是刑警寧澤开缎,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站林螃,受9級(jí)特大地震影響奕删,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疗认,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一完残、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧横漏,春花似錦谨设、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至素跺,卻和暖如春二蓝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背指厌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工侣夷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仑乌。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像琴锭,于是被迫代替她去往敵國(guó)和親晰甚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成决帖,其中厕九,內(nèi)核的設(shè)計(jì)非常微小和簡(jiǎn)潔,完成的工作也非常簡(jiǎn)單...
    rosekissyou閱讀 10,202評(píng)論 5 124
  • 什么是Nginx地回? Nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器扁远,也是一個(gè)IMAP/POP3/SMTP服務(wù)器N...
    jiangmo閱讀 2,536評(píng)論 1 9
  • 上一篇《WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理》俊鱼,我們講述了瀏覽器端請(qǐng)求發(fā)起過(guò)程,通過(guò)DNS域名解析服務(wù)器IP畅买,并建...
    七寸知架構(gòu)閱讀 80,942評(píng)論 21 356
  • Nginx才短短幾年并闲,就拿下了web服務(wù)器大筆江山,眾所周知谷羞,Nginx在處理大并發(fā)靜態(tài)請(qǐng)求方面帝火,效率明顯高于ht...
    松江野人閱讀 1,070評(píng)論 0 2
  • I/O模型Nginx介紹Nginx的安裝和目錄結(jié)構(gòu)Nginx的配置Nginx的編譯安裝 一、I/O模型 (一)I/...
    哈嘍別樣閱讀 890評(píng)論 0 4