nginx热升级实现
热升级是什么?nginx在不停止服务时候,执行新的可执行文件生成进程,接收client请求
nginx热升级流程
(1)将旧Nginx文件换成新Nginx文件(注意备份)
新编译的nginx所指定配置选项,比如配置目录,log目录必须和老nginx一样
cp -f nginx nginx.old
(2)向master进程发送USR2信号
[1]master进程修改pid文件名,加后缀.oldbin
[2]master进程用新Nginx文件启动新master进程,新的master进程是老master的子进程
(中间过程,新老nginx进程并存,同时处理请求)
(3)向老master进程发送WINCH信号,关闭老worker
(注意,旧master进程并不会关闭它的listen socket;因为如果出问题后,需要回滚,master进程需要重新启动它的worker进程。老的master进程保存下来方便会滚)
(4)[1]回滚:向老master发送HUP,向新master发送QUIT
[2]向老master进程发送SIGQUIT信号,要求它优雅的停止 (老的master进程退出,子进程ngx_processes.detached为1的进程为孤儿进程,变为父进程)
master进程收到WINCH信号后,会给各个worker进程发送QUIT信号,让其优雅退出;master进程并不再处理新的连接。
worker graceful shutdown流程(优雅关闭),关闭listen socket,不再处理新的连接;待已有连接处理完后,清理连接,退出进程。
master接收QUIT信号的代码逻
// master进程在收到QUIT信号的处理
void ngx_signal_handler(int signo)
{switch (ngx_process) { case NGX_PROCESS_MASTER: case NGX_PROCESS_SINGLE: switch (signo) { //quit信号 case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): ngx_quit = 1; action = ", shutting down"; break;// 子进程退出,父进程收到SIGCHLD型号case SIGCHLD: ngx_reap = 1; break; }}
}
void
ngx_master_process_cycle(ngx_cycle_t *cycle)
{// 检测到这个变量的值,判断是否重启子进程。。。if (ngx_reap) {ngx_reap = 0;live = ngx_reap_children(cycle);}// live为1表示有子进程在运行,为0代表,所有子进程都退出了// 并且此时有退出信号,那么master进程直接exit退出了。if (!live && (ngx_terminate ||ngx_quit)) {ngx_master_process_exit(cycle);}…// 正式处理QUIT信号if (ngx_quit) {//通知worker进程,处理完自己的事务之后自动退出。ngx_signal_worker_processes(cycle,ngx_signal_value(NGX_SHUTDOWN_SIGNAL));// 之后的处理就是关闭listenfd,不在监听连接。ngx_close_socket}
}
nginx热升级 QA
1、如何防止多次可执行文件触发热更新?
若老的nginx还在,nginx无法进行热更新二进制文件
相关代码
ngx_signal_handler
-->
case ngx_signal_value(NGX_CHANGEBIN_SIGNAL):if (ngx_getppid() == ngx_parent || ngx_new_binary > 0) {/** Ignore the signal in the new binary if its parent is* not changed, i.e. the old binary's process is still* running. Or ignore the signal in the old binary's* process if the new binary's process is already running.*/action = ", ignoring";ignore = 1;break;}ngx_change_binary = 1;action = ", changing binary";break;
2、nginx升级过程中,发现新的可执行文件出现问题该如何回滚?
- a、向旧master进程发送HUP信号。旧进程将启动新的worker进程,而且不会重新读取配置。之后,通过向新的主master进程发送QUIT信号,可以优雅地关闭新的master和worker进程。
void ngx_master_process_cycle(ngx_cycle_t *cycle) {//收到需要reconfig的信号 if (ngx_reconfigure) { ngx_reconfigure = 0; //判断是否热代码替换后的新的代码还在运行中(也就是还没退出当前的master)。如果还在运行中,则 不需要重新初始化config//ngx_new_binary表示程序本身需要升级,但不需要重新初始化nginx配置,直接调用ngx_start_wroke r_processif (ngx_new_binary) { ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_RESPAWN); ngx_start_cache_manager_processes(cycle, 0); ngx_noaccepting = 0; continue; }ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); //重新初始化config,并重新启动新的worker cycle = ngx_init_cycle(cycle); if (cycle == NULL) { cycle = (ngx_cycle_t *) ngx_cycle; continue; } ngx_cycle = cycle; ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); ngx_start_worker_processes(cycle, ccf->worker_processes, NGX_PROCESS_JUST_RESPAWN); ngx_start_cache_manager_processes(cycle, 1); live = 1; ngx_signal_worker_processes(cycle, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));} }
参考:https://blog.csdn.net/qq_15437667/article/details/83513457
nginx热升级实现相关推荐
- nginx的安装部署,热升级与回退,日志切割以及gzip(文字压缩)
1.安装部署nginx (1)安装 tar zxf nginx-1.14.0.tar.gz vim auto/cc/gcc #CFLAGS="$CFLAGS -g"##注销日志的d ...
- 4. Nginx 热部署
文章目录 4. Nginx 热部署 4.1.检查当前所用的nginx版本 4.2 检查旧的二进制命令编译参数 4.3 备份当前 nginx 二进制命令 4.4 下载一个新版本 4.5 编译安装 4.6 ...
- nginx平滑升级与配置文件详解
nginx平滑升级与配置文件详解 文章目录 nginx平滑升级 nginx配置文件 nginx.conf配置详解 用于调试.定位问题的配置参数 正常运行必备的配置参数 优化性能的配置参数 网络连接相关 ...
- nginx平滑升级版本
nginx平滑升级版本 1:nginx平滑升级的概述: 随着网络并发访问量越来越高,nginx web服务器也越来越流行,nginx版本换代越来越频繁,1.15.2版本的nginx更新了许多新功能,生 ...
- OpenKruise :SidecarSet 助力 Mesh 容器热升级
作者| 赵明山(立衡) 前言 OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation ( CNCF ) ...
- nginx平滑升级make upgrade出错的解决办法
为nginx平滑升级在make upgrate那一步除了点小状况 [root@web01 nginx-1.0.5]# make upgrade /usr/local/nginx/sbin/nginx ...
- 阿里云首次在ASPLOS'19发布重磅论文:揭秘帮助ECS快速迭代的热升级技术
第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告. 论文主题为<Fast and Sc ...
- 横跨7个版本的OpenStack无感知热升级在360的落地与实践
01 背景 360公司的IaaS服务平台,是基于开源Openstack项目研发的,在发展的数年间已历经了多次版本的更新迭代.2015年,360团队基于Liberty版本自主研发了360公有云(奇云), ...
- Nginx之升级和构建后添加新的模块
一 平滑升级 当需要对正在运行的Nginx进行升级时,可以在不停止Nginx的情况下,使用新版本或者重编译的可执行程序替换旧版本的可执行程序,这里我们从nginx-1.10.1升级到nginx-1.1 ...
最新文章
- 百度宣布AI语音调用登顶中国第一,自研芯片+最新端到端模型颠覆传统语音识别算法...
- DL之Yolov3:基于深度学习Yolov3算法实现视频目标检测之对《我要打篮球》视频段进行实时目标检测
- 首发:李航老师的《统计学习方法》第二版的代码实现(Github标星过万!)
- 内核中断处理流程_处理中断
- 分区变为RAW的解决办法
- 求整数的位数及各位数字之和 (15 分)
- netty 支持多种通讯协议
- 用DELETE删除的文件怎么免费找回不用购买不用注册码
- java学习第一课----java中8种基本类型
- CentOS _ RHEL 防止Kernel升级
- QTableWidget动态添加QComboBox并获取表格单元的Widget类型
- 创业者必备知识SWOT分析模型+案例分析
- select下拉复选
- chrome打不开网页 转圈圈
- ping不通云服务器,ping不通云服务器是什么原因
- PaaS服务从heroku迁移到Fly.io小计
- SAP 安全证书的导入
- 架构之占位式插件化框架 --组件通信
- 2018 ACM ICPC Arabella Collegiate Programming Contest A
- SSH机试顺丰搬家预约信息查询参考