热升级是什么?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热升级实现相关推荐

  1. nginx的安装部署,热升级与回退,日志切割以及gzip(文字压缩)

    1.安装部署nginx (1)安装 tar zxf nginx-1.14.0.tar.gz vim auto/cc/gcc #CFLAGS="$CFLAGS -g"##注销日志的d ...

  2. 4. Nginx 热部署

    文章目录 4. Nginx 热部署 4.1.检查当前所用的nginx版本 4.2 检查旧的二进制命令编译参数 4.3 备份当前 nginx 二进制命令 4.4 下载一个新版本 4.5 编译安装 4.6 ...

  3. nginx平滑升级与配置文件详解

    nginx平滑升级与配置文件详解 文章目录 nginx平滑升级 nginx配置文件 nginx.conf配置详解 用于调试.定位问题的配置参数 正常运行必备的配置参数 优化性能的配置参数 网络连接相关 ...

  4. nginx平滑升级版本

    nginx平滑升级版本 1:nginx平滑升级的概述: 随着网络并发访问量越来越高,nginx web服务器也越来越流行,nginx版本换代越来越频繁,1.15.2版本的nginx更新了许多新功能,生 ...

  5. OpenKruise :SidecarSet 助力 Mesh 容器热升级

    作者| 赵明山(立衡) ​ 前言 ​ OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation ( CNCF ) ...

  6. nginx平滑升级make upgrade出错的解决办法

    为nginx平滑升级在make upgrate那一步除了点小状况 [root@web01 nginx-1.0.5]# make upgrade /usr/local/nginx/sbin/nginx ...

  7. 阿里云首次在ASPLOS'19发布重磅论文:揭秘帮助ECS快速迭代的热升级技术

    第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告. 论文主题为<Fast and Sc ...

  8. 横跨7个版本的OpenStack无感知热升级在360的落地与实践

    01 背景 360公司的IaaS服务平台,是基于开源Openstack项目研发的,在发展的数年间已历经了多次版本的更新迭代.2015年,360团队基于Liberty版本自主研发了360公有云(奇云), ...

  9. Nginx之升级和构建后添加新的模块

    一 平滑升级 当需要对正在运行的Nginx进行升级时,可以在不停止Nginx的情况下,使用新版本或者重编译的可执行程序替换旧版本的可执行程序,这里我们从nginx-1.10.1升级到nginx-1.1 ...

最新文章

  1. 百度宣布AI语音调用登顶中国第一,自研芯片+最新端到端模型颠覆传统语音识别算法...
  2. DL之Yolov3:基于深度学习Yolov3算法实现视频目标检测之对《我要打篮球》视频段进行实时目标检测
  3. 首发:李航老师的《统计学习方法》第二版的代码实现(Github标星过万!)
  4. 内核中断处理流程_处理中断
  5. 分区变为RAW的解决办法
  6. 求整数的位数及各位数字之和 (15 分)
  7. netty 支持多种通讯协议
  8. 用DELETE删除的文件怎么免费找回不用购买不用注册码
  9. java学习第一课----java中8种基本类型
  10. CentOS _ RHEL 防止Kernel升级
  11. QTableWidget动态添加QComboBox并获取表格单元的Widget类型
  12. 创业者必备知识SWOT分析模型+案例分析
  13. select下拉复选
  14. chrome打不开网页 转圈圈
  15. ping不通云服务器,ping不通云服务器是什么原因
  16. PaaS服务从heroku迁移到Fly.io小计
  17. SAP 安全证书的导入
  18. 架构之占位式插件化框架 --组件通信
  19. 2018 ACM ICPC Arabella Collegiate Programming Contest A
  20. SSH机试顺丰搬家预约信息查询参考

热门文章

  1. 奇异值分解与低秩矩阵近似
  2. 赛门铁克发布第21期《互联网安全威胁报告》 揭示当前更为严峻的网络威胁现状...
  3. php访问url的四种方式
  4. DirectAdmin安装mod_encoding支持中文
  5. 取得textarea中行的三种写法
  6. 从世界杯看德国,再看国内
  7. NBUT 1116 Flandre's Passageway (LIS变形)
  8. DropDownList如何绑定DataTable,如何绑定DataSet
  9. 【C】malloc(0)问题
  10. 在线HTML标签清除工具