资讯专栏INFORMATION COLUMN

模拟nginx热部署

caige / 3002人阅读

摘要:热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。热部署的流程是备份旧的可执行文件新的可执行文件直接替换旧的此时旧的进程还在运行向进程发送热部署信号,新的进程启动,旧的不再就收请求。关闭旧的进程,完成热部署。

热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。

首先在本地模拟一个线上需要升级 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

相关文章

  • nginx学习一】基本原理初探

    摘要:关于过程中如何细节控制一致性,稳定性,信号控制,控制等等,敬请期待小拽的进一步探索处理流程和模块启动进程后,请求在内部是如何流转的,内部包括哪些模块处理过程请求到达后首先读取,中初始时间便从此开始。 由于性能问题,需要将 apache + php5.2 升级到 nginx + php7,对于nginx的性能和热加载早有耳闻,why nginx so diao。小拽进行了初探,有任何疑问...

    Simon 评论0 收藏0
  • 从PHP迁移至Golang - 基础篇

    摘要:但是,随着微服务架构的兴起以及容器时代的到来,这种情况又再次加剧。最重要的是,在微服务与容器领域有很好的基础,后期系统可完美实现微服务化与容器化。 1、Why Not PHP 使用PHP构建的WEB程序,随着业务发展到一定体量之后,都不得不面临以下一些问题: 业务功能不断扩张,如何避免某单一业务功能故障影响整体,维持系统健壮性 业务逻辑复杂度不断上升,如何解耦与模块化,降低系统复杂性...

    Kerr1Gan 评论0 收藏0
  • 马蜂窝容器化平台前端赋能实践

    摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...

    wall2flower 评论0 收藏0
  • 马蜂窝容器化平台前端赋能实践

    摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...

    余学文 评论0 收藏0
  • 马蜂窝容器化平台前端赋能实践

    摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...

    desdik 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<