文档章节

nginx upstream模块源码学习(0)

wulle
 wulle
发布于 2017/04/06 00:16
字数 527
阅读 27
收藏 0

初始化阶段

1. ngx_http_upstream_create_main_conf

创建主配置项结构

typedef struct {
    ngx_hash_t                       headers_in_hash;
    ngx_array_t                      upstreams;
                                             /* ngx_http_upstream_srv_conf_t */
} ngx_http_upstream_main_conf_t;

upstream模块有两个配置“upstream”和“server”。

static ngx_command_t  ngx_http_upstream_commands[] = {

    { ngx_string("upstream"),
      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,
      ngx_http_upstream,
      0,
      0,
      NULL },

    { ngx_string("server"),
      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
      ngx_http_upstream_server,
      NGX_HTTP_SRV_CONF_OFFSET,
      0,
      NULL },

      ngx_null_command
};

2. ngx_http_upstream函数:

    将调用ngx_http_upstream_add,向upstream主配置结构的upstreams数组中添加并初始化ngx_http_upstream_srv_conf_t结构;随后,创建upstream配置块的三级配置结构,开始解析配置项。

struct ngx_http_upstream_srv_conf_s {
    ngx_http_upstream_peer_t         peer;
    void                           **srv_conf;

    ngx_array_t                     *servers;  /* ngx_http_upstream_server_t */

    ngx_uint_t                       flags;
    ngx_str_t                        host;
    u_char                          *file_name;
    ngx_uint_t                       line;
    in_port_t                        port;
    in_port_t                        default_port;
    ngx_uint_t                       no_port;  /* unsigned no_port:1 */

#if (NGX_HTTP_UPSTREAM_ZONE)
    ngx_shm_zone_t                  *shm_zone;
#endif
};

3. 解析到server时,将调用ngx_http_upstream_server

    向servers数组中添加新的后端服务器ngx_http_upstream_server_t,属性默认值为 weight=1;max_fails=1;fail_timeout = 10。

typedef struct {
    ngx_str_t                        name;
    ngx_addr_t                      *addrs;
    ngx_uint_t                       naddrs;
    ngx_uint_t                       weight;
    ngx_uint_t                       max_fails;
    time_t                           fail_timeout;

    unsigned                         down:1;
    unsigned                         backup:1;
} ngx_http_upstream_server_t;

    nginx原生的upstream模块还有hash,ip_hash,keepalive,least_conn,zone。

4. upstream模块初始化时会添加一些配置文件变量,ngx_http_upstream_vars。

5. ngx_http_upstream_init_main_conf函数

    调用每个upstream对应的ngx_http_upstream_srv_conf_t结构中ngx_http_upstream_peer_t成员的回调函数peer.init_upstream,该回调函数默认为ngx_http_upstream_init_round_robin,也可以通过其他upstream模块进行设置。不管什么模块的peer.init_upstream,都负责设置peer.ini回调,并将ngx_http_upstream_srv_conf_t中的server解析到peer.data指向的ngx_http_upstream_rr_peers_t结构中(ngx_http_upstream_init_round_robin函数负责)。


struct ngx_http_upstream_rr_peers_s {
    ngx_uint_t                      number;

#if (NGX_HTTP_UPSTREAM_ZONE)
    ngx_slab_pool_t                *shpool;
    ngx_atomic_t                    rwlock;
    ngx_http_upstream_rr_peers_t   *zone_next;
#endif

    ngx_uint_t                      total_weight;

    unsigned                        single:1;
    unsigned                        weighted:1;

    ngx_str_t                      *name;

    ngx_http_upstream_rr_peers_t   *next;

    ngx_http_upstream_rr_peer_t    *peer;
};

next指针指向的时backup的后端服务器,peer为后端服务器链表。

struct ngx_http_upstream_rr_peer_s {
    struct sockaddr                *sockaddr;
    socklen_t                       socklen;
    ngx_str_t                       name;
    ngx_str_t                       server;

    ngx_int_t                       current_weight;
    ngx_int_t                       effective_weight;
    ngx_int_t                       weight;

    ngx_uint_t                      conns;

    ngx_uint_t                      fails;
    time_t                          accessed;
    time_t                          checked;

    ngx_uint_t                      max_fails;
    time_t                          fail_timeout;

    ngx_uint_t                      down;          /* unsigned  down:1; */

#if (NGX_HTTP_SSL)
    void                           *ssl_session;
    int                             ssl_session_len;
#endif

    ngx_http_upstream_rr_peer_t    *next;

#if (NGX_HTTP_UPSTREAM_ZONE)
    ngx_atomic_t                    lock;
#endif
};

    随后,ngx_http_upstream_init_main_conf会将ngx_http_upstream_headers_in数组中的头hash到upstream模块主配置项的headers_in_hash中。处理客户端HTTP请求时,会去hash中匹配头,并调用处理函数来设置头信息。

typedef struct {
    ngx_str_t                        name;
    ngx_http_header_handler_pt       handler;
    ngx_uint_t                       offset;
    ngx_http_header_handler_pt       copy_handler;
    ngx_uint_t                       conf;
    ngx_uint_t                       redirect;  /* unsigned   redirect:1; */
} ngx_http_upstream_header_t;

 

此时,初始化完成,即所有server都被放在了相应upstream块的ngx_http_upstream_rr_peers_t中。

下一篇介绍请求处理流程。

 

© 著作权归作者所有

共有 人打赏支持
wulle
粉丝 1
博文 3
码字总数 3276
作品 0
成都
Nginx安装负载均衡配置 fair check扩展

Nginx安装负载均衡配置 fair check扩展 前言 本文主要是针对Nginx安装、负载均衡配置,以及fair智能选举、check后端节点检查扩展功能如何扩展,进行讲解说明。 fair模块: upstream-fair,“...

linjin200
07/19
0
0
线上nginx的一次“no live upstreams while connecting to upstream ”分析

先描述一下环境,前段的负载均衡转发给nginx,nginx再转发给后端的应用服务器。 nginx配置文件如下: upstream ads { server ap1:8888 maxfails=1 failtimeout=60s; server ap2:8888 maxfail...

飞翔的单车
2015/08/30
0
0
openresty添加tengine的nginx_upstream_check_module模块

公司使用了openresty 版本号是1.9.3 因业务需要 现在给它添加淘宝技术团队的健康检查模块 nginxupstreamcheck_module 参考网上各大教程,基本都是通过打补丁的方式来实现 wget https://codel...

RyanMe
2015/12/16
1K
1
开源中国/nginx-http-upstreams-control-module

#基于web的 nginx upstream 监控和管理模块 #nginx http upstreams control module 本模块是为监视和控制nginx的upstream配置而写的nginx模块。 本模块实现的功能可以让你随时查看nginx的ups...

开源中国
2017/01/10
0
0
Nginx学习之负载均衡fair模块

Nginx学习之负载均衡fair模块 2017-04-10 20:27 写在开始 前面对Nginx的三种负载均衡实现做了一个简单的介绍,这里分享一个第三方的负载均衡模块nginx-upstream-fair。 模块介绍 The Nginx ...

linjin200
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android JNI开发系列(十三) JNI异常处理

JNI 异常处理 JNI异常与JAVA处理异常的区别 JAVA 有异常处理机制,而JNI没有 如果JAVA中异常没有捕获,后面的代码不会执行,JNI会执行 JAVA编译时的异常,是在方法显示的声明了某一个异常,编...

蔡小鹏
35分钟前
2
0
简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包 WAR(Web Archive file)网络应用程序文件,是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。 War是...

Linux就该这么学
59分钟前
1
0
Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
今天
0
0
快速幂运算

题:求一个数 data 的 n 次幂,要求时间复杂度为log(n) 1:递归算法: /** * x^3=(x^2)*x;x^7=(x^3)^2 * x * * 递归算法 * @param data 底数 * @param n 次...

偶尔诗文
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部