文档章节

nginx upstream模块源码学习(0)

wulle
 wulle
发布于 2017/04/06 00:16
字数 527
阅读 47
收藏 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中。

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

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 目标文件
下一篇: libubox
wulle
粉丝 1
博文 3
码字总数 3276
作品 0
成都
私信 提问
Nginx安装负载均衡配置 fair check扩展

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

linjin200
2018/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
开源中国/nginx-http-upstreams-control-module

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

开源中国
2017/01/10
0
0
openresty添加tengine的nginx_upstream_check_module模块

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

RyanMe
2015/12/16
3K
2
Nginx学习之负载均衡fair模块

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

linjin200
2018/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的Async I/O

序 本文主要研究一下flink的Async I/O 实例 // This example implements the asynchronous request and callback with Futures that have the// interface of Java 8's futures (which is t......

go4it
14分钟前
0
0
一文详解微服务架构的数据设计

微服务是一个软件架构模式,对微服务的讨论大多集中在容器或其他技术是否能很好的实施微服务这些方面。 本文将从以下几个角度来和大家分享在微服务架构下进行数据设计需要关注的地方,旨在帮...

java菜分享
24分钟前
2
0
Java并发编程之美读书笔记-并发编程基础1

线程 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,比如idea运行代码时的jvm是一个进程,但是CPU资源比较特殊,它是被分配到线程的,线程是进程的一个执行路...

hensemlee
37分钟前
1
0
【剑指offer纪念版】--10 进制1的个数

10. 题目 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。 解题思路   把一个整数减去1,再和原整...

细节探索者
52分钟前
2
0
本科毕业平均年薪 30 万!经济寒冬挡不住 AI 人才的火热!

互联网行业遭遇寒冬,企业纷纷裁员缩招,而 BAT 和硅谷明星公司对 AI 人才的投入却并不见放缓。为争夺相关人才,给应届毕业生开出的平均年薪高达 30 万。 而 TensorFlow 作为当下最流行的深度...

AI女神
58分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部