diff --git a/src/http/modules/ngx_http_upstream_ip_hash_module.c b/src/http/modules/ngx_http_upstream_ip_hash_module.c index 100ea34..642b01b 100644 --- a/src/http/modules/ngx_http_upstream_ip_hash_module.c +++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c @@ -9,6 +9,10 @@ #include #include +#if (NGX_HTTP_UPSTREAM_CHECK) +#include "ngx_http_upstream_check_module.h" +#endif + typedef struct { /* the round robin data must be first */ @@ -182,6 +186,12 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data) if (!peer->down) { +#if (NGX_HTTP_UPSTREAM_CHECK) + ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, + "get ip_hash peer, check_index: %ui", + peer->check_index); + if (!ngx_http_upstream_check_peer_down(peer->check_index)) { +#endif if (peer->max_fails == 0 || peer->fails < peer->max_fails) { break; } @@ -190,6 +200,9 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data) peer->checked = now; break; } +#if (NGX_HTTP_UPSTREAM_CHECK) + } +#endif } iphp->rrp.tried[n] |= m; diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c index 214de7b..309725b 100644 --- a/src/http/ngx_http_upstream_round_robin.c +++ b/src/http/ngx_http_upstream_round_robin.c @@ -9,6 +9,9 @@ #include #include +#if (NGX_HTTP_UPSTREAM_CHECK) +#include "ngx_http_upstream_check_module.h" +#endif static ngx_int_t ngx_http_upstream_cmp_servers(const void *one, const void *two); @@ -83,7 +86,17 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf, peers->peer[n].weight = server[i].weight; peers->peer[n].effective_weight = server[i].weight; peers->peer[n].current_weight = 0; - n++; + +#if (NGX_HTTP_UPSTREAM_CHECK) + if (!server[i].down) { + peers->peer[n].check_index = + ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]); + } + else { + peers->peer[n].check_index = (ngx_uint_t) NGX_ERROR; + } +#endif + n++; } } @@ -137,6 +150,17 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf, backup->peer[n].max_fails = server[i].max_fails; backup->peer[n].fail_timeout = server[i].fail_timeout; backup->peer[n].down = server[i].down; + +#if (NGX_HTTP_UPSTREAM_CHECK) + if (!server[i].down) { + backup->peer[n].check_index = + ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]); + } + else { + backup->peer[n].check_index = (ngx_uint_t) NGX_ERROR; + } +#endif + n++; } } @@ -196,6 +220,9 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf, peers->peer[i].current_weight = 0; peers->peer[i].max_fails = 1; peers->peer[i].fail_timeout = 10; +#if (NGX_HTTP_UPSTREAM_CHECK) + peers->peer[i].check_index = (ngx_uint_t) NGX_ERROR; +#endif } us->peer.data = peers; @@ -313,6 +340,9 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, peers->peer[0].current_weight = 0; peers->peer[0].max_fails = 1; peers->peer[0].fail_timeout = 10; +#if (NGX_HTTP_UPSTREAM_CHECK) + peers->peer[0].check_index = (ngx_uint_t) NGX_ERROR; +#endif } else { @@ -346,6 +376,9 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, peers->peer[i].current_weight = 0; peers->peer[i].max_fails = 1; peers->peer[i].fail_timeout = 10; +#if (NGX_HTTP_UPSTREAM_CHECK) + peers->peer[i].check_index = (ngx_uint_t) NGX_ERROR; +#endif } } @@ -419,7 +452,11 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) if (rrp->peers->single) { peer = &rrp->peers->peer[0]; - +#if (NGX_HTTP_UPSTREAM_CHECK) + if (ngx_http_upstream_check_peer_down(peer->check_index)) { + return NGX_BUSY; + } +#endif } else { /* there are several peers */ @@ -517,6 +554,12 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp) continue; } +#if (NGX_HTTP_UPSTREAM_CHECK) + if (ngx_http_upstream_check_peer_down(peer->check_index)) { + continue; + } +#endif + if (peer->max_fails && peer->fails >= peer->max_fails && now - peer->checked <= peer->fail_timeout) diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h index 4de3cae..164867b 100644 --- a/src/http/ngx_http_upstream_round_robin.h +++ b/src/http/ngx_http_upstream_round_robin.h @@ -30,6 +30,10 @@ typedef struct { ngx_uint_t max_fails; time_t fail_timeout; +#if (NGX_HTTP_UPSTREAM_CHECK) + ngx_uint_t check_index; +#endif + ngx_uint_t down; /* unsigned down:1; */ #if (NGX_HTTP_SSL)