摘要:热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。热部署的流程是备份旧的可执行文件新的可执行文件直接替换旧的此时旧的进程还在运行向进程发送热部署信号,新的进程启动,旧的不再就收请求。关闭旧的进程,完成热部署。
热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。
首先在本地模拟一个线上需要升级 Nginx 的环境,假设旧版本为 nginx-1.0.15,需要升级到 nginx-1.16.0。
配置旧版本# 下载 nginx-1.0.15 wget http://nginx.org/download/nginx-1.0.15.tar.gz # 解压压缩包 tar -zxf nginx-1.0.15.tar.gz # 进入解压后的目录 cd nginx-1.0.15 # 配置 nginx ./configure --prefix=/home/nginx # 编译安装 make && make install # 运行 nginx sudo /home/nginx/sbin/nginx
此时访问服务器地址应该可以看到 nginx 的欢迎页面了。
获得新版本二进制# 下载 nginx-1.16.0 wget http://nginx.org/download/nginx-1.16.0.tar.gz # 解压压缩包 tar -zxf nginx-1.16.0 # 进入解压后的目录 cd nginx-1.16.0/ # 配置 nginx ./configure --prefix=/home/nginx # 只编译不需要安装 make
在编译后的 objs 目录中,可以看到二进制文件 nginx。
热部署经过以上步骤,我们实现了一个正在运行的旧版本 nginx 和编译完成的新版本 nginx 二进制执行文件。
热部署的流程是:
备份旧的 nginx 可执行文件
新的 nginx 可执行文件直接替换旧的(此时旧的 nginx 进程还在运行)
向 nginx master 进程发送热部署信号,新的 nginx 进程启动,旧的 worker 不再就收请求。
关闭旧的 worker 进程,完成热部署。
# 备份 cp /home/nginx/sbin/nginx /home/nginx/sbin/nginx.old # 替换 cp -f objs/nginx /home/nginx/sbin/nginx # 查看 master pid ps -ef | grep nginx root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx nobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process # 发送热部署信号,这里 master pid 替换为自己查询到的 kill -USR2 23712 # 查看当前 nginx 进程情况,27522 就是新的 master 进程 ps -ef | grep nginx root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx nobody 23715 23712 0 21:21 ? 00:00:00 nginx: worker process root 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx nobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process # 关闭旧的 worker kill -WINCH 23712 # 再次查看进程,可以发现旧的worker进程关闭了 ps -ef | grep nginx root 23712 1 0 21:21 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx root 27522 23712 0 21:41 ? 00:00:00 nginx: master process /home/nginx/sbin/nginx nobody 27524 27522 0 21:41 ? 00:00:00 nginx: worker process
保留旧的 master 进程是为了在新的版本存在问题时,可以快速回退到原版本。如果发现问题要紧急回滚呢?
cp -f nginx.old nginx # 拉起旧版本的worker进程(-HUP 相当于 -s reload) kill -HUP old_master_pid # 让新版本的 worker 不再接受请求 kill -USR2 new_master_pid # 关闭新版本的 woker 进程 kill -WINCH new_master_pid
如果确认无误要退出老版本的 nginx,可以执行命令:
kill -QUIT old_master_pid
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/40454.html
摘要:关于过程中如何细节控制一致性,稳定性,信号控制,控制等等,敬请期待小拽的进一步探索处理流程和模块启动进程后,请求在内部是如何流转的,内部包括哪些模块处理过程请求到达后首先读取,中初始时间便从此开始。 由于性能问题,需要将 apache + php5.2 升级到 nginx + php7,对于nginx的性能和热加载早有耳闻,why nginx so diao。小拽进行了初探,有任何疑问...
摘要:但是,随着微服务架构的兴起以及容器时代的到来,这种情况又再次加剧。最重要的是,在微服务与容器领域有很好的基础,后期系统可完美实现微服务化与容器化。 1、Why Not PHP 使用PHP构建的WEB程序,随着业务发展到一定体量之后,都不得不面临以下一些问题: 业务功能不断扩张,如何避免某单一业务功能故障影响整体,维持系统健壮性 业务逻辑复杂度不断上升,如何解耦与模块化,降低系统复杂性...
摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...
摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...
摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...
阅读 3064·2021-11-22 09:34
阅读 558·2021-11-22 09:34
阅读 2410·2021-10-08 10:18
阅读 3335·2021-09-22 15:57
阅读 2562·2021-09-22 15:25
阅读 2356·2019-08-30 15:54
阅读 2045·2019-08-30 15:44
阅读 1779·2019-08-29 11:18