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]

ocalhost 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 監聽,如果失敗,它將回滾配置更改並繼續使用舊的配置,如果成功了,它開啟新的工作程序,並給舊的工作程序發訊息讓它們優雅的關閉,舊的工作程序接收到關閉訊號後,不再接收新的請求,如果已有請求正在處理,等當前請求處理完畢後關閉,如果沒有請求正在處理,則直接關閉。

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

[[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
由於ngnix是通過inode指向日誌檔案中,inode和檔名無關,所以即使把日誌檔案重新命名,nginx還是將日誌檔案寫入原檔案,只有用上面的命令重新開啟日誌檔案才能將日誌寫入新的日誌檔案。

8、nginx的平滑升級
如果你需要升級或者新增、刪除伺服器模組時,可以通過nginx的平滑升級,在不停止服務的情況下升級nginx。
(1)用新的nginx可執行程式替換舊的可執行程式,即下載新的nginx,重新編譯到舊版本的安裝路徑中(重新編譯之前可以備份舊的可執行檔案)
(2)給nginx主程序號傳送USR2訊號

8 ngnix的平滑升級
如果你需要升級或者新增,刪除服務模組時,可以通過ngnix的平滑升級,在不停止服務的情況下升級nginx。
(1)用新的nginx可執行程式替換舊的可執行程式,即下載新的nginx,重新編譯到舊版本的安裝路徑中(重新編譯之前可以備份舊的可執行檔案)
(2)給ngnix主程序號傳送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)