1. 程式人生 > 其它 >web服務之nginx命令,訊號還有平滑升級與回滾

web服務之nginx命令,訊號還有平滑升級與回滾

nginx 命令和訊號

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

訊號說明:

立刻停止服務:stop,相當於訊號SIGTERM,SIGINT
優雅的停止服務:quit,相當於訊號SIGQUIT
平滑重啟,重新載入配置檔案: reload,相當於訊號SIGHUP
重新開始記錄日誌檔案:reopen,相當於訊號SIGUSR1,在切割日誌時用途較大
平滑升級可執行程式:傳送訊號SIGUSR2,在升級版本時使用
優雅的停止工作程序:傳送訊號SIGWINCH,在升級版本時使用

範例: 檢視nginx幫助

[root@centos8 ~]# nginx -h
nginx version: nginx/1.16.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /usr/share/nginx/)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file

quit 實現worker程序優雅關閉

關閉監聽控制代碼
關閉空閒連線
在迴圈中等待全部連線關閉
退出nginx所有程序

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

平滑升級和回滾案例

#改pid存放路徑
[root@sz-kx-centos8 ~/nginx-1.20.1]# vim /apps/nginx/conf/nginx.conf
pid        /apps/nginx/run/nginx.pid;

#建立並授權
[root@sz-kx-centos8 ~/nginx-1.20.1]# mkdir -p /apps/nginx/run
[root@sz-kx-centos8 ~/nginx-1.20.1]# chown -R nginx.nginx /apps/nginx/run

重啟服務
[root@sz-kx-centos8 ~/nginx-1.20.1]# systemctl restart nginx

[root@sz-kx-centos8 ~]# wget http://nginx.org/download/nginx-1.20.1.tar.gz

[root@sz-kx-centos8 ~]# tar xf nginx-1.20.1.tar.gz 
[root@sz-kx-centos8 ~]# cd nginx-1.20.1/
[root@sz-kx-centos8 ~/nginx-1.20.1]# nginx -V
nginx version: nginx/1.18.0
built by gcc 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC) 
built with OpenSSL 1.1.1g FIPS  21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

[root@sz-kx-centos8 ~/nginx-1.20.1]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

#只要make無需要make install
[root@sz-kx-centos8 ~/nginx-1.20.1]# make

[root@sz-kx-centos8 ~/nginx-1.20.1]# objs/nginx -v
nginx version: nginx/1.20.1

#檢視兩個版本
[root@sz-kx-centos8 ~/nginx-1.20.1]# ll objs/nginx /apps/nginx/sbin/nginx 
-rwxr-xr-x 1 root root 7595024 Jun  9 22:10 /apps/nginx/sbin/nginx
-rwxr-xr-x 1 root root 7727184 Jun 10 14:58 objs/nginx

#把之前的舊版的nginx命令備份
[root@sz-kx-centos8 ~/nginx-1.20.1]# mv /apps/nginx/sbin/nginx{,.bak}

#把新版本的nginx命令複製過去
[root@sz-kx-centos8 ~/nginx-1.20.1]# cp objs/nginx /apps/nginx/sbin/

#檢測一下有沒有問題
[root@sz-kx-centos8 ~/nginx-1.20.1]# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful

#USR2 平滑升級可執行程式,將儲存有舊版本主程序PID的檔案重新命名為nginx.pid.oldbin,並啟動新的
nginx
#此時兩個master的程序都在執行,只是舊的master不在監聽,由新的master監聽80
#此時Nginx開啟一個新的master程序,這個master程序會生成新的worker程序,這就是升級後的Nginx進
程,此時老的程序不會自動退出,但是當接收到新的請求不作處理而是交給新的程序處理。

[root@sz-kx-centos8 ~]# cat /apps/nginx/run/nginx.pid 
9240
[root@sz-kx-centos8 ~]# ps auxf | grep nginx
root       9309  0.0  0.0  12108  1064 pts/0    S+   15:30   0:00              \_ grep --color=auto nginx
root       9240  0.0  0.2  41192  3836 ?        Ss   15:28   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx      9278  0.0  0.2  74272  4488 ?        S    15:29   0:00  \_ nginx: worker process

[root@sz-kx-centos8 ~]# kill -USR2 `cat /apps/nginx/run/nginx.pid`

[root@sz-kx-centos8 ~]# ps auxf | grep nginx
root       9333  0.0  0.0  12108  1080 pts/0    S+   15:31   0:00              \_ grep --color=auto nginx
root       9240  0.0  0.2  41192  3836 ?        Ss   15:28   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx      9278  0.0  0.2  74272  4488 ?        S    15:29   0:00  \_ nginx: worker process
root       9330  0.0  0.3  41060  5924 ?        S    15:31   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx      9331  0.0  0.2  74144  4436 ?        S    15:31   0:00      \_ nginx: worker process

#先關閉舊nginx的worker程序,而不關閉nginx主程序方便回滾
#向原Nginx主程序傳送WINCH訊號,它會逐步關閉旗下的工作程序(主程序不退出),這時所有請求都會由新版Nginx處理

[root@sz-kx-centos8 ~]# ll /apps/nginx/run/nginx.pid
-rw-r--r-- 1 root root 5 Jun 10 15:31 /apps/nginx/run/nginx.pid
[root@sz-kx-centos8 ~]# kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin`

#如果舊版worker程序有使用者的請求,會一直等待處理完後才會關閉
[root@sz-kx-centos8 ~]# ps auxf | grep nginx
root      13947  0.0  0.0  12108   980 pts/0    S+   16:10   0:00              \_ grep --color=auto nginx
root       9240  0.0  0.2  41192  3836 ?        Ss   15:28   0:00 nginx: master process /apps/nginx/sbin/nginx
root       9330  0.0  0.3  41060  5924 ?        S    15:31   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx      9331  0.0  0.2  74144  4436 ?        S    15:31   0:00      \_ nginx: worker process

#經過一段時間測試,新版本服務沒問題,最後退出老的master(慎重操作)
[root@sz-kx-centos8 ~]# kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin`
[root@sz-kx-centos8 ~]# ps auxf | grep nginx
root      13972  0.0  0.0  12108   976 pts/0    S+   16:11   0:00              \_ grep --color=auto nginx
root       9330  0.0  0.3  41060  5924 ?        S    15:31   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx      9331  0.0  0.2  74144  4436 ?        S    15:31   0:00  \_ nginx: worker process

#檢視版本是不是已經是新版了
[root@sz-kx-centos8 ~]# nginx -v
nginx version: nginx/1.20.1

##回滾(如果上面的已經操作 QUIT就沒有辦法回滾了)
#如果升級的版本發現問題需要回滾,可以重新拉起舊版本的worker
[root@centos8 nginx-1.20.1]# kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`

#最後關閉新版的master
[root@centos8 nginx-1.20.1]# kill -QUIT `cat /apps/nginx/run/nginx.pid`