Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)
目录
一、平滑重启
二、信号处理
一、平滑重启
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)相关推荐
- Nginx 的启动、停止、平滑重启、信号控制和平滑升级
Nginx 的启动 假设 nginx 安装在 /usr/local/nginx 目录中,那么启动 nginx 的命令就是: [root@localhost ~]# /usr/loca ...
- Nginx 源码分析
1.工程 ngx_conf_file.c ngx_connection.c ngx_cycle.c ngx_file.h ngx_module.c ngx_open_file_cache.h ngx_ ...
- Lua源码分析 - 虚拟机篇 - 语义解析之Opcode执行(18)
目录 一.虚拟机篇 - 指令执行状态机luaV_execute 二.虚拟机篇 - 状态机的具体实现原理 一.虚拟机篇 - 指令执行状态机luaV_execute 在<Lua源码分析 - 主流程篇 ...
- Nginx基础篇-Nginx 源码编译安装与平滑升级
Nginx基础篇-Nginx 源码编译安装与平滑升级 Nginx官网下载地址 http://nginx.org/ 1.安装依赖包 yum -y install pcre-devel zlib-deve ...
- Nginx源码分析:master/worker工作流程概述
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...
- Nginx源码分析:启动流程
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...
- nginx源码分析(5)——监听socket初始化
在nginx源码分析(4)中,看到了nginx的事件模型,但其中没有介绍监听socket的初始化.而对于web server来说,需要通过监听socket来监听客户端的连接等.本篇将会具体介绍这方面的 ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- Spring 源码分析衍生篇十 :Last-Modified 缓存机制
文章目录 一.前言 二.Last-Modify 三.实现方案 1. 实现 org.springframework.web.servlet.mvc.LastModified接口 1.1. 简单演示 1. ...
- Nginx源码分析链接
nginx-0.8.38源码探秘:http://blog.csdn.net/ccdd14/article/details/5872312 nginx源码分析: http://blog.sina.com ...
最新文章
- 混淆矩阵(confusion matrix)是什么?以及能从混淆矩阵中衍生出来的指标FPR、TPR、FDR、ACC、PPV、NPV分别是什么?对应的概念及公式是什么?
- python 函数练习集锦
- 怎么在python下载网站内容-python从网站上下载东西
- 基于vue-cli配置移动端自适应
- 互联网内容平台到底要用到多少AI技术?
- 捕获分组和非捕获分组以及命名分组
- WIFI-MESH + 蓝牙MESH在智能家居领域有着广泛的应用场景,他们的区别到底在哪里呢
- MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
- linux系统原理是什么意思,Linux系统原理之整体概述
- 设计模式笔记——Bridge
- AIX samba服务器配置
- 揭示C语言函数调用的本质解析
- Tipard Video Converter Ultimate如何旋转视频?
- mysql 5.6 emoji_让MySQL 5.6支持Emoji表情
- log4j.properties文件中的log4j.rootLogger重要性
- 自媒体各大平台收益对比_自媒体推广平台都有哪些?
- 别出心裁的Linux命令学习法
- 电话机器人源码智能电话机器人7项技术特点,教你选择合适的电话机器人!
- SetupAPI简介与设备管理
- Android 截屏实现、屏幕截图、MediaProjection、ImageReader