您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么實(shí)現(xiàn)nginx的原理分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
1. 了解一下在nginx使用中常見(jiàn)的信號(hào)處理
kill -SIGHUP $ngx_master_pid # 相當(dāng)于nginx -s reload 從新啟動(dòng)新的work進(jìn)程kill -SIGTERM $ngx_work_pid # 重建指定nginx work進(jìn)程ID的進(jìn)程
對(duì)于nginx的master進(jìn)程來(lái)說(shuō)可以接收到的信號(hào):
以下四個(gè)信號(hào)是可以通過(guò)nginx命令與參數(shù)實(shí)現(xiàn)的
TERM,INT 表示立刻停止nginx進(jìn)程
QUIT 表示優(yōu)雅的停止nginx進(jìn)程,就是慢慢的停止nginx進(jìn)程,不要對(duì)用戶發(fā)送立刻結(jié)束連接,像tcp的reset復(fù)位請(qǐng)求這樣的報(bào)文
HUP 表示重載配置文件
USR1表示重新打開(kāi)日志文件
以下兩個(gè)信號(hào)專門用于進(jìn)行nginx的熱部署的時(shí)候使用,但是只能通過(guò)linux命令行的kill實(shí)現(xiàn)
USR2 發(fā)送熱更新信號(hào)
WINCH 用于通知下線舊的work進(jìn)程
當(dāng)我們?cè)诿钚兄惺褂胣ginx與參數(shù)實(shí)現(xiàn)對(duì)nginx的管理時(shí),實(shí)質(zhì)上就是獲取當(dāng)前nginx運(yùn)行的pid文件中的pid,然后通過(guò)命令行向pid發(fā)送對(duì)應(yīng)的信號(hào)
reload -> HUP
Reopen -> USR1
stop -> TERM
Quit -> QUIT
2. nginx在重載配置文件究竟做了什么?
思考優(yōu)雅的退出和立即退出有什么區(qū)別呢?你知道嗎?
1. 向master進(jìn)程發(fā)送HUP信號(hào)(reload命令)2. master進(jìn)程校驗(yàn)配置語(yǔ)法是否正確(因此我們?cè)谶M(jìn)行reload的時(shí)候,不一定非要先執(zhí)行一個(gè)`nginx -t`)3. master進(jìn)程打開(kāi)新的監(jiān)聽(tīng)端口(可能引入了https,監(jiān)聽(tīng)了443,此時(shí)work就會(huì)共用打開(kāi)的端口)4. master進(jìn)程用新配置啟動(dòng)新的worker子進(jìn)程5. master進(jìn)程向老的worker子進(jìn)程發(fā)送Quit信號(hào)(在新的版本中nginx添加一個(gè)nginx shutdown timeout,這個(gè)就是在新老worker子進(jìn)程同時(shí)存在的時(shí)候,限制老的worker進(jìn)程最遲多久退出)6. 老worker進(jìn)程關(guān)閉監(jiān)聽(tīng)句柄,處理完當(dāng)前連接后結(jié)束進(jìn)程
3. nginx熱升級(jí)的完整流程是什么樣的?
新的worker進(jìn)程升級(jí)出現(xiàn)問(wèn)題,想要考慮回滾?
老的worker進(jìn)程一直退不掉?
升級(jí)了nginx之后,發(fā)現(xiàn)很多預(yù)期的功能不能使用,配置報(bào)錯(cuò)?
當(dāng)我們?cè)谔幚韓ginx的版本升級(jí)或者增加新的擴(kuò)展模塊的時(shí)候或多或少的會(huì)遇到這些問(wèn)題,熟悉nginx升級(jí)原理很快解決這些問(wèn)題。
1. 將舊nginx文件換成新的nginx文件(注意備份) 2. 向master進(jìn)程發(fā)送USR2信號(hào)3. master進(jìn)程修改pid文件名,加后綴.oldbin4. master進(jìn)程用新nginx文件啟動(dòng)新master進(jìn)程5. 向老master進(jìn)程發(fā)送quit信號(hào),關(guān)閉老的master進(jìn)程6. 回滾: 向老master發(fā)送HUP,向新master發(fā)送quit
4. 如何優(yōu)雅的關(guān)閉nignx的worker進(jìn)程?
如何優(yōu)雅的關(guān)閉連接呢?worker進(jìn)程可以識(shí)別當(dāng)前的進(jìn)程是否正在處理請(qǐng)求,若沒(méi)有處理請(qǐng)求的時(shí)候,就可以將連接進(jìn)行關(guān)閉,但是當(dāng)nginx代理websocket的協(xié)議的時(shí)候,是做不到這點(diǎn)的,因?yàn)樵趙ebsocket后端通信的frame幀里面,nginx是不解析的,所以是不能識(shí)別的。當(dāng)nignx代理的是tcp請(qǐng)求的時(shí)候,因?yàn)闊o(wú)法判斷一個(gè)請(qǐng)求要經(jīng)歷多少報(bào)文才結(jié)束,因此也是不能識(shí)別進(jìn)程是否正在處理請(qǐng)求,但是對(duì)于Http請(qǐng)求,nginx是可以的。
1. 設(shè)置定時(shí)器 `worker_shutdown_timeout`,然后給進(jìn)程設(shè)置一個(gè)優(yōu)雅關(guān)閉的標(biāo)志位2. 關(guān)閉監(jiān)聽(tīng)句柄不在接收新的連接3. 關(guān)閉空閑連接4. 在循環(huán)中等待全部連接關(guān)閉5. 退出進(jìn)程
上述內(nèi)容就是怎么實(shí)現(xiàn)nginx的原理分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。