當Nginx執行了一段時間後,可能會有新版本更新,或者因為需求必須加入新的功能模組.
如果你有多台Nginx並且有做分流,那可以一台台主機做更新,不會造成服務的中斷,
但是假設你只有一台Nginx,除非你老板同意,不然怎麼可能將服務停下來,等更新完再啟動服務.
所以如何不中斷服務就達到升級版本或重新編譯加入新模組,就很重要了,以下就是操作的步驟
1. 先獲得目前Nginx的主執行緒編號,就是master process的編號2713,而有另外的worker process,它的第二個數字是2713,代表是主執行緒所產生的工作執行緒
# ps -ef|grep nginx root 2713 1 0 20:08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 2714 2713 0 20:08 ? 00:00:00 nginx: worker process
2. 更新前先將你的Nginx安裝目錄備份,接著編譯新版本或加入新模組參數的Nginx到先前的安裝目錄,這時原先的目錄已經是新的程式了.(如何安裝編譯你可以參考這篇http://charleslin74.pixnet.net/blog/post/460115545)
3. 用以下的指令進行新版本的啟動
# kill -USR2 2713
4. 這時再使用ps -ef|grep nginx,這時你會發現同時出現了二個master process,除了舊的2713,還有一個2746,新舊版本同時執行,並同時處理外來的要求.
root 2713 1 0 20:08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 2714 2713 0 20:08 ? 00:00:00 nginx: worker process root 2746 2713 0 20:14 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 2747 2746 0 20:14 ? 00:00:00 nginx: worker process
5. 而且在Nginx的安裝路徑中的logs目錄(例如/usr/local/nginx/logs/),會出現以下變化,舊版的nginx.pid被加上了oldbin,並且產生了一個新版的nginx.pid
# ls /usr/local/nginx/logs/ access.log error.log nginx.pid nginx.pid.oldbin
6. 接下來要停止舊版本對要求的處理,以新版本為主,執行後發現2713 master process的worker process已經不見了,表示沒有再工作了
# kill -WINCH 2713 # ps -ef|grep nginx root 2713 1 0 20:08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx root 2746 2713 0 20:14 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 2747 2746 0 20:14 ? 00:00:00 nginx: worker process
7. 停止舊的版本
# kill -QUIT 2713 # ps -ef|grep nginx root 2746 1 0 20:14 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 2747 2746 0 20:14 ? 00:00:00 nginx: worker process
8. 另外說明適用Nginx的訊號控制
TERM, INT 快速關閉
QUIT 正常關閉
HUP 正常重啟服務
USR1 重開記錄檔,做為記錄檔分割
USR2 升級程式
WINCH 正常關閉執行緒
留言列表