Nginx的命令信号与升级回滚

一.Nginx的命令信号

(1)nginx命令
nginx命令支持向其发送信号,实现不同功能。
nginx命令格式:nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
选项说明:
帮助:-? –h
使用指定的配置文件:-c
指定配置指令:-g
指定运行目录:-p
测试配置文件是否有语法错误:-t
打印nginx的版本信息,编译信息等:-v –V
发送信号:-s 示例:nginx –s reload
(2)信号说明
立刻停止服务:stop,相当于信号SIGTERM,SIGINT
优雅的停止服务:quit,相当于信号SIGQUIT
平滑重启,重新加载配置文件:reload,相当于信号SIGHUP
重新开始记录日志文件:reopen,相当于信号SIG USR1,在切割日志时用途较大。
平滑升级可执行程序:发送信号SIG USR2,在升级版本时使用
优雅的停止工作进程:发送信号SIG WINCH,在升级版本时使用
USR1 信号是重新打开日志文件
(3)示例

  1. 发送TERM/INT信号给master进程,会将Nginx服务立即关闭
    kill -TERM PID / kill -TERM cat /usr/local/nginx/logs/nginx.pid
    kill -INT PID / kill -INT cat /usr/local/nginx/logs/nginx.pid
  2. 发送QUIT信号给master进程,master进程会控制所有的work进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉
    kill -QUIT PID / kill -QUIT cat /usr/local/nginx/logs/nginx.pid
  3. 发送HUP信号给master进程,然后根据nginx的配置文件重新启动新的work进程 ,master进程会把控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,处理完后结束进程(-s reload)
    kill -HUP PID / kill -HUP cat /usr/local/nginx/logs/nginx.pid
  4. 发送USR1信号给master进程,告诉Nginx重新开启日志文件
    kill -USR1 PID / kill -USR1 cat /usr/local/nginx/logs/nginx.pid
  5. 发送USR2信号给master进程,告诉master进程要平滑升级,这个时候,会重新开启对应的master进程和work进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在 /usr/local/nginx/logs/nginx.pid 而之前的旧的master进程PID会被记录在 /usr/local/nginx/logs/nginx.pid.oldbin 文件中,接着再次发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭。
    kill -USR2 PID / kill -USR2 cat /usr/local/nginx/logs/nginx.pid
    kill -QUIT PID / kill -QUIT cat /usr/local/nginx/logs/nginx.pid.oldbin
  6. 发送WINCH信号给master进程,让master进程控制不让所有的work进程在接收新的请求了,请求处理完后关闭work进程。注意master进程不会被关闭掉
    kill -WINCH PID /kill -WINCHcat /usr/local/nginx/logs/nginx.pid

二.Nginx平滑升级和回滚

平滑升级流程
将旧nginx二进制文件换成新nginx程序文件(注意先备份)
向master进程发送USR2信号
master进程修改pid文件名加上后缀为.oldbin,成为nginx.pid.oldbin
Master 进程用新nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供web服务,当前新的请求仍然由旧的Nginx的worker进程进行处理,将新生成的master进程的PID放置于新生成的PID文件,
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
向旧的master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚,向老master发送HUP,向新master发送QUIT

三.平滑升级和回滚示例

下载最新稳定版
#wget http://nginx.org/download/nginx-1.20.1.tar.gz
#tar xvf nginx-1.20.1.tar.gz
#cd nginx-1.20.1
#查看当前使用的版本及编译选项。结果如下:
#/data/nginx/sbin/nginx -V
nginx version: nginx/1.18.0
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=/data/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
#开始编译新版本【prefix指定安装目录的时候,需与原先nginx的安装目录保持一致】
#./configure --prefix=/data/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
#make
[root@iZbp18ij71z8giz0ikiae4Z nginx-1.20.1]# ./objs/nginx -V
nginx version: nginx/1.20.1
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=/data/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
把之前的旧版的nginx命令备份
#mv /data/nginx/sbin/nginx /data/nginx/sbin/nginx.old
把新版本的nginx命令复制过去
[root@iZbp18ij71z8giz0ikiae4Z nginx-1.20.1]# cp ./objs/nginx /data/nginx/sbin/
检测一下有没有问题
#/data/nginx/sbin/nginx -t
nginx: the configuration file /data/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /data/nginx/conf/nginx.conf test is successful
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的
nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进
程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理
#kill -USR2 cat /data/nginx/logs/nginx.pid
#可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程
#ps auxf|grep nginx
root 21661 1 0 16:51 ? 00:00:00 nginx: master process /data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf
nginx 21662 21661 0 16:51 ? 00:00:00 nginx: worker process
root 27853 21661 0 17:20 ? 00:00:00 nginx: master process /data/nginx/sbin/nginx -c /data/nginx/conf/nginx.conf
nginx 27854 27853 0 17:20 ? 00:00:00 nginx: worker process
#先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚
#向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新
版Nginx处理
#kill -WINCH cat /data/nginx/logs/nginx.pid.oldbin
#如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭
#ps auxf|grep nginx
#经过一段时间测试,新版本服务没问题,最后退出老的master
#kill -QUIT cat /data/nginx/logs/nginx.pid.oldbin
#查看版本是不是已经是新版了
#nginx -v
nginx version: nginx/1.20.1
回滚【回滚操作必须要在未发出QUIT之前操作】
#如果升级的版本发现问题需要回滚,可以重新拉起旧版本的worker
#kill -HUP cat /apps/nginx/run/nginx.pid.oldbin
#最后关闭新版的master
#kill -QUIT `cat /apps/nginx/run/nginx.pid

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值