1. 程式人生 > >平滑升級你的Nginx

平滑升級你的Nginx

michael ins 跳過 ces auto down 可執行文件 manage too

1、概述(可以直接跳過看第2部分)

Nginx方便地幫助我們實現了平滑升級。其原理簡單概括,就是:

(1)在不停掉老進程的情況下,啟動新進程。

(2)老進程負責處理仍然沒有處理完的請求,但不再接受處理請求。

(3)新進程接受新請求。

(4)老進程處理完所有請求,關閉所有連接後,停止。

這樣就很方便地實現了平滑升級。一般有兩種情況下需要升級Nginx,一種是確實要升級Nginx的版本,另一種是要為Nginx添加新的模塊。

2. 升級過程

具體的操作也很簡單,如下:

(0)查看當前版本

在存放Nginx的可執行文件的目錄下輸入:

[java] view plain copy
  1. ./nginx -V


(1)下載新的Nginx版本並編譯。

[java] view plain copy
  1. wget nginx-1.0.11.tar.gz
  2. tar zxvf nginx-1.0.11.tar.gz
  3. cd nginx-1.0.11
  4. ./configure --add-module=/customized_module_0 --add-module=/customized_module_1
  5. make


註意不要進行make install

(2)備份老版本的可執行文件

[java] view plain copy
  1. cd /usr/local/nginx/sbin
  2. sudo cp nginx nginx.old


(3)修改配置文件

如果有必要的話,進行配置文件的修改。

(4)拷貝新的可執行文件

[java] view plain copy
  1. sudo cp /home/michael/tmp/nginx-1.0.11/objs/nginx /usr/local/nginx/sbin/


(5)升級

[java] view plain copy
  1. cd /home/michael/tmp/nginx-1.0.11
  2. make upgrade

(6)清理多余文件

[java] view plain copy
  1. rm -rf /home/michael/tmp/nginx-1.0.11


(7)查看Nginx版本

[java] view plain copy
  1. cd /usr/local/nginx/sbin
  2. ./nginx -V

3、觀察進程變化

在我的機器上可以觀察到,我配置的是10個worker進程,啟動後觀察到:

[plain] view plain copy
  1. root 6241 10419 0 10:51 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
  2. nobody 6242 6241 2 10:51 ? 00:00:00 nginx: worker process
  3. nobody 6243 6241 0 10:51 ? 00:00:00 nginx: worker process
  4. nobody 6244 6241 0 10:51 ? 00:00:00 nginx: worker process
  5. nobody 6245 6241 0 10:51 ? 00:00:00 nginx: worker process
  6. nobody 6246 6241 0 10:51 ? 00:00:00 nginx: worker process
  7. nobody 6247 6241 0 10:51 ? 00:00:00 nginx: worker process
  8. nobody 6248 6241 0 10:51 ? 00:00:00 nginx: worker process
  9. nobody 6249 6241 0 10:51 ? 00:00:00 nginx: worker process
  10. nobody 6250 6241 0 10:51 ? 00:00:00 nginx: worker process
  11. nobody 6251 6241 1 10:51 ? 00:00:00 nginx: worker process
  12. nobody 6252 6241 0 10:51 ? 00:00:00 nginx: cache manager process
  13. nobody 6253 6241 0 10:51 ? 00:00:00 nginx: cache loader process
  14. luming 6310 25051 0 10:51 pts/1 00:00:00 grep --color=auto nginx
  15. nobody 7995 10419 0 Jan12 ? 00:20:37 nginx: worker process is shutting down
  16. nobody 7996 10419 0 Jan12 ? 00:20:11 nginx: worker process is shutting down
  17. nobody 7998 10419 0 Jan12 ? 00:20:04 nginx: worker process is shutting down
  18. nobody 8003 10419 0 Jan12 ? 00:20:12 nginx: worker process is shutting down
  19. root 10419 1 0 Jan08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx


可見新的進程有1個master和10個worker,另外還有1個老的master(可以從時間上看出)和4個worker(其他6個老的worker已經處理完所有連接而shutdown了)。還有一個loader進程。過幾秒種可以看到worker只有兩個了:

[plain] view plain copy
  1. root 6241 10419 0 10:51 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
  2. nobody 6242 6241 1 10:51 ? 00:00:00 nginx: worker process
  3. nobody 6243 6241 0 10:51 ? 00:00:00 nginx: worker process
  4. nobody 6244 6241 0 10:51 ? 00:00:00 nginx: worker process
  5. nobody 6245 6241 0 10:51 ? 00:00:00 nginx: worker process
  6. nobody 6246 6241 0 10:51 ? 00:00:00 nginx: worker process
  7. nobody 6247 6241 0 10:51 ? 00:00:00 nginx: worker process
  8. nobody 6248 6241 0 10:51 ? 00:00:00 nginx: worker process
  9. nobody 6249 6241 0 10:51 ? 00:00:00 nginx: worker process
  10. nobody 6250 6241 0 10:51 ? 00:00:00 nginx: worker process
  11. nobody 6251 6241 0 10:51 ? 00:00:00 nginx: worker process
  12. nobody 6252 6241 0 10:51 ? 00:00:00 nginx: cache manager process
  13. nobody 6253 6241 0 10:51 ? 00:00:00 nginx: cache loader process
  14. luming 6430 25051 0 10:51 pts/1 00:00:00 grep --color=auto nginx
  15. nobody 7996 10419 0 Jan12 ? 00:20:11 nginx: worker process is shutting down
  16. nobody 8003 10419 0 Jan12 ? 00:20:12 nginx: worker process is shutting down
  17. root 10419 1 0 Jan08 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx


再過一小會兒觀察:

[plain] view plain copy
  1. root 6241 1 0 10:51 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
  2. nobody 6242 6241 0 10:51 ? 00:00:01 nginx: worker process
  3. nobody 6243 6241 0 10:51 ? 00:00:01 nginx: worker process
  4. nobody 6244 6241 0 10:51 ? 00:00:01 nginx: worker process
  5. nobody 6245 6241 0 10:51 ? 00:00:00 nginx: worker process
  6. nobody 6246 6241 0 10:51 ? 00:00:00 nginx: worker process
  7. nobody 6247 6241 0 10:51 ? 00:00:00 nginx: worker process
  8. nobody 6248 6241 0 10:51 ? 00:00:00 nginx: worker process
  9. nobody 6249 6241 0 10:51 ? 00:00:00 nginx: worker process
  10. nobody 6250 6241 0 10:51 ? 00:00:01 nginx: worker process
  11. nobody 6251 6241 0 10:51 ? 00:00:02 nginx: worker process
  12. nobody 6252 6241 0 10:51 ? 00:00:00 nginx: cache manager process
  13. luming 8680 25051 0 10:56 pts/1 00:00:00 grep --color=auto nginx

Congratulations! You can upgrade your Nginx server gracefully.

平滑升級你的Nginx