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