天天看點

Nginx基本指令&不停機版本更新

在上一篇文章【Linux】Ubuntu安裝Nginx(線上安裝&源碼編譯安裝)中,我們已經通過源碼編譯安裝nginx,其nginx執行檔案的位址為:/usr/local/nginx

1.Nginx工作模型

我們先來看看nginx啟動之後的程序情況:

ps -ef|grep nginx
 
 # 輸出結果
 root        1036       1  0 02:33 ?        00:00:00 nginx: master process ./nginx
 nobody      1037    1036  0 02:33 ?        00:00:00 nginx: worker process           

可以看到,目前運作的nginx存在一個master程序和一個worker程序,它們有着明确的分工:

  • master程序:讀取和評估配置。
  • worker程序:處理請求,工作程序的數量可以在配置檔案中定義。
nginx采用基于事件的模型并依賴于作業系統的機制高效地在工作程序之間分發請求。

2.Nginx基本指令

2.1 nginx指令

一般所有的軟體,都有類似于help的指令,nginx中我們使用nginx -h或者nginx -?即可進行檢視。

# 先進入nginx執行檔案目錄
 cd /usr/local/nginx
 # ./nginx -h
 
 Options:
   -?,-h         : this help
   -v            : show version and exit
   -V            : show version and configure options then exit
   -t            : test configuration and exit
   -T            : test configuration, dump it and exit
   -q            : suppress non-error messages during configuration testing
   -s signal     : send signal to a master process: stop, quit, reopen, reload
   -p prefix     : set prefix path (default: /usr/local/nginx/)
   -c filename   : set configuration file (default: /usr/local/nginx/nginx.conf)
   -g directives : set global directives out of configuration file           

可以看到,nginx為我們列出了參數指令的含義。

參數 含義
-?,-h 檢視幫助資訊
-v 檢視nginx版本
-V 檢視nginx版本以及配置選項
-t 測試配置檔案文法是否正确
-T 測試配置檔案文法是否正确,并輸出配置内容
-q 測試配置檔案過程中不顯示非錯誤資訊
-s 向master程序發送指令,stop:快速關閉,quit:優雅關閉,reopen:重新打開日志,reload:重新加載配置檔案
-p 設定nginx執行路徑,預設為/usr/local/nginx/
-c 以指定配置檔案啟動(/usr/local/nginx/nginx.conf)
-g 從設定配置檔案中全局指令(./nginx -g "pid logs/new.pid",便可以在啟動nginx時修改配置檔案中的預設配置)

在工作中,可能經常涉及到配置檔案的修改,是以,使用比較多的指令:

nginx -t           

修改配置檔案後,先測試配置檔案文法的正确性

nginx -s reload           

修改配置檔案後,通知master程序重新加載配置檔案,master程序會啟動新的worker程序,并向舊的worker程序發送關閉指令,舊的worker程序收到關閉指令後,停止接收新的連接配接直到目前工作結束後退出。

2.2 kill指令

除了使用nginx指令,我們還可以通過kill指令向nginx的master程序和worker程序發送信号,其中某些指令的效果與執行nginx -s signal的效果是一樣的。

master程序支援的信号:

信号 含義
TERM, INT 快速關閉。與nginx -s stop效果一緻。kill -s TERM pid,kill -s INT pid
QUIT 優雅關閉。與nginx -s quit效果一緻。kill -s QUIT pid
HUP 重新加載配置,與nginx -s reload效果一緻。kill -s HUP pid
USR1 重新打開日志。kill -s USR1 pid
USR2 更新nginx可執行檔案,可以用來不停機更新nginx版本。kill -s USR2 pid
WINCH 優雅關閉worker程序。kill -s WINCH pid

worker程序支援的信号:

信号 含義
TERM, INT 快速關閉。kill -s TERM pid,kill -s INT pid
QUIT 優雅關閉。kill -s QUIT pid
USR1 重新打開日志。kill -s USR1 pid
WINCH 調試異常終止。kill -s WINCH pid

3.Nginx版本更新

1)檢視目前版本

./nginx -v
 nginx version: nginx/1.18.0           

2)準備新版本

下載下傳連結:http://nginx.org/download/nginx-1.22.1.tar.gz

3)解壓縮

tar zxvf nginx-1.22.1.tar.gz           

4)設定configure

cd /home/stone/nginx-1.22.1/
 sudo ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid           

5)編譯

sudo make           
更新過程,隻需要編譯,不需要安裝,否則會覆寫已經安裝的版本

6)檢視新編譯的版本

cd objs/
 ls
 autoconf.err  Makefile  nginx  nginx.8  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  ngx_modules.o  src           
可以看到,該目錄下也存在一個nginx檔案,運作nginx -v檢視
./nginx -v
 nginx version: nginx/1.22.1           

7)備份原nginx可執行檔案

如果後續更新失敗,還可以進行版本復原
cd /usr/local/nginx
 sudo mv nginx nginx.bak           

8)複制新的nginx可執行檔案進行替換

cd /home/stone/nginx-1.22.1/objs
 sudo cp nginx /usr/local/nginx/           

9)檢視目前nginx程序

ps -ef|grep nginx
 # 輸出結果
 root        3253       1  0 11:07 ?        00:00:00 nginx: master process ./nginx
 nobody      3254    3253  0 11:07 ?        00:00:00 nginx: worker process
 stone      24596    3181  0 13:50 pts/1    00:00:00 grep --color=auto nginx           

10)執行更新指令

sudo kill -s USR2 `more /usr/local/nginx/nginx.pid`           

再次檢視nginx程序,可以看到建立了新的master程序和worker程序,與此同時,也是将舊版本的nginx的pid儲存到nginx.pid.oldbin中。

ps -ef|grep nginx
 # 輸出結果
 root        3253       1  0 11:07 ?        00:00:00 nginx: master process ./nginx
 nobody      3254    3253  0 11:07 ?        00:00:00 nginx: worker process
 root       25675    3253  0 13:53 ?        00:00:00 nginx: master process ./nginx
 nobody     25676   25675  0 13:53 ?        00:00:00 nginx: worker process           

我們可以檢視一下這個檔案,确實,其記錄了舊版本的master程序pid

cat /usr/local/nginx/nginx.pid.oldbin 
 3253           

此時,所有的worker程序(包括新的和舊的)繼續接收請求,我們可以向舊版本的master程序發送WINCH指令以關閉其worker程序。

sudo kill -s winch `cat /usr/local/nginx/nginx.pid.oldbin`           

再次檢視nginx程序,舊版本的worker程序已經優雅退出,隻剩下master程序。

ps -ef|grep nginx
 root        3253       1  0 11:07 ?        00:00:00 nginx: master process ./nginx
 root       25675    3253  0 13:53 ?        00:00:00 nginx: master process ./nginx
 nobody     25676   25675  0 13:53 ?        00:00:00 nginx: worker process           

如果新版本的worker程序運作正常,那麼我們就可以向舊版本的master程序發送QUIT指令優雅退出。

sudo kill -s quit `cat /usr/local/nginx/nginx.pid.oldbin`           

到這裡,我們的nginx版本也就在不停機的情況下平滑更新完成了。

繼續閱讀