nginx connect peer流程源码分析

完整的connect upstream流程

nginx proxy_pass和upstream源码分析_realmardrid的博客-CSDN博客

proxy_pass绑定loc的handler为ngx_http_proxy_handler函数

ngx_http_proxy_handler函数

在ngx_http_proxy_handler函数中调用ngx_http_upstream_create

static ngx_int_t

ngx_http_proxy_handler(ngx_http_request_t *r)

{

...

    if (ngx_http_upstream_create(r) != NGX_OK) {

        return NGX_HTTP_INTERNAL_SERVER_ERROR;

    }

    // 设置upstream处理方法

    rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);

...

}

//紧接着分析ngx_http_upstream_init

void

ngx_http_upstream_init(ngx_http_request_t *r)

{

...

    ngx_http_upstream_init_request(r);

...

}

static void

ngx_http_upstream_init_request(ngx_http_request_t *r)

{

...

       if (u->resolved->sockaddr) {

            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)

                != NGX_OK)

            {

                ngx_http_upstream_finalize_request(r, u,

                                               NGX_HTTP_INTERNAL_SERVER_ERROR);

                return;

            }

            ngx_http_upstream_connect(r, u);

            return;

        }

        host = &u->resolved->host;

        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);

        // 调用connect_peer前先get_round_robin_peer

        ngx_http_upstream_connect(r, u);

...

}

ngx_http_upstream_create_round_robin_peer函数

ngx_int_t

ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,

    ngx_http_upstream_resolved_t *ur)

{

...

    // 获取rrp

    rrp = r->upstream->peer.data;

    //peers alloc 

    peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t)

                     + sizeof(ngx_http_upstream_rr_peer_t) * (ur->naddrs - 1));

    for (i = 0; i < ur->naddrs; i++) {

        peer[i].sockaddr = sockaddr;

            peer[i].socklen = socklen;

            peer[i].name.len = len;

            peer[i].name.data = p;

            peer[i].id.len = 0;

            peer[i].id.data = NULL;

            peer[i].weight = 1;

            peer[i].effective_weight = 1;

            peer[i].current_weight = 0;

            peer[i].max_fails = 1;

            peer[i].fail_timeout = 10;

    }

    rrp->peers = peers;

    // 设置get和free函数

    r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;

    r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;

...

}

ngx_http_upstream_connect函数

void

ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u)

{

...

    //找到连接peer upstream

    rc = ngx_event_connect_peer(&u->peer);

...

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值