web服務之nginx命令,訊號還有平滑升級與回滾
阿新 • • 發佈:2021-06-19
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`