1. 程式人生 > >Nginx 的程序結構,你明白嗎?

Nginx 的程序結構,你明白嗎?

Nginx 程序結構

這篇文章我們來看下 Nginx 的程序結構,Nginx 其實有兩種程序結構:

  • 單程序結構
  • 多程序結構

單程序結構實際上不適用於生產環境,只適合我們做開發除錯使用。因為在生產環境中我們必須保持 Nginx 足夠健壯以及 Nginx 可以利用多核的一個特性,而單程序的 Nginx 是做不到這一點的,所以預設的配置中都是開啟為多程序的 Nginx。

我們來看一下,多程序的 Nginx 結構中它的程序模型是怎樣的。

多程序中的 Nginx 程序架構如下圖所示,會有一個父程序(Master Process),它會有很多子程序(Child Processes),這些子程序會分為兩類:

  • worker 程序
  • cache 相關的程序

為什麼 Nginx 採用多程序結構而不是多執行緒結構呢?

因為 Nginx 最核心的一個目的是要保持高可用性、高可靠性,而當 Nginx 如果使用的是多執行緒結構的時候,因為執行緒之間是共享同一個地址空間的,所以當某一個第三方模組引發了一個地址空間導致的段錯誤時、在地址越界出現時,會導致整個 Nginx 程序全部掛掉。而當採用多程序模型時,往往不會出現這樣的問題。從上圖可以看到 Nginx 在做程序設計時,同樣遵循了實現高可用、高可靠這樣的一個目的。

比如說在 master 程序中,通常第三方模組是不會在 master 部分加入自己的功能程式碼的。雖然 Nginx 在設計時,允許第三方模組在 master 程序中新增自己獨有的、自定義的一些方法,但是通常沒有第三方模組這麼做。

master 程序被設計用來的目的是做 worker 程序的管理的,也就是所有的 worker 程序是處理真正的請求的,而 master 程序負責監控每個 worker 程序是不是在正常的工作、需不需要做重新載入配置檔案、需不需要做熱部署。

而 cache (快取)是在多個 worker 程序間共享的,而且快取不僅要被 worker 程序使用,還要被 cache manager 和 cache loader程序 使用。cache manager 和 cache loader 也是為反向代理時,後端發來的動態請求做快取所使用的,cache loader 只是用來做快取的載入、cache manager 用來做快取的管理。實際上每個請求處理時,使用到快取還是由 worker 程序來進行的。

這些程序間的通訊,都是使用共享記憶體來解決的。可以看到cache manager 和 cache loader各有一個程序,master 程序因為是父程序,所以肯定只有一個。那麼 worker 程序為什麼會有很多呢?這是因為 Nginx 採用了事件驅動引擎以後,他希望每一個 worker 程序從頭到尾佔有一顆CPU,所以往往不止要把 worker 程序的數量配置與我們伺服器上的 CPU核數一致以外,還需要把每一個worker程序與某一顆CPU核繫結在一起,這樣可以更好的使用每顆CPU核上面的CPU快取來減少快取失效的命中率。

以上就是 Nginx 的程序結構的介紹,瞭解這些後更有助於我們去配置 Nginx。

剛才我們介紹了 Nginx 使用了多程序模型,由 master 作為父程序啟動許多子程序,也知道了 Nginx 父子程序之間是通過訊號來管理的,接下來通過一個例項給大家直觀的看下父子程序以及訊號之間是如何工作的。

Nginx 的程序結構例項

首先啟動 Nginx,並在 Nginx 中啟動了兩個 worker 程序,通過 ps 命令可以看到當前程序 PID 和父程序 PID,有一個 nginx master 程序是由 root 使用者起的,程序 PID 是 2368。還有兩個 worker 程序和 cache 程序,它們是由 2368 程序起來的。它們的程序 PID 分別為 8652,8653,8655。

現在我們使用 ./sbin/nginx -s reload 命令,會把之前的 worker 程序和 cache 程序優雅的退出,然後再使用的新的配置項啟動新的 worker 程序,這裡我們並沒有改變配置,但是我們可以看到老的三個子程序會退出,並生成新的子程序。

可以看到,之前的三個子程序,現在已經都不在了,反而由 2368 新起了 8657,8658,8660 三個子程序。

[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4751  4688  0 11:41 pts/0    00:00:00 grep --color=auto nginx
nginx     8652  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8653  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8655  2368  0 Nov12 ?        00:00:00 nginx: cache manager process
[root@wupx nginx]# ./sbin/nginx -s reload
[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4753  4688  0 11:43 pts/0    00:00:00 grep --color=auto nginx
nginx     8657  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8658  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8660  2368  0 Nov12 ?        00:00:00 nginx: cache manager process

執行命令之後可以看到 worker 的 PID 已經變化了(之前講過 ./sbin/nginx -s reloadkill -SIGHUP 作用是一樣的。)。

kill -SIGTERM 是向現有的 worker 程序傳送退出的訊號,對應的 worker 程序就會退出;程序在退出時,會自動向父程序 master 傳送一個退出訊號,master 就知道他的子程序退出了,然後新起一個 worker 程序。

[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4753  4688  0 11:43 pts/0    00:00:00 grep --color=auto nginx
nginx     8657  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8658  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8660  2368  0 Nov12 ?        00:00:00 nginx: cache manager process
[root@wupx nginx]# kill -SIGTERM 8658
[root@wupx nginx]# ps -ef|grep nginx
root      2368     1  0 Sep21 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      4753  4688  0 11:44 pts/0    00:00:00 grep --color=auto nginx
nginx     8657  2368  0 Nov12 ?        00:00:00 nginx: worker process
nginx     8660  2368  0 Nov12 ?        00:00:00 nginx: cache manager process
nginx     8663  2368  0 Nov12 ?        00:00:00 nginx: worker process

通過例項演示,我們可以看到 Nginx 的程序結構以及 Nginx 使用訊號的方式,其實命令列中的許多子命令就是再向 master 程序傳送訊號而已。

相關推薦

Nginx程序結構明白

Nginx 程序結構 這篇文章我們來看下 Nginx 的程序結構,Nginx 其實有兩種程序結構: 單程序結構 多程序結構 單程序結構實際上不適用於生產環境,只適合我們做開發除錯使用。因為在生產環境中我們必須保持 Nginx 足夠健壯以及 Nginx 可以利用多核的一個特性,而單程序的 Nginx 是做不

網站建設—流行的H5時代明白

一、H5頁豐富簡潔 基於H5的網站可以說是反應性設計,改進了頁面多媒體元素的使用。以前的網站提倡減少動畫和視訊的使用,由於網站上的資源空間很大,導致頁面載入速度慢。然而,現在使用基於H5的網站不僅可以大膽使用這些元素,而且可以避免瀏覽不暢的問題,同時使頁面看起來更豐富,並確保其整潔。 二

漫畫:程序能“管理”好的產品經理

重構 -c 強行 發的 cbe 基本功 能效 開發人員 alt 一、第三選擇 在工作中,你面對產品經理的各種需求變動、項目經理對關鍵點的 Deadline,總會有一些沖突發生。而對於事情最終執行的開發人員來說,如果這些沖突處理的不好,可能就會變成你個人的問題。 做為最終

最美的C語言程序流體會做

分享 eba back microsoft media style .cn http 函數 最美的C語言流體閱讀須知 1 編譯器:vs 2 圖形庫插件 3 四肢健全者 4代碼段 全局變量代碼段 主要函數主函數 mian函數效果最美的C語言程序流體,你會做嗎?

【模型解讀】GoogLeNet中的inception結構看懂了

文章首發於微信公眾號《與有三學AI》 03 這是深度學習模型解讀第3篇,本篇我們將介紹GoogLeNet v1到v3。 01 Inception V1【1】 GoogLeNet首次出現在2014年ILSVRC 比賽中獲得冠軍。這次的版本通常稱其為Inceptio

序列型別協議結構懂了

序列型別的協議 序列抽象基類的資料結構 都在 from collections import abc 這個模組,我們開啟 from _collections_abc import all,在abc 模組裡面可以看到內容如下 : __all__ = ["A

Nginx 的請求處理流程瞭解

之前我們已經講解了 Nginx 的基礎內容,接下來我們開始介紹 Nginx 的架構基礎。 為什麼我們要討論 Nginx 的架構基礎? 因為 Nginx 執行在企業內網的最外層也就是邊緣節點,那麼他處理的的流量是其他應用伺服器處理流量的數倍,甚至幾個數量級,我們知道任何一種問題在不同的數量級下,他的解決方案是完

2017已過半這半年

忽略 php clas 慢慢 spa 去年 加油 你是 技術 轉眼,已到6月30日;轉眼,2017年已經過半。 逝者如斯夫,不舍晝夜! 你心頭是否閃過一絲驚慌,還是依舊淡定從容? 歲月匆匆,時光悠悠, 經不住似水流年, 留不過歲月變遷, 轉眼間,2017已經過半。 這半

來自開發者技術前線 高級程序需要養成這7個習慣

等等 網絡七層協議 有意 數據 爆發 程序員開發 提高 程序解耦 功能 要有負責心 在我們的每日工作中,有一半以上時間是在解決各種Bug。高級程序員在面對這些Bug時會從多個維度思考,Bug出現的時間、系統環境、硬件版本以及軟件版本等等。接著修復問題,嚴格自測,上線後觀察,

程序要每天進步一點點-轉載

事情 說了 相愛 調優 集中 nbsp 中間數據 丟了 試驗 第1個一點點:專註眼下 見過太多心猿意馬的程序員,我不得不把「專註眼下」作為天字第一條。他們往往有各式各樣的小夢想,比如做個小茶農、做個小鵝販、做產品、做銷售、做投資,卻被程序員的高薪或是沒有轉行的魄力「耽誤」了

這幾種遊戲類型認識

遊戲 生活RPG,中文翻譯為角色扮演,指的是玩家通過扮演遊戲中的某一角色來完成遊戲的完整內容,這類遊戲的特點是有較長的劇情主線,以及需要較多的時間為角色練級。戰鬥方式基本都為回合制,戰鬥方式為指令戰鬥,並且等級在遊戲中占了很大的比重。MMORPG,大型多人在線角色扮演遊戲,這是幾年前網遊常常采用的遊戲類型,

帶上RESTful的金手銬

是不是 還得 如果 在操作 出錯 你在 客戶 定義 tree命令   1. 首先RESTful是一套規範,不是框架,它是來約束你的。也不關心生產效率的提高。就好像使用匯編開發應用,性能是快了,但是生產效率很低。RESTful它需要你在路由上定義很多規則來解釋的URL,假如你

湯世聲: 普通人也可以變成記憶力超人知道

中國已經有幾十萬的孩子,他們可以 10分鐘記住100個隨機詞組! 10分鐘就能把100位隨機數字倒背如流! 30分鐘學會文科類記憶方法,從此天文地理,輕松拿下。 30分鐘學會思維導圖,從此不再思維受限 這不是天方夜譚!這更不是死記硬背!這只是一個科學的方法這只是一個開啟右腦潛能的鑰匙

Docker技術這些應用場景知道

docker docker應用場景 場景一:節省項目環境部署時間1.單項目打包每次部署項目到測試、生產等環境,都要部署一大堆依賴的軟件、工具,而且部署期間出現問題幾率很大,不經意就花費了很長時間。Docker主要理念就是環境打包部署,可在任意Docker Engine運行。前期我們只需要將每個項目環境

為創業我做了十年的程序告訴我“程序員不適合創業”?!

strong 然而 自勉 遇到 記得 很好 企業 人生 pos 今天啥事都不做了,一定要好好的懟一懟這家夥! 為了創業,我一個文科生,一個包工頭,27歲學編程,轉行做程序員,跳進這坑裏已經十年了……十年啊!人生有多少個十年?然後你告訴我程序員不

小象慢跑:可信網站認證對企業網站的重要性

網站建設 網站優化 網站推廣 如今隨著互聯網的,普及互聯網的普及,不僅改變了我們的生活工作方式,也讓企業的經營方式逐漸改變,很多傳統企業都建立了專門的網站來推廣品牌,大力向互聯網行業轉型,更有一些電商平臺、金融企業開始依托網絡來進行交易,大大促進了互聯網行業的發展。但同時,過快的增長速度,也讓一些

考研黨應該具備的考研精神

如果 了解 備考 決定 知識 自己的 加油 .com 夏天 考研黨應該具備的考研精神,你有嗎?  考研黨應該具備的哪些考研精神呢?想想當初你們為什麽會選擇考研這條路,看看自己是因為什麽堅持到了現在。相信你們終會通過自己的努力和汗水,獲得你們想要的結果。今天聚創考研就為大家分

置換工位可以提高企業效益心動

方便 ado .com 辦公協作 金融 聚集地 社群 分享圖片 聯合 逸管家聯合體集團是一家綜合性服務平臺,註冊成為聯合體成員,就可以享受集團內的各類優質資源,集團為企業提供互用銷售、互用辦公、互用金融、互用人才等服務。企業在逸管家辦公,除了可以享受集團內各種辦公資源,還可

2分鐘精準鑒別初級、中級、高級程序是哪一種?

為什麽 tinyproxy har bug 高級 業務 我會 sgx 是什麽 源 / 頂級程序員 文 / An先生 @jonde初級:產品是大爺中級:懟過產品高級:打過產品 初級:加班中級:不加班高級:你們加班 @sunsulei初級:嗯?中級:嗯。高級:嗯? @ti

2018年的“核心期刊陷阱”已開啟知道?2018年的“核心期刊陷阱”已開啟知道

無法 北大 發生 但是 社會 匹配 不清楚 都是 質量 2018年的“核心期刊陷阱”已開啟,你知道嗎? 北大核心期刊,也叫全國中文核心期刊。 北大核心期刊目錄所收錄的期刊並非終身制,而是三年評選一次,也就意味著三年之後,有些期刊可能就會因為質量問題而落選,同時,也會有新期