目录

一、平滑重启

二、信号处理

一、平滑重启

ngx_add_inherited_sockets主要用于继承Socket文件句柄。

Nginx有平滑重启的功能,通过平滑重启,可以让用户无感知并且不中断。

#平滑重启
sudo kill -HUP `cat /usr/local/nginx-1.4.7/nginx.pid`  

Nginx支持热切换,为了保证切换之后的套接字不丢失,就需要Nginx继承原先的socket(用户正在连接Nginx的时候的文件句柄)。

ngx_add_inherited_sockets正是做了这个工作

套接字会放在“NGINX”的全局环境变量中。

继承后的socket文件句柄放到ngx_cycle.listening数组中。

    /* 初始化socket端口监听,例如打开80端口监听;* Nginx支持热切换,为了保证切换之后的套接字不丢失,* 所以需要采用这一步添加继承的Socket套接字,套接字会放在NGINX的全局环境变量中*/if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {return 1;}

NGINX宏变量的值,值为客户端的socket fd句柄:

NGINX="16000:16500:16600;"

具体函数实现:

/*** Nginx支持热切换,为了保证切换之后的套接字不丢失,所以需要采用这一步添加继承的Socket套接字,套接字会放在NGINX的全局环境变量中* 初始化继承的sockets* 函数通过环境变量NGINX完成socket的继承,继承来的socket将会放到init_cycle的listening数组中。* 在NGINX环境变量中,每个socket中间用冒号或分号隔开。完成继承同时设置全局变量ngx_inherited为1。*/
static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle)
{u_char           *p, *v, *inherited;ngx_int_t         s;ngx_listening_t  *ls;inherited = (u_char *) getenv(NGINX_VAR);if (inherited == NULL) {return NGX_OK;}ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,"using inherited sockets from \"%s\"", inherited);if (ngx_array_init(&cycle->listening, cycle->pool, 10,sizeof(ngx_listening_t))!= NGX_OK){return NGX_ERROR;}for (p = inherited, v = p; *p; p++) {if (*p == ':' || *p == ';') {s = ngx_atoi(v, p - v);if (s == NGX_ERROR) {ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,"invalid socket number \"%s\" in " NGINX_VAR" environment variable, ignoring the rest"" of the variable", v);break;}v = p + 1;ls = ngx_array_push(&cycle->listening);if (ls == NULL) {return NGX_ERROR;}ngx_memzero(ls, sizeof(ngx_listening_t));ls->fd = (ngx_socket_t) s;}}if (v != p) {ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,"invalid socket number \"%s\" in " NGINX_VAR" environment variable, ignoring", v);}ngx_inherited = 1;return ngx_set_inherited_sockets(cycle);
}

二、信号处理

当我们使用./nginx -s stop|reload|quit  类似这样的命令的时候,就是给Nginx发送了一个信号。
信号可以控制Nginx进程的重启、停止、退出等操作。通过获取已经启动的Nginx的进程PID,对进程发送信号操作。
Nginx的进程ID pid一般会放置到/usr/local/nginx-1.4.7/nginx.pid。

    /* 处理信号;例如./nginx -s stop,则处理Nginx的停止信号 */if (ngx_signal) {return ngx_signal_process(cycle, ngx_signal);}

ngx_signal变量是在ngx_get_options方法中。ngx_signal主要用于标识是否是属于信号操作。例如:./nginx -s stop|reload|quit

                /* ngx_signal 是否有信号  ./nginx -s stop|reload|quit */case 's':if (*p) {ngx_signal = (char *) p;} else if (argv[++i]) {ngx_signal = argv[i];} else {ngx_log_stderr(0, "option \"-s\" requires parameter");return NGX_ERROR;}if (ngx_strcmp(ngx_signal, "stop") == 0|| ngx_strcmp(ngx_signal, "quit") == 0|| ngx_strcmp(ngx_signal, "reopen") == 0|| ngx_strcmp(ngx_signal, "reload") == 0){ngx_process = NGX_PROCESS_SIGNALLER;goto next;}ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal);return NGX_ERROR;

参考文章:

1.https://initphp.blog.csdn.net/article/details/51841597

Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)相关推荐

  1. Nginx 的启动、停止、平滑重启、信号控制和平滑升级

    Nginx 的启动          假设 nginx 安装在 /usr/local/nginx 目录中,那么启动 nginx 的命令就是: [root@localhost ~]# /usr/loca ...

  2. Nginx 源码分析

    1.工程 ngx_conf_file.c ngx_connection.c ngx_cycle.c ngx_file.h ngx_module.c ngx_open_file_cache.h ngx_ ...

  3. Lua源码分析 - 虚拟机篇 - 语义解析之Opcode执行(18)

    目录 一.虚拟机篇 - 指令执行状态机luaV_execute 二.虚拟机篇 - 状态机的具体实现原理 一.虚拟机篇 - 指令执行状态机luaV_execute 在<Lua源码分析 - 主流程篇 ...

  4. Nginx基础篇-Nginx 源码编译安装与平滑升级

    Nginx基础篇-Nginx 源码编译安装与平滑升级 Nginx官网下载地址 http://nginx.org/ 1.安装依赖包 yum -y install pcre-devel zlib-deve ...

  5. Nginx源码分析:master/worker工作流程概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...

  6. Nginx源码分析:启动流程

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...

  7. nginx源码分析(5)——监听socket初始化

    在nginx源码分析(4)中,看到了nginx的事件模型,但其中没有介绍监听socket的初始化.而对于web server来说,需要通过监听socket来监听客户端的连接等.本篇将会具体介绍这方面的 ...

  8. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  9. Spring 源码分析衍生篇十 :Last-Modified 缓存机制

    文章目录 一.前言 二.Last-Modify 三.实现方案 1. 实现 org.springframework.web.servlet.mvc.LastModified接口 1.1. 简单演示 1. ...

  10. Nginx源码分析链接

    nginx-0.8.38源码探秘:http://blog.csdn.net/ccdd14/article/details/5872312 nginx源码分析: http://blog.sina.com ...

最新文章

  1. 混淆矩阵(confusion matrix)是什么?以及能从混淆矩阵中衍生出来的指标FPR、TPR、FDR、ACC、PPV、NPV分别是什么?对应的概念及公式是什么?
  2. python 函数练习集锦
  3. 怎么在python下载网站内容-python从网站上下载东西
  4. 基于vue-cli配置移动端自适应
  5. 互联网内容平台到底要用到多少AI技术?
  6. 捕获分组和非捕获分组以及命名分组
  7. WIFI-MESH + 蓝牙MESH在智能家居领域有着广泛的应用场景,他们的区别到底在哪里呢
  8. MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
  9. linux系统原理是什么意思,Linux系统原理之整体概述
  10. 设计模式笔记——Bridge
  11. AIX samba服务器配置
  12. 揭示C语言函数调用的本质解析
  13. Tipard Video Converter Ultimate如何旋转视频?
  14. mysql 5.6 emoji_让MySQL 5.6支持Emoji表情
  15. log4j.properties文件中的log4j.rootLogger重要性
  16. 自媒体各大平台收益对比_自媒体推广平台都有哪些?
  17. 别出心裁的Linux命令学习法
  18. 电话机器人源码智能电话机器人7项技术特点,教你选择合适的电话机器人!
  19. SetupAPI简介与设备管理
  20. Android 截屏实现、屏幕截图、MediaProjection、ImageReader

热门文章

  1. spring awre的理解
  2. Uva 12009 平方数尾数与自身同样 dfs 构造
  3. 第一次JAVA课,第一次课堂考,课后感受
  4. Spring常用注解用法总结
  5. iOS数据库操作(使用FMDB)
  6. 25年前的预言(转贴一篇,事实胜于雄辩)
  7. 信号的概念以及网络布线
  8. ListIterator和Iterator的区别
  9. Jsoup爬虫新手一
  10. Hybrid 接口应用