天天看點

《深入了解Nginx:子產品開發與架構解析》一1.6 Nginx的指令行控制

在linux中,需要使用指令行來控制nginx伺服器的啟動與停止、重載配置檔案、復原日志檔案、平滑更新等行為。預設情況下,nginx被安裝在目錄/usr/local/nginx/中,其二進制檔案路徑為/usr/local/nginc/sbin/nginx,配置檔案路徑為/usr/local/nginx/conf/nginx.conf。當然,在configure執行時是可以指定把它們安裝在不同目錄的。為了簡單起見,本節隻說明預設安裝情況下的指令行的使用情況,如果讀者安裝的目錄發生了變化,那麼替換一下即可。

(1)預設方式啟動

直接執行nginx二進制程式。例如:

這時,會讀取預設路徑下的配置檔案:/usr/local/nginx/conf/nginx.conf。

實際上,在沒有顯式指定nginx.conf配置檔案路徑時,将打開在configure指令執行時使用--conf-path=path指定的nginx.conf檔案(參見1.5.1節)。

(2)另行指定配置檔案的啟動方式

使用-c參數指定配置檔案。例如:

這時,會讀取-c參數後指定的nginx.conf配置檔案來啟動nginx。

(3)另行指定安裝目錄的啟動方式

使用-p參數指定nginx的安裝目錄。例如:

(4)另行指定全局配置項的啟動方式

可以通過-g參數臨時指定一些全局配置項,以使新的配置項生效。例如:

上面這行指令意味着會把pid檔案寫到/var/nginx/test.pid中。

-g參數的限制條件是指定的配置項不能與預設路徑下的nginx.conf中的配置項相沖突,否則無法啟動。就像上例那樣,類似這樣的配置項:pid logs/nginx.pid,是不能存在于預設的nginx.conf中的。

另一個限制條件是,以-g方式啟動的nginx服務執行其他指令行時,需要把-g參數也帶上,否則可能出現配置項不比對的情形。例如,如果要停止nginx服務,那麼需要執行下面代碼:

如果不帶上-g "pid /var/nginx/test.pid;",那麼找不到pid檔案,也會出現無法停止服務的情況。

(5)測試配置資訊是否有錯誤

在不啟動nginx的情況下,使用-t參數僅測試配置檔案是否有錯誤。例如:

執行結果中顯示配置是否正确。

(6)在測試配置階段不輸出資訊

測試配置選項時,使用-q參數可以不把error級别以下的資訊輸出到螢幕。例如:

(7)顯示版本資訊

使用-v參數顯示nginx的版本資訊。例如:

(8)顯示編譯階段的參數

使用-v參數除了可以顯示nginx的版本資訊外,還可以顯示配置編譯階段的資訊,如gcc編譯器的版本、作業系統的版本、執行configure時的參數等。例如:

(9)快速地停止服務

使用-s stop可以強制停止nginx服務。-s參數其實是告訴nginx程式向正在運作的nginx服務發送信号量,nginx程式通過nginx.pid檔案中得到master程序的程序id,再向運作中的master程序發送term信号來快速地關閉nginx服務。例如:

實際上,如果通過kill指令直接向nginx master程序發送term或者int信号,效果是一樣的。例如,先通過ps指令來檢視nginx master的程序id:

接下來直接通過kill指令來發送信号:

或者:

上述兩條指令的效果與執行/usr/local/nginx/sbin/nginx -s stop是完全一樣的。

(10)“優雅”地停止服務

如果希望nginx服務可以正常地處理完目前所有請求再停止服務,那麼可以使用-s quit參數來停止服務。例如:

/usr/local/nginx/sbin/nginx -s quit

該指令與快速停止nginx服務是有差別的。當快速停止服務時,worker程序與master程序在收到信号後會立刻跳出循環,退出程序。而“優雅”地停止服務時,首先會關閉監聽端口,停止接收新的連接配接,然後把目前正在處理的連接配接全部處理完,最後再退出程序。

與快速停止服務相似,可以直接發送quit信号給master程序來停止服務,其效果與執行-s quit指令是一樣的。例如:

如果希望“優雅”地停止某個worker程序,那麼可以通過向該程序發送winch信号來停止服務。例如:

(11)使運作中的nginx重讀配置項并生效

使用-s reload參數可以使運作中的nginx服務重新加載nginx.conf檔案。例如:

事實上,nginx會先檢查新的配置項是否有誤,如果全部正确就以“優雅”的方式關閉,再重新啟動nginx來實作這個目的。類似的,-s是發送信号,仍然可以用kill指令發送hup信号來達到相同的效果。

kill -s sighup

(12)日志檔案復原

使用-s reopen參數可以重新打開日志檔案,這樣可以先把目前日志檔案改名或轉移到其他目錄中進行備份,再重新打開時就會生成新的日志檔案。這個功能使得日志檔案不至于過大。例如:

當然,這與使用kill指令發送usr1信号效果相同。

(13)平滑更新nginx

當nginx服務更新到新的版本時,必須要将舊的二進制檔案nginx替換掉,通常情況下這是需要重新開機服務的,但nginx支援不重新開機服務來完成新版本的平滑更新。

更新時包括以下步驟:

1)通知正在運作的舊版本nginx準備更新。通過向master程序發送usr2信号可達到目的。例如:

這時,運作中的nginx會将pid檔案重命名,如将/usr/local/nginx/logs/nginx.pid重命名為/usr/local/nginx/logs/nginx.pid.oldbin,這樣新的nginx才有可能啟動成功。

2)啟動新版本的nginx,可以使用以上介紹過的任意一種啟動方法。這時通過ps指令可以發現新舊版本的nginx在同時運作。

3)通過kill指令向舊版本的master程序發送sigquit信号,以“優雅”的方式關閉舊版本的nginx。随後将隻有新版本的nginx服務運作,此時平滑更新完畢。

(14)顯示指令行幫助

使用-h或者-?參數會顯示支援的所有指令行參數。

繼續閱讀