nginx-master信号传递
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信号