據the Nginx documentation:Nginx如何在不丟失任何請求的情況下進行升級?
如果你需要用一個新的來代替Nginx的二進制 (升級到 新版本時,或添加/刪除服務器 模塊),你可以做到這一點沒有任何 服務中斷 - 沒有傳入的 請求將會丟失。
我的同事和我試圖弄清楚:這是如何工作的?。我們知道(我們認爲):
- 只有一個進程可以在80端口在
- Nginx的創建一個套接字並將其連接到端口80
- 父進程及其任意子的時間傾聽都可以綁定到同一個插座,這是nginx怎麼可以有多個工子女響應請求
我們也做了一些實驗nginx的,就像這樣:
- 發送
kill -USR2
當前的主進程 - 反覆運行
ps -ef | grep unicorn
看到任何麒麟過程中,用自己的PID和他們的父母的PID - 注意的是,新的主進程是,首先,老主人的孩子進程,但是當舊的主進程結束時,新的主進程有ppi
顯然,新的主進程可以在它們都運行時監聽與舊進程相同的套接字,因爲那時候,新的主人是老主人的孩子。但不知何故,新的主流程可以成爲......呃......沒有人的孩子?
我認爲這是標準的Unix的東西,但我對進程和端口和套接字的理解是相當模糊的。任何人都可以更詳細地解釋這一點嗎?我們的任何假設都錯了嗎?有沒有一本我可以閱讀的書來真正理解這些東西?
應該注意的是,根據nginx文檔,舊的和新的主進程都處理連接,直到您發送一個WINCH信號給舊的主進程。 – Adam 2011-03-17 21:40:28