文档章节

nginx upstream模块源码学习(0)

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

码上生花,ECharts 作品展示赛正式启动!>>>

初始化阶段

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
273
0
Nginx负载均衡配置与负载策略

原理 负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务。 应用场景 春节期间在12306网站上买过火车票的朋友应该深有体会,有时...

osc_t67nabcg
2019/03/01
2
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开发从入门到精通 学习目录分享学习 (阿里著作)

Nginx开发从入门到精通 缘起 nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内...

lhj588
2014/06/16
0
0
Nginx负载均衡后端健康检查

  参考文档:https://www.cnblogs.com/kevingrace/p/6685698.html   本次使用第三方模块nginxupstreamcheck_module的,要使用这个第三方模块首先您需要进行下载,然后通过patch命令将补丁...

osc_5aksh307
2018/08/21
4
0

没有更多内容

加载失败,请刷新页面

加载更多

COREJAVA概述-集合

1、什么是集合 集合类存放于java.util包中。 集合类型主要有3种:set(集)、list(列表)和map(映射)。 集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用...

osc_yy65eb2q
刚刚
0
0
文件或目录损坏且无法读取怎么办?

问题描述: 硬盘打不开文件或目录损坏且无法读取,是因为这个I盘的文件系统内部结构损坏导致的。文件或目录损坏且无法读取怎么办?具体的恢复方法看正文 工具/软件:极限数据恢复软件 步骤1:...

osc_zypmzfh3
2分钟前
0
0
URL not found: C:\Program Files (x86)\Android\android-sdk\temp\build-tools_r

https://www.jianshu.com/p/a867b13d4b31 在Android SDK Manager更新时,显示如图中错误.。 但能获取更新版本列表,说明网络连接没有问题。 解决方法:然后sdk manager右键管理员权限打开,就...

osc_61i1fz2h
4分钟前
7
0
Warning: License for package Android SDK Build-Tools 27.0.3 not accepted.

https://blog.csdn.net/fenyu8/article/details/104897334 报错信息: Failed to install the following Android SDK packages as some licences have not been accepted. Warning: License......

osc_gt7nq50v
5分钟前
8
0
go 结构体与方法

go 结构体与方法 go 结构体相当于 python 中类的概念,结构体用来定义复杂的数据结构,存储很多相同的字段属性 结构体的定义 1、结构体的定义以及简单实用 package mainimport ( "fmt"...

osc_62a7f5bj
8分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部