Nginx命令行控制


在Linux中,需要使用命令行來控制Nginx服務器的啟動與停止、重載配置文件、回滾日志文件、平滑升級等行為。默認情況下,Nginx被安裝在目錄usrlocal/nginx/中,其二進制文件路徑為usrlocal/nginc/sbin/nginx,配置文件路徑為usrlocal/nginx/conf/nginx.conf。當然,在configure執行時是可以指定把它們安裝在不同目錄的。為了簡單起見,本節只說明默認安裝情況下的命令行的使用情況,如果讀者安裝的目錄發生了變化,那么替換一下即可。

(1)默認方式啟動
直接執行Nginx二進制程序。例如:
usrlocal/nginx/sbin/nginx
這時,會讀取默認路徑下的配置文件:usrlocal/nginx/conf/nginx.conf。
實際上,在沒有顯式指定nginx.conf配置文件路徑時,將打開在configure命令執行時使用--conf-path=PATH指定的nginx.conf文件。

(2)另行指定配置文件的啟動方式
使用-c參數指定配置文件。例如:
usrlocal/nginx/sbin/nginx -c tmpnginx.conf
這時,會讀取-c參數后指定的nginx.conf配置文件來啟動Nginx。

(3)另行指定安裝目錄的啟動方式
使用-p參數指定Nginx的安裝目錄。例如:
usrlocal/nginx/sbin/nginx -p usrlocal/nginx/

(4)另行指定全局配置項的啟動方式
可以通過-g參數臨時指定一些全局配置項,以使新的配置項生效。例如:
usrlocal/nginx/sbin/nginx -g "pid varnginx/test.pid;"
上面這行命令意味着會把pid文件寫到varnginx/test.pid中。
-g參數的約束條件是指定的配置項不能與默認路徑下的nginx.conf中的配置項相沖突,否則無法啟動。就像上例那樣,類似這樣的配置項:pid logs/nginx.pid,是不能存在於默認的nginx.conf中的。
另一個約束條件是,以-g方式啟動的Nginx服務執行其他命令行時,需要把-g參數也帶上,否則可能出現配置項不匹配的情形。例如,如果要停止Nginx服務,那么需要執行下面代碼:
usrlocal/nginx/sbin/nginx -g "pid varnginx/test.pid;" -s stop
如果不帶上-g"pidvarnginx/test.pid;",那么找不到pid文件,也會出現無法停止服務的情況。

(5)測試配置信息是否有錯誤
在不啟動Nginx的情況下,使用-t參數僅測試配置文件是否有錯誤。例如:
usrlocal/nginx/sbin/nginx -t
執行結果中顯示配置是否正確。

(6)在測試配置階段不輸出信息
測試配置選項時,使用-q參數可以不把error級別以下的信息輸出到屏幕。例如:
usrlocal/nginx/sbin/nginx -t –q

(7)顯示版本信息
使用-v參數顯示Nginx的版本信息。例如:
usrlocal/nginx/sbin/nginx –v

(8)顯示編譯階段的參數
使用-V參數除了可以顯示Nginx的版本信息外,還可以顯示配置編譯階段的信息,如GCC編譯器的版本、操作系統的版本、執行configure時的參數等。例如:
usrlocal/nginx/sbin/nginx –V

(9)快速地停止服務
使用-s stop可以強制停止Nginx服務。-s參數其實是告訴Nginx程序向正在運行的Nginx服務發送信號量,Nginx程序通過nginx.pid文件中得到master進程的進程ID,再向運行中的master進程發送TERM信號來快速地關閉Nginx服務。例如:
usrlocal/nginx/sbin/nginx -s stop
實際上,如果通過kill命令直接向nginx master進程發送TERM或者INT信號,效果是一樣的。例如,先通過ps命令來查看nginx master的進程ID:
:ahf5wapi001:root > ps -ef | grep nginx
root 10800 1 0 02:27 ? 00:00:00 nginx: master process ./nginx
root 10801 10800 0 02:27 ? 00:00:00 nginx: worker process
接下來直接通過kill命令來發送信號:
kill -s SIGTERM 10800
或者:
kill -s SIGINT 10800
上述兩條命令的效果與執行usrlocal/nginx/sbin/nginx-s stop是完全一樣的。

(10)“優雅”地停止服務
如果希望Nginx服務可以正常地處理完當前所有請求再停止服務,那么可以使用-s quit參數來停止服務。例如:
usrlocal/nginx/sbin/nginx -s quit
該命令與快速停止Nginx服務是有區別的。當快速停止服務時,worker進程與master進程在收到信號后會立刻跳出循環,退出進程。而“優雅”地停止服務時,首先會關閉監聽端口,停止接收新的連接,然后把當前正在處理的連接全部處理完,最后再退出進程。
與快速停止服務相似,可以直接發送QUIT信號給master進程來停止服務,其效果與執行-s quit命令是一樣的。例如:
kill -s SIGQUIT <nginx master pid>
如果希望“優雅”地停止某個worker進程,那么可以通過向該進程發送WINCH信號來停止服務。例如:
kill -s SIGWINCH <nginx worker pid>

(11)使運行中的Nginx重讀配置項並生效
使用-s reload參數可以使運行中的Nginx服務重新加載nginx.conf文件。例如:
usrlocal/nginx/sbin/nginx -s reload
事實上,Nginx會先檢查新的配置項是否有誤,如果全部正確就以“優雅”的方式關閉,再重新啟動Nginx來實現這個目的。類似的,-s是發送信號,仍然可以用kill命令發送HUP信號來達到相同的效果。
kill -s SIGHUP <nginx master pid>

(12)日志文件回滾
使用-s reopen參數可以重新打開日志文件,這樣可以先把當前日志文件改名或轉移到其他目錄中進行備份,再重新打開時就會生成新的日志文件。這個功能使得日志文件不至於過大。例如:
usrlocal/nginx/sbin/nginx -s reopen
當然,這與使用kill命令發送USR1信號效果相同。
kill -s SIGUSR1 <nginx master pid>

(13)平滑升級Nginx
當Nginx服務升級到新的版本時,必須要將舊的二進制文件Nginx替換掉,通常情況下這是需要重啟服務的,但Nginx支持不重啟服務來完成新版本的平滑升級。
升級時包括以下步驟:
1)通知正在運行的舊版本Nginx准備升級。通過向master進程發送USR2信號可達到目的。例如:
kill -s SIGUSR2 <nginx master pid>
這時,運行中的Nginx會將pid文件重命名,如將usrlocal/nginx/logs/nginx.pid重命名為usrlocal/nginx/logs/nginx.pid.oldbin,這樣新的Nginx才有可能啟動成功。
2)啟動新版本的Nginx,可以使用以上介紹過的任意一種啟動方法。這時通過ps命令可以發現新舊版本的Nginx在同時運行。
3)通過kill命令向舊版本的master進程發送SIGQUIT信號,以“優雅”的方式關閉舊版本的Nginx。隨后將只有新版本的Nginx服務運行,此時平滑升級完畢。

(14)顯示命令行幫助
使用-h或者-?參數會顯示支持的所有命令行參數。


參考書籍:《深入理解Nginx模塊開發與架構解析》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM