1. 程式人生 > >nginx啟動、重啟、重新載入配置檔案和平滑升級

nginx啟動、重啟、重新載入配置檔案和平滑升級

Nginx有一個主程序和幾個工作程序,主程序的主要作用就是讀取、評估配置檔案和管理工作程序,工作程序對請求做實際處理。工作程序的數量是在配置檔案中配置的,一般設定為cpu的核心數*執行緒數。

nginx可以通過訊號控制,預設情況下,主程序的程序ID記錄在/usr/local/nginx/logs/nginx.pid 檔案中。訊號可以通過nginx可執行檔案傳送給nginx (nginx -s 訊號),也可以通過unix的kill命令傳送給nginx,這種情況下是將訊號直接傳送給指定程序ID的程序,如:kill QUIT 1628。


1、啟動nginx,直接執行nginx的可執行檔案:

[[email protected]
~]# /usr/local/nginx/sbin/nginx

2、停止nginx

快速關閉:nginx -s stop 或者kill -TERM 主程序號 或者kill -INT 主程序號

[[email protected] sbin]# pwd
/usr/local/nginx/sbin
[[email protected] sbin]# ./nginx -s stop

或者

[[email protected] sbin]# ps -ef |grep nginx|grep master
root       9879      1  0 13:15 ?        00:00:00 nginx: master process ./nginx
[
[email protected]
sbin]# kill -TERM 9879

或者

[[email protected] sbin]# kill -INT 9879

優雅關閉(不接受新的連線請求,等待舊的連線請求處理完畢再關閉):nginx -s quit 或者 kill -QUIT 主程序號

[[email protected] sbin]# pwd
/usr/local/nginx/sbin
[[email protected] sbin]# ./nginx -s quit
注意:執行該命令的使用者應該是啟動nginx的使用者
[[email protected]
sbin]# ps -ef |grep nginx root 9889 1 0 13:17 ? 00:00:00 nginx: master process ./nginx nobody 9890 9889 0 13:17 ? 00:00:00 nginx: worker process root 9893 2008 0 13:18 pts/1 00:00:00 grep nginx [[email protected] sbin]# kill -QUIT 9889

3、重新載入配置檔案:nginx -s reload  或者  kill -HUP 主程序號

nginx配置平滑更新
為了讓主程序重新讀取配置檔案,應該向主程序傳送一個HUP訊號,主程序一旦接收到重新載入配置的的訊號,它就檢查配置檔案語法的有效性,然後試圖應用新的配置,即開啟新的日誌檔案和新的socket 監聽,如果失敗,它將回滾配置更改並繼續使用舊的配置,如果成功了,它開啟新的工作程序,並給舊的工作程序發訊息讓它們優雅的關閉,舊的工作程序接收到關閉訊號後,不再接收新的請求,如果已有請求正在處理,等當前請求處理完畢後關閉,如果沒有請求正在處理,則直接關閉。

[[email protected] sbin]# ./nginx -s reload

或者

[[email protected] sbin]# ps -ef|grep nginx
root       9944      1  0 13:22 ?        00:00:00 nginx: master process ./nginx
nobody     9949   9944  0 13:23 ?        00:00:00 nginx: worker process
root       9960   9917  0 13:28 pts/1    00:00:00 grep nginx
[[email protected] sbin]# kill -HUP 9944

4、測試配置檔案,檢查配置檔案語法是否正確,然後試圖開啟檔案涉及的配置:nginx -t

[[email protected] sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
5、檢視nginx版本資訊: nginx -v
[[email protected] sbin]# ./nginx -v
nginx version: nginx/1.10.1

6、檢視nginx版本資訊,編譯版本,和配置引數:nginx -V
[[email protected] sbin]# ./nginx -V
nginx version: nginx/1.10.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) 
configure arguments: --prefix=/usr/local/nginx
7、重啟日誌檔案,備份日誌檔案時常用:nginx -s reopen 或者 kill -USR1 主程序號
[[email protected] sbin]# ./nginx -s reopen

或者

[[email protected] sbin]# kill -USR1 2030
由於nginx是通過inode指向日誌檔案的,inode和檔名無關,所以即使把日誌檔案重新命名,nginx還是將日誌檔案寫入原檔案,只有用上面的命令重新開啟日誌檔案才能將日誌寫入新的日誌檔案。
8、nginx的平滑升級

如果你需要升級或者新增、刪除伺服器模組時,可以通過nginx的平滑升級,在不停止服務的情況下升級nginx。

(1)用新的nginx可執行程式替換舊的可執行程式,即下載新的nginx,重新編譯到舊版本的安裝路徑中(重新編譯之前可以備份舊的可執行檔案)

(2)給nginx主程序號傳送USR2訊號

[[email protected] sbin]# kill -USR2 9944
執行命令前的程序:
[[email protected] sbin]# ps -ef |grep nginx
root       9944      1  0 13:22 ?        00:00:00 nginx: master process ./nginx
nobody     9965   9944  0 13:29 ?        00:00:00 nginx: worker process
root      10010   9917  0 13:42 pts/1    00:00:00 grep nginx
執行命令後的程序:
[[email protected] sbin]# ps -ef |grep nginx
root       9944      1  0 13:22 ?        00:00:00 nginx: master process ./nginx
nobody     9965   9944  0 13:29 ?        00:00:00 nginx: worker process
root      10012   9944  0 13:43 ?        00:00:00 nginx: master process ./nginx
nobody    10013  10012  0 13:43 ?        00:00:00 nginx: worker process
root      10015   9917  0 13:43 pts/1    00:00:00 grep nginx
給nginx傳送USR2訊號後,nginx會將logs/nginx.pid檔案重新命名為nginx.pid.oldbin,然後用新的可執行檔案啟動一個新的nginx主程序和對應的工作程序,並新建一個新的nginx.pid儲存新的主程序號
[[email protected] logs]# pwd
/usr/local/nginx/logs
[[email protected] logs]# ll
總用量 16
-rw-r--r--. 1 nobody root 596 10月  8 13:02 access.log
-rw-r--r--. 1 nobody root 881 10月  8 13:43 error.log
-rw-r--r--. 1 root   root   6 10月  8 13:43 nginx.pid
-rw-r--r--. 1 root   root   5 10月  8 13:22 nginx.pid.oldbin
[[email protected] logs]# cat nginx.pid
10012
[[email protected] logs]# cat nginx.pid.oldbin 
9944

這時,nginx的新的例項和舊的例項同時工作,共同處理請求連線。接下來要關閉舊的例項程序。

(3)給舊的主程序傳送WINCH訊號,kill -WINCH 舊的主程序號

[[email protected] sbin]# ps -ef |grep nginx
root       9944      1  0 13:22 ?        00:00:00 nginx: master process ./nginx
nobody     9965   9944  0 13:29 ?        00:00:00 nginx: worker process
root      10012   9944  0 13:43 ?        00:00:00 nginx: master process ./nginx
nobody    10013  10012  0 13:43 ?        00:00:00 nginx: worker process
root      10092   9917  0 14:05 pts/1    00:00:00 grep nginx
[[email protected] sbin]# kill -WINCH 9944
[[email protected] sbin]# 
[[email protected] sbin]# 
[[email protected] sbin]# 
[[email protected] sbin]# ps -ef |grep nginx
root       9944      1  0 13:22 ?        00:00:00 nginx: master process ./nginx
root      10012   9944  0 13:43 ?        00:00:00 nginx: master process ./nginx
nobody    10013  10012  0 13:43 ?        00:00:00 nginx: worker process
root      10094   9917  0 14:06 pts/1    00:00:00 grep nginx
舊的主程序號收到WINCH訊號後,將舊程序號管理的舊的工作程序優雅的關閉。即一段時間後舊的工作程序全部關閉,只有新的工作程序在處理請求連線。這時,依然可以恢復到舊的程序服務,因為舊的程序的監聽socket還未停止。

(4)給舊的主程序傳送QUIT訊號,使其關閉。

[[email protected] sbin]# kill -QUIT 9944
[[email protected] sbin]# ps -ef |grep nginx
root      10012      1  0 13:43 ?        00:00:00 nginx: master process ./nginx
nobody    10013  10012  0 13:43 ?        00:00:00 nginx: worker process
root      10118   9917  0 14:16 pts/1    00:00:00 grep nginx
給舊的主程序傳送QUIT訊號後,舊的主程序退出,並移除logs/nginx.pid.oldbin檔案,nginx的升級完成。

中途停止升級,回滾到舊的nginx

在步驟(3)時,如果想回到舊的nginx不再升級

(1)給舊的主程序號傳送HUP命令,此時nginx不重新讀取配置檔案的情況下重新啟動舊主程序的工作程序。

[[email protected] sbin]# kill -HUP 9944

(2)優雅的關閉新的主程序

[[email protected] sbin]# kill -QUIT 10012

注:如果由於某種原因,無法關閉新主程序的工作程序,直接給程序號傳送KILL訊號




nginx的程序分為主程序和工作程序,關於nginx的訊號,主程序支援以下訊號:
TERM,INT快速關閉
QUIT優雅的關閉

KILL關閉一個頑固程序
HUP改變配置,使用新配置開啟新的工作程序,優雅的關閉舊的程序
USR1重新開啟日誌檔案
USR2平滑升級nginx
WINCH優雅的關閉工作程序

單個工作程序也可以通過訊號控制,但它不是必須的。單個工作程序支援的訊號有:
TERM,INT快速關閉
QUIT優雅的關閉
USR1重新開啟日誌檔案
WINCH異常終止除錯(需要啟動debug_points)