nginx 命令和訊號及平滑升級

乐维_lwops發表於2024-11-29

nginx 命令和訊號

二進位制編譯安裝nginx加入systemctl管理服務
cd /usr/lib/systemd/system vi nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
引數說明:
[Unit]:服務的說明
Description:描述服務
After:描述服務類別
[Service]服務執行引數的設定
Type=forking是後臺執行的形式 ExecStart為服務的具體執行命令 ExecReload為重啟命令
ExecStop為停止命令
PrivateTmp=True表示給服務分配獨立的臨時空間
[Install]執行級別下服務安裝的相關設定,可設定為多使用者,即系統執行級別為3

nginx命令

nginx 命令支援向其傳送訊號,實現不同功能 nginx 格式
nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
選項說明
幫助: -? -h
使用指定的配置檔案: -c 指定配置指令:-g
指定執行目錄:-p
測試配置檔案是否有語法錯誤:-t -T
列印nginx的版本資訊、編譯資訊等:-v -V
傳送訊號: -s 示例: nginx -s reload
訊號說明:
1  立刻停止服務:stop,相當於訊號SIGTERM,SIGINT

2 優雅的停止服務:quit,相當於訊號SIGQUIT
3 平滑重啟,重新載入配置檔案: reload,相當於訊號SIGHUP
4 重新開始記錄日誌檔案:reopen,相當於訊號SIGUSR1,在切割日誌時用途較大
5 平滑升級可執行程式:傳送訊號SIGUSR2,在升級版本時使用
6 優雅的停止工作程序:傳送訊號SIGWINCH,在升級版本時使用
例:更換日誌檔案
[root@server3 ~]# ls /usr/local/nginx/logs/ access.log  error.log  nginx.pid
[root@server3 ~]# cd /usr/local/nginx/logs/ [root@server3 logs]# ls
access.log error.log nginx.pid
[root@server3 logs]# mv access.log access.log-20220722 [root@server3 logs]# ls
access.log-20220722 error.log nginx.pid [root@server3 logs]# touch access.log
[root@server3 logs]# ls
access.log access.log-20220722 error.log nginx.pid [root@server3 logs]# chown nginx.nginx access.log
[root@server3 logs]# tail -f access.log
##訪問,觀察日誌,沒有記錄下來,但是檢視剛才改名的日誌檔案 [root@zhong logs]# tail access.log-20220722
##發現訪問的時候, 日誌依然記錄到舊的檔案中去
[root@zhong logs]# nginx -s reopen ##等價於下面命令
[root@zhong logs]# kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
例:優雅關閉
[root@server3 ~]# cd /usr/local/nginx/html/ [root@server3 html]# ls
50x.html  index.html
[root@server3 html]# dd if=/dev/zero of=a.img bs=2M count=1024
1024+0 records in  1024+0 records out
2147483648 bytes (2.1 GB) copied, 6.37415 s, 337 MB/s
##客戶端下載
[root@client ~]# wget http://192.168.26.203/a.img
 --2021-10-26 23:17:07--  http://192.168.26.201/a.img
Connecting to 192.168.26.201:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2147483648 (2.0G) [application/octet-stream]
Saving to: ‘a.img ’ 19
a.img                      100%[=======================================>] 2.00G   243MB/s    in 14s

2021-10-26 23:17:21 (147 MB/s) - ‘a.img ’ saved [2147483648/2147483648]
[root@client ~]#
##伺服器檢視,發現在沒有下載完畢的時候程序依然存在,客戶端下載完畢後,伺服器端程序也退出了
[root@zhong html]# nginx -s quit
[root@zhong html]# ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 52 192.168.26.201:22 192.168.26.1:65469 1 ESTAB 0 2606400 192.168.26.201:80 192.168.26.11:38804 [root@zhong html]# ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 52 192.168.26.201:22 192.168.26.1:65469 ESTAB 0 2801880 192.168.26.201:80 192.168.26.11:38804 [root@zhong html]# ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 52 192.168.26.201:22 192.168.26.1:65469

reload 流程

利用 reload 可以實現平滑修改配置並生效:
. 向master程序傳送HUP訊號(reload命令) master程序校驗配置語法是否正確
master程序開啟新的監聽埠
. master程序用新配置啟動新的worker子程序
. master程序向老worker子程序傳送QUIT訊號,老的worker對已建立連線繼續處理,處理完才會優 雅退出.未關閉的worker舊程序不會處理新來的請求
. 老worker程序關閉監聽控制代碼,處理完當前連線後結束程序

平滑升級和回滾

有時候我們需要對Nginx版本進行升級以滿足對其功能的需求,例如新增新模組,需要新功能,而此時 Nginx又在跑著業務無法停掉,這時我們就可能選擇平滑升級

平滑升級流程

將舊Nginx二進位制檔案換成新Nginx程式檔案(注意先備份) 向master程序傳送USR2訊號 . master程序修改pid檔名加上字尾.oldbin,成為nginx.pid.oldbin
master程序用新Nginx檔案啟動新master程序成為舊master的子程序,系統中將有新舊兩個Nginx . 主程序共同提供Web服務,當前新的請求仍然由舊Nginx的worker程序進行處理,將新生成的master . 程序的PID存放至新生成的pid檔案nginx.pid
. 向舊的Nginx服務程序傳送WINCH訊號,使舊的Nginx worker程序平滑停止
. 向舊master程序傳送QUIT訊號,關閉老master,並刪除Nginx.pid.oldbin檔案 如果發現升級有問題,可以回滾∶向老master傳送HUP,向新master傳送QUIT

平滑升級和回滾案例

[root@zhong ~]# vim /usr/local/nginx/conf/nginx.conf worker_processes  2;
[root@server3 ~]# /usr/local/nginx/sbin/nginx -s reload [root@server3 ~]# ps -axuf | grep nginx
root       5717  0.0  0.0 112812   976 pts/0    S+   10:59   0:00
\_ grep --color=auto nginx
root       5553  0.0  0.1  77424  2176 ?        Ss   10:48   0:00 nginx:
master process /usr/local/nginx/sbin/nginx
nginx      5714  0.0  0.1  77860  2264 ?        S    10:59   0:00  \_
nginx: worker process
nginx      5715  0.0  0.1  77860  2264 ?        S    10:59   0:00  \_
nginx: worker process
[root@server3 ~]#
#下載最新穩定版 [root@zhong ~]# wget http://nginx.org/download/nginx-1.22.0.tar.gz 14 [root@zhong ~]# tar xvf nginx-1.22.0.tar.gz [root@zhong ~]# cd nginx-1.22.0
#檢視當前使用的版本及編譯選項。結果如下: [root@centos7 ~]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.20.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --lock- path=/usr/local/nginx/nginx.lock --user=nginx --group=nginx --with- http_ssl_module --with-http_flv_module --with-http_stub_status_module -- with-http_gzip_static_module --http-client-body-temp- path=/usr/local/nginx/client/ --http-proxy-temp- path=/usr/local/nginx/proxy/ --http-fastcgi-temp- path=/usr/local/nginx/fcgi/ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi - -http-scgi-temp-path=/usr/local/nginx/scgi --with-pcre --with-file-aio -- with-http_image_filter_module #configure arguments後面是以前編譯時的引數。現在編譯使用一樣的引數
[root@centos7 ~]# tar xf nginx-1.22.0.tar.gz
[root@centos7 ~]# ls anaconda-ks.cfg nginx-1.20.2.tar.gz nginx-1.22.0 nginx-1.22.0.tar.gz 31 [root@centos7 ~]# cd nginx-1.22.0/ [root@centos7 nginx-1.22.0]# ./configure --prefix=/usr/local/nginx --lock- path=/usr/local/nginx/nginx.lock --user=nginx --group=nginx --with- http_ssl_module --with-http_flv_module --with-http_stub_status_module -- with-http_gzip_static_module --http-client-body-temp- path=/usr/local/nginx/client/ --http-proxy-temp- path=/usr/local/nginx/proxy/ --http-fastcgi-temp- path=/usr/local/nginx/fcgi/ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi - -http-scgi-temp-path=/usr/local/nginx/scgi --with-pcre --with-file-aio -- with-http_image_filter_module #只要make無需要make install
[root@server3 nginx-1.22.0]# make 38 [root@server3 nginx-1.22.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README s rc [root@centos7 nginx-1.22.0]# objs/nginx -v nginx version: nginx/1.22.0 #檢視兩個版本
[root@centos7 nginx-1.22.0]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 6274992 Jul 22 11:49 objs/nginx -rwxr-xr-x 1 root root 6262240 Jul 22 11:44 /usr/local/nginx/sbin/nginx #把之前的舊版的nginx命令備份
[root@server3 nginx-1.22.0]# mkdir /usr/local/nginx/sbin/nginx.old -p [root@server3 nginx-1.22.0]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old/
#把新版本的nginx命令複製過去 [root@server3 nginx-1.22.0]# cp -r objs/nginx /usr/local/nginx/sbin/
#檢測一下有沒有問題 [root@server3 nginx-1.22.0]# /usr/local/nginx/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 #USR2 平滑升級可執行程式 ,將儲存有舊版本主程序ID的檔案重新命名為nginx.pid.oldbin,跟著啟 動新的nginx
[root@centos7 logs]# cp nginx.pid nginx.pid.old 68 #此時兩個master的程序都在執行 ,只是舊的master不在監聽 ,由新的master監聽80 71
#此時Nginx開啟一個新的master程序,這個master程序會生成新的worker程序,這就是升級後的 Nginx程序,此時老的程序不會自動退出,但是當接收到新的請求不作處理而是交給新的程序處理。 [root@server3 logs]# ps -axuf | grep nginx root 8576 0.0 0.0 112812 976 pts/0 S+ 11:06 0:00 \_ grep --color=auto nginx root 5553 0.0 0.1 77424 2176 ? Ss 10:48 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 5714 0.0 0.1 77860 2264 ? S 10:59 0:00 \_ nginx: worker process nginx 5715 0.0 0.1 77860 2264 ? S 10:59 0:00 \_ nginx: worker process [root@centos7 logs]# cat nginx.pid.old 81 6985
[root@server3 logs]# kill -USR2 6985
[root@centos7 logs]# ps -axuf | grep nginx root 9881 0.0 0.0 112812 980 pts/1 S+ 11:53 0:00 \_ grep --color=auto nginx root 6985 0.0 0.1 77424 2184 ? Ss 11:44 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 7061 0.0 0.1 77860 2264 ? S 11:45 0:00 \_ nginx: worker process nginx 7062 0.0 0.1 77860 2504 ? S 11:45 0:00 \_ nginx: worker process
root 9877 0.0 0.1 77292 3968 ? S 11:53 0:00 \_ nginx: master process /usr/local/nginx/sbin/nginx nginx 9878 0.0 0.1 77748 2144 ? S 11:53 0:00 \_ nginx: worker process nginx 9879 0.0 0.1 77748 2144 ? S 11:53 0:00 \_ nginx: worker process [root@centos7 logs]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 6985 root 6u IPv4 33185 0t0 TCP *:http (LISTEN) nginx 7061 nginx 6u IPv4 33185 0t0 TCP *:http (LISTEN) nginx 7062 nginx 6u IPv4 33185 0t0 TCP *:http (LISTEN) nginx 9877 root 6u IPv4 33185 0t0 TCP *:http (LISTEN) nginx 9878 nginx 6u IPv4 33185 0t0 TCP *:http (LISTEN) nginx 9879 nginx 6u IPv4 33185 0t0 TCP *:http (LISTEN) 102 #先關閉舊nginx的worker程序 ,而不關閉nginx主程序方便回滾
#向原Nginx主程序傳送WINCH訊號,它會逐步關閉旗下的工作程序(主程序不退出),這時所有請求 都會由新版Nginx處理
[root@centos7 logs]# cat nginx.pid.old 6985 [root@zhong nginx-1.20.1]# kill -WINCH 6985
[root@centos7 logs]# kill -WINCH 6985 [root@centos7 logs]# ps -axuf | grep nginx root 37317 0.0 0.0 112812 980 pts/1 S+ 11:56 0:00 \_ grep --color=auto nginx root 6985 0.0 0.1 77424 2184 ? Ss 11:44 0:00 nginx: master process /usr/local/nginx/sbin/nginx root 9877 0.0 0.1 77292 3968 ? S 11:53 0:00 \_ nginx: master process /usr/local/nginx/sbin/nginx nginx 9878 0.0 0.1 77748 2144 ? S 11:53 0:00 \_ nginx: worker process nginx 9879 0.0 0.1 77748 2144 ? S 11:53 0:00 \_ nginx: worker process
[root@zhong nginx-1.20.1]# [root@centos7 logs]# pstree -p | grep nginx |-nginx(6985)---nginx(9877)-+-nginx(9878) | `-nginx(9879) [root@centos7 logs]# ps aux | grep nginx root 6985 0.0 0.1 77424 2184 ? Ss 11:44 0:00 nginx: master process /usr/local/nginx/sbin/nginx root 9877 0.0 0.1 77292 3968 ? S 11:53 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 9878 0.0 0.1 77748 2144 ? S 11:53 0:00 nginx: worker process nginx 9879 0.0 0.1 77748 2392 ? S 11:53 0:00 nginx: worker process
root 37332 0.0 0.0 112812 976 pts/1 S+ 11:59 0:00 grep -- color=auto nginx
#經過一段時間測試,新版本服務沒問題,最後退出老的master [root@centos7 logs]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.old`
#檢視版本是不是已經是新版了 [root@centos7 logs]# /usr/local/nginx/sbin/nginx -v nginx version: nginx/1.22.0 [root@centos7 logs]# curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.22.0 Date: Fri, 22 Jul 2022 04:01:55 GMT Content-Type: text/html Content-Length: 5 Last-Modified: Fri, 22 Jul 2022 03:45:06 GMT Connection: keep-alive ETag: "62da1d42-5"
Accept-Ranges: bytes
##nginx平滑升級後回滾 ##需要在原主程式未退出前執行回滾操作 ##如果升級的版本發現問題需要回滾 ,可以重新拉起舊版本的worker
#如果升級的版本發現問題需要回滾 ,可以重新拉起舊版本的worker,如果新版本可用,則不需要 [root@zhong nginx-1.20.1]# kill -HUP `cat /usr/local/nginx/logs/nginx.pid.old` [root@zhong nginx-1.20.1]# pstree -p |grep nginx |-nginx(8814)-+-nginx(12014)-+-nginx(12015) | | `-nginx(12016) | |-nginx(12090) | `-nginx(12091)
#最後關閉新版的master [root@zhong nginx-1.20.1]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`

相關文章