當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 正常關閉執行緒

 

arrow
arrow

    痞客興 發表在 痞客邦 留言(0) 人氣()