在上一篇文章【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版本也就在不停機的情況下平滑更新完成了。