nginx 的热部署和其并发模型有着密不可分的关系,是因为 master 进程和worker进程的关系 当系统通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断 如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中 而是,先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死 然后使用新的配置创建新的 worker 所以可以做到在线更新版本,新版本和旧版本的进程可以同时存在,不影响客户的访问
(1)热部署成功(平滑更新) 在线更新nginx服务的版本并且更新成功,这个时候nginx的新版本和旧版本进程都可以同时工作,不影响客户的正常访问 (2)热部署失败(回滚) 在线更新nginx服务的版本并且更新失败,这个时候就直接回退到原来的nginx版本进程,保证客户可以正常访问
解压 注释,是Nginx比较小 编译 安装 启动Nginx并查看进程,发现有1个worker进程和一个salve进程 解压即将升级的版本 注释 同理,进行编译
虽然当前版本已经变成了1.15版本,这个时候表面上看起来是更新成了新版本 但还是旧版本的在工作,接收客户端请求的仍然是1.14版本的nginx,这就有了下面的平滑升级 kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求) kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)
ps -ef | grep nginx可以看到原来的2个进程 kill -USR2 原来master进程的pid ##不再让worker进程接收请求,当前请求处理完就让worker退出 ps -ef | grep nginx可以看到4个进程(新版本已经可以用了) kill -WINCH 原来master进程的pid 关闭原来进程的子进程,master不结束,防止更新失败 处理完关闭 ps -ef | grep nginx可以看到3个进程(新版本已经可以用了) /usr/local/nginx/sbin/nginx -V可以看到版本已经更新了kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求) kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)
3)向原来的nginx的master进程发送信号,不再接收新的请求,新的nginx程序开启worker进程,并且开始接收请求 kill -USR2 3607 ##这个时候ps -ef看到两个master进程和其对应的worker进程 kill -WINCH 3607 ##这个时候ps -ef看到老的worker进程结束,但master进程还在,不影响,是为了升级不成功时版本回退 4)执行/usr/local/nginx/sbin/nginx -v ##看到版本已经更新 /usr/local/nginx/sbin/nginx -V ##还可以看到编译的模块更新完毕后如果出现问题,我们立马停止更新的进程,回滚到原来版本的进程上面 这就是没有强制结束旧版本的master进程的原因,因为可以通过旧版本的master进程将旧版本的worker进程调用回来 加入我们刚才的更新失败,现在要回到原来的1.16版本
1)先还原nginx脚本 cd /usr/local/nginx/sbin cp -f nginx.old nginx 2)重新唤起旧版本的master进程,让其接收请求 kill -HUP 3607 #-HUP相当于reload 3)让新版本的master进程不接收请求,关闭worker进程 kill -WINCH 61464)再查看nginx版本,回退到旧版本
/usr/local/nginx/sbin/nginx -v ##查看nginx版本 /usr/local/nginx/sbin/nginx -V ##查看nginx版本及编译参数等 其实最后剩余的新版本的worker进程也可以强制结束了,因为已经更新失败 cd nginx-1.14.2/ ls cd objs/ cp -f nginx /usr/local/nginx/sbin/nginx ps -ef | grep nginx 因为已经更新失败,新版本产生的进程已经全部结束