Nginx學(xué)習(xí)(二):Nginx重要概念

Nginx簡(jiǎn)介

??Nginx 是一個(gè)高性能的HTTP反向代理服務(wù)器台夺,也是一個(gè)IMAP/POP3/SMTP服務(wù)器薄啥。
??特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng)惹挟,事實(shí)上nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好蒲凶。
??Nginx 可以在大多數(shù) UnixLinux OS 上編譯運(yùn)行气筋,并有 Windows 移植版。在連接高并發(fā)的情況下旋圆,Nginx是Apache服務(wù)器不錯(cuò)的替代品宠默。
??Nginx 既可以在內(nèi)部直接支持 Rails 和 PHP 程序?qū)ν膺M(jìn)行服務(wù),也可以支持作為 HTTP代理服務(wù)器對(duì)外進(jìn)行服務(wù)灵巧。
??Nginx采用C進(jìn)行編寫搀矫,不論是系統(tǒng)資源開銷還是CPU使用效率都比 Perlbal 要好很多。
Nginx 是一個(gè)安裝非常的簡(jiǎn)單刻肄、配置文件非常簡(jiǎn)潔(還能夠支持perl語(yǔ)法)瓤球、Bug非常少的服務(wù)器。Nginx 啟動(dòng)特別容易敏弃,并且?guī)缀蹩梢宰龅?*24不間斷運(yùn)行卦羡,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng)。你還能夠不間斷服務(wù)的情況下進(jìn)行軟件版本的升級(jí)。

Nginx模式

??Nginx在啟動(dòng)后绿饵,在unix系統(tǒng)中會(huì)以daemon的方式在后臺(tái)運(yùn)行欠肾,后臺(tái)進(jìn)程包含一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程

??Master進(jìn)程:主要用來(lái)管理worker進(jìn)程拟赊,包含:接收來(lái)自外界的信號(hào)刺桃,向各worker進(jìn)程發(fā)送信號(hào),監(jiān)控worker進(jìn)程的運(yùn)行狀態(tài)要门,當(dāng)worker進(jìn)程退出后(異常情況下)虏肾,會(huì)自動(dòng)重新啟動(dòng)新的worker進(jìn)程。

??worker進(jìn)程:基本的網(wǎng)絡(luò)事件欢搜,則是放在worker進(jìn)程中來(lái)處理了。多個(gè)worker進(jìn)程之間是對(duì)等的谴轮,他們同等競(jìng)爭(zhēng)來(lái)自客戶端的請(qǐng)求炒瘟,各進(jìn)程互相之間是獨(dú)立的。一個(gè)請(qǐng)求第步,只可能在一個(gè)worker進(jìn)程中處理疮装。worker進(jìn)程的個(gè)數(shù)是可以設(shè)置的,一般我們會(huì)設(shè)置與機(jī)器cpu核數(shù)一致(更多的worker數(shù)粘都,只會(huì)導(dǎo)致進(jìn)程來(lái)競(jìng)爭(zhēng)cpu資源了廓推,從而帶來(lái)不必要的上下文切換。與cpu核數(shù)一樣翩隧,剛好利用好計(jì)算機(jī)的資源)

Nginx一些特性

??不影響現(xiàn)有環(huán)境重啟:master進(jìn)程在接到重啟信號(hào)后樊展,會(huì)先重新加載配置文件,然后再啟動(dòng)新的worker進(jìn)程堆生,并向所有老的worker進(jìn)程發(fā)送信號(hào)专缠,告訴他們可以光榮退休了。新的worker在啟動(dòng)后淑仆,就開始接收新的請(qǐng)求涝婉,而老的worker在收到來(lái)自master的信號(hào)后,就不再接收新的請(qǐng)求蔗怠,并且在當(dāng)前進(jìn)程中的所有未處理完的請(qǐng)求處理完成后墩弯,再退出。

??一個(gè)完整的請(qǐng)求過(guò)程:首先寞射,每個(gè)worker進(jìn)程都是從master進(jìn)程fork過(guò)來(lái)渔工,在master進(jìn)程里面,先建立好需要listen的socket(listenfd)之后怠惶,然后再fork出多個(gè)worker進(jìn)程涨缚。所有worker進(jìn)程的listenfd會(huì)在新連接到來(lái)時(shí)變得可讀,為保證只有一個(gè)進(jìn)程處理該連接,所有worker進(jìn)程在注冊(cè)listenfd讀事件前搶accept_mutex脓魏,搶到互斥鎖那個(gè)進(jìn)程注冊(cè)listenfd讀事件兰吟,在讀事件里調(diào)用accept接受該連接。當(dāng)一個(gè)worker進(jìn)程在accept這個(gè)連接之后茂翔,就開始讀取請(qǐng)求混蔼,解析請(qǐng)求,處理請(qǐng)求珊燎,產(chǎn)生數(shù)據(jù)后惭嚣,再返回給客戶端,最后才斷開連接悔政,這樣一個(gè)完整的請(qǐng)求就是這樣的了晚吞。
對(duì)于每個(gè)worker進(jìn)程來(lái)說(shuō),獨(dú)立的進(jìn)程谋国,不需要加鎖槽地。

??異步非阻塞應(yīng)對(duì)大并發(fā)量請(qǐng)求:Nginx采用了異步非阻塞的方式來(lái)處理請(qǐng)求,也就是說(shuō)芦瘾,nginx是可以同時(shí)處理成千上萬(wàn)個(gè)請(qǐng)求的捌蚊。想想apache的常用工作方式(apache也有異步非阻塞版本,但因其與自帶某些模塊沖突近弟,所以不常用)缅糟,每個(gè)請(qǐng)求會(huì)獨(dú)占一個(gè)工作線程,當(dāng)并發(fā)數(shù)上到幾千時(shí)祷愉,就同時(shí)有幾千的線程在處理請(qǐng)求了窗宦。這對(duì)操作系統(tǒng)來(lái)說(shuō),是個(gè)不小的挑戰(zhàn)谣辞,線程帶來(lái)的內(nèi)存占用非常大迫摔,線程的上下文切換帶來(lái)的cpu開銷很大,自然性能就上不去了泥从,而這些開銷完全是沒(méi)有意義的句占。
??非阻塞就是,事件沒(méi)有準(zhǔn)備好躯嫉,馬上返回EAGAIN纱烘,告訴你,事件還沒(méi)準(zhǔn)備好呢祈餐,你慌什么擂啥,過(guò)會(huì)再來(lái)吧。好吧帆阳,你過(guò)一會(huì)哺壶,再來(lái)檢查一下事件,直到事件準(zhǔn)備好了為止,在這期間山宾,你就可以先去做其它事情至扰,然后再來(lái)看看事件好了沒(méi)。雖然不阻塞了资锰,但你得不時(shí)地過(guò)來(lái)檢查一下事件的狀態(tài)敢课,你可以做更多的事情了。這樣一個(gè)worker就不用等待一次請(qǐng)求的完成绷杜,而是在等待請(qǐng)求準(zhǔn)備的過(guò)程中去處理別的請(qǐng)求直秆。只是在請(qǐng)求間進(jìn)行不斷地切換而已,切換也是因?yàn)楫惒绞录礈?zhǔn)備好鞭盟,而主動(dòng)讓出的圾结。這里的切換是沒(méi)有任何代價(jià),你可以理解為循環(huán)處理多個(gè)準(zhǔn)備好的事件懊缺,事實(shí)上就是這樣的疫稿。與多線程相比,這種事件處理方式是有很大的優(yōu)勢(shì)的鹃两,不需要?jiǎng)?chuàng)建線程,每個(gè)請(qǐng)求占用的內(nèi)存也很少舀凛,沒(méi)有上下文切換俊扳,事件處理非常的輕量級(jí)。并發(fā)數(shù)再多也不會(huì)導(dǎo)致無(wú)謂的資源浪費(fèi)(上下文切換)猛遍。在24G內(nèi)存的機(jī)器上馋记,處理的并發(fā)請(qǐng)求數(shù)達(dá)到過(guò)200萬(wàn)。現(xiàn)在的網(wǎng)絡(luò)服務(wù)器基本都采用這種方式懊烤,這也是nginx性能高效的主要原因梯醒。

??進(jìn)程文件描述符限制:在nginx中,每個(gè)進(jìn)程會(huì)有一個(gè)連接數(shù)的最大上限腌紧,這個(gè)上限與系統(tǒng)對(duì)fd的限制不一樣茸习。在操作系統(tǒng)中,通過(guò)ulimit -n壁肋,我們可以得到一個(gè)進(jìn)程所能夠打開的fd的最大數(shù)号胚,即nofile,因?yàn)槊總€(gè)socket連接會(huì)占用掉一個(gè)fd浸遗,所以這也會(huì)限制我們進(jìn)程的最大連接數(shù)猫胁,當(dāng)然也會(huì)直接影響到我們程序所能支持的最大并發(fā)數(shù),當(dāng)fd用完后跛锌,再創(chuàng)建socket時(shí)弃秆,就會(huì)失敗。nginx通過(guò)設(shè)置worker_connectons來(lái)設(shè)置每個(gè)進(jìn)程支持的最大連接數(shù)。如果該值大于nofile菠赚,那么實(shí)際的最大連接數(shù)是nofile脑豹。一般系統(tǒng)文件描述符限制為1024個(gè)文件,我們先將其改為65535锈至。

??最大連接數(shù)計(jì)算:一個(gè)nginx能建立的最大連接數(shù)晨缴,應(yīng)該是 worker_connections * worker_processes。
當(dāng)然峡捡,這里說(shuō)的是最大連接數(shù)击碗,對(duì)于HTTP請(qǐng)求本地資源來(lái)說(shuō),能夠支持的最大并發(fā)數(shù)量是worker_connections * worker_processes们拙,而如果是HTTP作為反向代理來(lái)說(shuō)稍途,最大并發(fā)數(shù)量應(yīng)該是worker_connections * worker_processes/2。因?yàn)樽鳛榉聪虼矸?wù)器砚婆,每個(gè)并發(fā)會(huì)建立與客戶端的連接和與后端服務(wù)的連接械拍,會(huì)占用兩個(gè)連接。

總結(jié)

??這里主要是講了Ngnix一些機(jī)制上概念装盯,讓我們對(duì)Ngnix實(shí)現(xiàn)機(jī)制有個(gè)大概了解坷虑。Ngnix還提供很多數(shù)據(jù)結(jié)構(gòu)和方法來(lái)開發(fā)者自定義一些請(qǐng)求處理的規(guī)則。我們用Ngnix主要是進(jìn)行反向代理和負(fù)載均衡埂奈,并不進(jìn)行復(fù)雜的開發(fā)迄损,所以這里不做講解,想了解這部分的也可以看下《Nginx開發(fā)從入門到精通》

參考:

《Nginx開發(fā)從入門到精通》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末账磺,一起剝皮案震驚了整個(gè)濱河市芹敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垮抗,老刑警劉巖氏捞,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異冒版,居然都是意外死亡液茎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門壤玫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豁护,“玉大人,你說(shuō)我怎么就攤上這事欲间〕铮” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵猎贴,是天一觀的道長(zhǎng)班缎。 經(jīng)常有香客問(wèn)我蝴光,道長(zhǎng),這世上最難降的妖魔是什么达址? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任蔑祟,我火速辦了婚禮,結(jié)果婚禮上沉唠,老公的妹妹穿的比我還像新娘疆虚。我一直安慰自己,他們只是感情好满葛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布径簿。 她就那樣靜靜地躺著,像睡著了一般嘀韧。 火紅的嫁衣襯著肌膚如雪篇亭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天锄贷,我揣著相機(jī)與錄音译蒂,去河邊找鬼。 笑死谊却,一個(gè)胖子當(dāng)著我的面吹牛柔昼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炎辨,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼岳锁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蹦魔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咳燕,失蹤者是張志新(化名)和其女友劉穎勿决,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體招盲,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡低缩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曹货。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咆繁。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顶籽,靈堂內(nèi)的尸體忽然破棺而出玩般,到底是詐尸還是另有隱情,我是刑警寧澤礼饱,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布坏为,位于F島的核電站究驴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匀伏。R本人自食惡果不足惜洒忧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望够颠。 院中可真熱鬧熙侍,春花似錦、人聲如沸履磨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹬耘。三九已至芝雪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間综苔,已是汗流浹背惩系。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留如筛,地道東北人堡牡。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杨刨,于是被迫代替她去往敵國(guó)和親晤柄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒(méi)有聽過(guò)Nginx妖胀?那么一定聽過(guò)它的“同行”Apache吧芥颈!Ngi...
    JokerW閱讀 32,642評(píng)論 24 1,002
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成,其中赚抡,內(nèi)核的設(shè)計(jì)非常微小和簡(jiǎn)潔爬坑,完成的工作也非常簡(jiǎn)單...
    rosekissyou閱讀 10,197評(píng)論 5 124
  • 上一篇《WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理》,我們講述了瀏覽器端請(qǐng)求發(fā)起過(guò)程涂臣,通過(guò)DNS域名解析服務(wù)器IP盾计,并建...
    七寸知架構(gòu)閱讀 80,925評(píng)論 21 356
  • 走在一個(gè)岔路口,兩個(gè)小人在打架赁遗,一個(gè)向左一個(gè)向右署辉,一個(gè)帶著刀一個(gè)帶著傷,一個(gè)畏畏縮縮一個(gè)勇往直前岩四,一個(gè)內(nèi)心善良一個(gè)...
    夏目的溫暖閱讀 181評(píng)論 0 0
  • 真的沒(méi)時(shí)間了哭尝。真的來(lái)不及了
    夏十里閱讀 183評(píng)論 0 0