nginx-master信号传递

tp6 nginx热加载 nginx热部署命令_运维

1.master主进程是不处理请求的,而是分配请求发给worker进程,主进程负责重启,热加载,热部署等等
2.master是根据nginx.conf中的worker_process定义启动时创建的工作进程数
3.当worker运行后,master就处于一个等待的状态,等待用户的请求来临或系统信号
4.系统管理员可以发送kill指令或nginx -s 信号操控nginx

nginx信号集

nginx -s 对应的信号功能如下
参数  信号  含义
stop  TERM  强制关闭nginx服务
null   INT   强制关闭整个nginx服务
quit   QUIT  优雅关闭整个nginx服务
reopen  USR1 重新打开日志记录
		USR2 平滑升级到最新版的nginx
reload  HUB  重新读取配置文件,并优雅的退出旧的worker
		WHICH 所以子进程不再接受新连接,相当于给work进程发送QUIT指令

调用命令kill -signal PID

nginx热部署
  • nginx工作模式是master-worker(包工头----干活工人)

刚才所说的nginx支持reload重载,仅仅是nginx的master进程,在检查配置文件正确之后;正确则更新,错误则返回异常。正确情况下也不会更改已经建立的worker,只会等待worker处理完毕后,杀死旧的worker;然后从新的配置文件中,运行出新的worker(一旦更换了配置文件,reload master主进程,那么手底下的工人也就会换一批新的了)

  • nginx还提供了热部署功能,特点是:在不影响用户体验下,进行软件版本升级;也就是不主动杀死worker,也能够更换软件的二进制命令
1.检查当前所用的nginx版本
[root@localhost ~]# nginx -v
nginx version: nginx/1.20.0

2.备份旧的二进制命令
[root@localhost ~]# mv /opt/nginx/sbin/nginx /opt/nginx/sbin/nginx.120

3.检查旧的二进制命令编译参数
[root@localhost ~]# nginx.120 -V
nginx version: nginx/1.20.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=/opt/nginx --with-http_gzip_static_module --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-threads --with-file-aio

4.下载编译安装新版本的nginx
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xzf nginx-1.18.0.tar.gz
进行编译安装(新版本的nginx编译参数和旧的保存一致)
cd nginx-1.18.0
编译: ./configure --prefix=/opt/nginx --with-http_gzip_static_module --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-threads --with-file-aio
安装:make && make install

5.检查新版nginx信息,发现此时已经有两个版本的nginx命令了
[root@localhost nginx-1.18.0]# ls /opt/nginx/sbin/
nginx  nginx.120

6.再次检查当前系统nginx状态
通过pid ppid可以验证 worker process是由master process创建的
[root@localhost sbin]# ps -ef | grep nginx
root       1201      1  0 13:32 ?        00:00:00 nginx: master process nginx
nobody     1202   1201  0 13:32 ?        00:00:00 nginx: worker process
nobody     1203   1201  0 13:32 ?        00:00:00 nginx: worker process
root       3928   1177  0 13:50 pts/0    00:00:00 grep --color=auto nginx

7.此时发送一个USR2信号给旧的master process,作用是使得nginx旧的版本停止接受用户请求,并且切换成新的nginx版本
kill -USR2 `cat /opt/nginx/logs/nginx.pid`
当执行完毕上述命令,旧的master process,首先会重命名它的pid文件,添加上.oldbin后缀;
然后再启动一个新的master主进程,以及worker,使用的是新版本的nginx二进制文件
此时新的nginx就能够自动接受用户发来的请求,过度到新的nginx-worker进程上

8.此时再次查看nginx进程状态
[root@localhost ~]# ps -ef | grep nginx
root       4052      1  0 14:41 ?        00:00:00 nginx: master process /opt/nginx/sbin/nginx.120
root       4053   4052  0 14:41 ?        00:00:00 nginx: worker process
root       4054   4052  0 14:41 ?        00:00:00 nginx: worker process
root       4059   4052  0 14:43 ?        00:00:00 nginx: master process /opt/nginx/sbin/nginx.120
root       4060   4059  0 14:43 ?        00:00:00 nginx: worker process
root       4061   4059  0 14:43 ?        00:00:00 nginx: worker process

9.发送WINCH信号给旧的master进程,让旧的master进程优雅的退出
kill -WINCH `cat /opt/nginx/logs/nginx.pid.oldbin`

10.此时如果觉得nginx服务一切正常,就可以干掉旧的master主进程了
kill -9 `cat /opt/nginx/logs/nginx.pid.oldbin`

热部署的特点:在不重启或者关闭进程的情况下,新的应用自己替换旧的应用

更换nginx的二进制版本
热部署大致流程
1.备份旧的程序,二进制文件,备份nginx命令
2.编译安装新的二进制文件,覆盖旧的二进制文件(再装一个版本的nginx,且替换旧的nginx命令)
3.发送USR2信号给旧的master进程
4.发送WINCH信号给旧的master进程
5.发送QUIT信号给旧的master进程

热部署问题

如果出现发送kill -USR2信号后,未出现新的master进程
是因为:旧的nginx必须用绝对路径启动,然后再发送USR2信号