nginx健康检查模块源码分析
nginx健康检查模块
本文所说的nginx健康检查模块是指nginx_upstream_check_module模块。nginx_upstream_check_module模块是Taobao定制的用于健康检查的模块。
其主要作用是根据配置,对upstream中的每个server进行定期健康检查,在其超时或连续多次失败后,将其置为down状态。
其基本用法如下:
upstream cluster {
# simple round-robin
server 192.168.0.1:80;
server 192.168.0.2:80;
check interval=5000 rise=1 fall=3 timeout=4000;
}
更多的用法可以参看README。
模块源码分析
分析的版本是TAG:v0.3.0。
模块定义
ngx_http_upstream_check_module模块的定义在这里。
ngx_module_t ngx_http_upstream_check_module = {
NGX_MODULE_V1,
&ngx_http_upstream_check_module_ctx, /* module context */
ngx_http_upstream_check_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
ngx_http_upstream_check_init_process, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
ngx_http_upstream_check_module_ctx用于描述模块的一些上下文。
static ngx_http_module_t ngx_http_upstream_check_module_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */
ngx_http_upstream_check_create_main_conf,/* create main configuration */
ngx_http_upstream_check_init_main_conf, /* init main configuration */
ngx_http_upstream_check_create_srv_conf, /* create server configuration */
NULL, /* merge server configuration */
ngx_http_upstream_check_create_loc_conf, /* create location configuration */
ngx_http_upstream_check_merge_loc_conf /* merge location configuration */
};
ngx_http_upstream_check_module_ctx中比较需要关注的是ngx_http_upstream_check_create_srv_conf,用于产生本模块server级别的配置。因为check的配置时在upstream里,属于server级别。所有ngx_http_upstream_check_create_srv_conf会为每个upstream产生一个ngx_http_upstream_check_srv_conf_t配置。
配置分解
ngx_http_upstream_check_srv_conf_t即ngx_http_upstream_check_srv_conf_s的结构如下:
struct ngx_http_upstream_check_srv_conf_s {
ngx_uint_t port;
ngx_uint_t fall_count;
ngx_uint_t rise_count;
ngx_msec_t check_interval;
ngx_msec_t check_timeout;
ngx_uint_t check_keepalive_requests;
ngx_check_conf_t *check_type_conf;
ngx_str_t send;
union {
ngx_uint_t return_code;
ngx_uint_t status_alive;
} code;
ngx_array_t *fastcgi_params;
ngx_uint_t default_down;
};
ngx_http_upstream_check_commands用于分解相关的check命令。
static ngx_command_t ngx_http_upstream_check_commands[] = {
{ ngx_string("check"),
NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
ngx_http_upstream_check,
0,
0,
NULL },
....
};
以上代码用于分解以"check"开头的命令行。在解析该行时,将会调用 ngx_http_upstream_check 函数。
具体对于ngx_command_t的含义可以参考Nginx模块开发入门。
ngx_http_upstream_check函数的主要作用就是将诸如check interval=5000 rise=1 fall=3 timeout=4000的指令分解,并赋值给ngx_http_upstream_check_srv_conf_t。
模块运行
运行的入口函数在ngx_http_upstream_check_init_process
static ngx_int_t
ngx_http_upstream_check_init_process(ngx_cycle_t *cycle)
{
return ngx_http_upstream_check_add_timers(cycle);
}
static ngx_int_t
ngx_http_upstream_check_add_timers(ngx_cycle_t *cycle)
{
...
for (i = 0; i < peers->peers.nelts; i++) { //这里对每个server进行循环
peer[i].shm = &peer_shm[i];
peer[i].check_ev.handler = ngx_http_upstream_check_begin_handler; //配置check的钩子函数
...
peer[i].check_timeout_ev.handler =
ngx_http_upstream_check_timeout_handler; //配置超时的钩子函数
...
/*
* We add a random start time here, since we don't want to trigger
* the check events too close to each other at the beginning.
*/
delay = ucscf->check_interval > 1000 ? ucscf->check_interval : 1000;
t = ngx_random() % delay; //这里的设计比较特别,在一个随机的实际开始检查,以免所有的检查在一起撞车
ngx_add_timer(&peer[i].check_ev, t);
}
return NGX_OK;
}
至于具体是如何运行check检查的,可以参看ngx_http_upstream_check_begin_handler函数。
nginx健康检查模块源码分析的更多相关文章
- Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend
本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...
- Spark Scheduler模块源码分析之DAGScheduler
本文主要结合Spark-1.6.0的源码,对Spark中任务调度模块的执行过程进行分析.Spark Application在遇到Action操作时才会真正的提交任务并进行计算.这时Spark会根据Ac ...
- Zepto事件模块源码分析
Zepto事件模块源码分析 一.保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数.而Zepto则可以不传入回调函数,直接移除对应类型的所有事件.原因就在于Z ...
- Django(51)drf渲染模块源码分析
前言 渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式. 渲染模块源码入口 入口:APIView类中dispatch方法中的:self.response ...
- Fabric2.2中的Raft共识模块源码分析
引言 Hyperledger Fabric是当前比较流行的一种联盟链系统,它隶属于Linux基金会在2015年创建的超级账本项目且是这个项目最重要的一个子项目.目前,与Hyperledger的另外几个 ...
- Nginx学习笔记4 源码分析
Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...
- Django(48)drf请求模块源码分析
前言 APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块 请求模块:request对象 源码入口 APIView类中di ...
- Django(49)drf解析模块源码分析
前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...
- Django(50)drf异常模块源码分析
异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...
随机推荐
- thinkphp 支付宝错误 Class 'Think' not found
Class 'Think' not found D:\www\DonatePlatform\ThinkPHP\Extend\Vendor\alipay\lib\alipay_submit.class. ...
- Premiere Pro CC问题集,不断更新
1.Premiere Pro CC不好用? 是的.原因如下: 1.1 Adobe公司不注重用户体验,不注重工作流程,导致这款软件的用户体验很差,设计也很烂.对比Adobe公司当年用户体验最好的软件 F ...
- ADS-B显示终端5.9
更改日志 1 更新背景地图.增加了全国范围内的VOR电台.DME.NDB导航台信息,包含有坐标信息.代码信息.频率等内容. VOR电台.DME.NDB导航台信息来自中国民航局公布的航行情况资料汇 ...
- [LeetCode] ZigZag Conversion [9]
称号 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- CentOS下JAVA WEB 环境搭建
首先介绍下我的软件环境.虚拟机Vmware9.0(已经汉化),CentOS6.4(选择安装语言为简体中文),xshell4.0(强大的安全终端模拟软件),xftp4.0(FTP工具). 方便大家环境搭 ...
- android的版本控制
在一个团队项目中,项目的版本控制,一方面促进团队的协同能力,另一方面提高项目的进度 即使一个人的项目也最好使用SVN这样的版本控制,可以清楚的知道自己的修改的代码,和项目进度等.合理的托管,也让优秀的 ...
- 构建具有深度和灵活性的安卓Wear应用
自从去年Android 5.0发布以后就一直在关注可穿戴方面的事情.这个年的前后一直在忖度该怎么海淘一个moto 360,可是考虑到iWatch在本年度四月份发布,估计现在已经有的Android可穿戴 ...
- [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人
不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小 15天学会jQuery(完整版).pdf 274.79 KB 21天学通JavaScript(第2版)-顾宁燕扫描版.pdf ...
- python+sublime text 2 中文乱码问题的解决方法[Decode error - output not utf-8]
打开sublime的preferences--browse packages找到python文件夹中的Python.sublime-build文件,把它拖到sublime里打开.在最后一行加入&quo ...
- java UDP网路编程
大家都知道java中的socket网络编程,而其采用的协议分别有tcp和udp协议两种. 通常的理解tcp协议类似于打电话,udp类似于发短信.前者是线程安全的,但是效率比较低.后者则刚好相反. 今天 ...