完整的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); ... } |