1diff --git a/src/http/modules/ngx_http_upstream_ip_hash_module.c b/src/http/modules/ngx_http_upstream_ip_hash_module.c
2index 041883f..b1bc7d0 100644
3--- a/src/http/modules/ngx_http_upstream_ip_hash_module.c
4+++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c
5@@ -9,6 +9,10 @@
6 #include <ngx_core.h>
7 #include <ngx_http.h>
8
9+#if (NGX_HTTP_UPSTREAM_CHECK)
10+#include "ngx_http_upstream_check_module.h"
11+#endif
12+
13
14 typedef struct {
15     /* the round robin data must be first */
16@@ -212,6 +216,15 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
17             goto next_try;
18         }
19
20+#if (NGX_HTTP_UPSTREAM_CHECK)
21+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
22+            "get ip_hash peer, check_index: %ui",
23+             peer->check_index);
24+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
25+            goto next_try;
26+        }
27+#endif
28+
29         if (peer->max_fails
30             && peer->fails >= peer->max_fails
31             && now - peer->checked <= peer->fail_timeout)
32diff --git a/src/http/modules/ngx_http_upstream_least_conn_module.c b/src/http/modules/ngx_http_upstream_least_conn_module.c
33index dbef95d..dc9b518 100644
34--- a/src/http/modules/ngx_http_upstream_least_conn_module.c
35+++ b/src/http/modules/ngx_http_upstream_least_conn_module.c
36@@ -9,6 +9,10 @@
37 #include <ngx_core.h>
38 #include <ngx_http.h>
39
40+#if (NGX_HTTP_UPSTREAM_CHECK)
41+#include "ngx_http_upstream_check_module.h"
42+#endif
43+
44
45 typedef struct {
46     ngx_uint_t                        *conns;
47@@ -203,6 +207,16 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
48             continue;
49         }
50
51+#if (NGX_HTTP_UPSTREAM_CHECK)
52+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
53+                "get least_conn peer, check_index: %ui",
54+                peer->check_index);
55+
56+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
57+            continue;
58+        }
59+#endif
60+
61         if (peer->max_fails
62             && peer->fails >= peer->max_fails
63             && now - peer->checked <= peer->fail_timeout)
64@@ -256,6 +270,16 @@ ngx_http_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data)
65                 continue;
66             }
67
68+#if (NGX_HTTP_UPSTREAM_CHECK)
69+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
70+                    "get least_conn peer, check_index: %ui",
71+                    peer->check_index);
72+
73+            if (ngx_http_upstream_check_peer_down(peer->check_index)) {
74+                continue;
75+            }
76+#endif
77+
78             if (lcp->conns[i] * best->weight != lcp->conns[p] * peer->weight) {
79                 continue;
80             }
81diff --git a/src/http/ngx_http_upstream_round_robin.c b/src/http/ngx_http_upstream_round_robin.c
82index 85ff558..2fe9bb6 100644
83--- a/src/http/ngx_http_upstream_round_robin.c
84+++ b/src/http/ngx_http_upstream_round_robin.c
85@@ -9,6 +9,9 @@
86 #include <ngx_core.h>
87 #include <ngx_http.h>
88
89+#if (NGX_HTTP_UPSTREAM_CHECK)
90+#include "ngx_http_upstream_check_module.h"
91+#endif
92
93 static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer(
94     ngx_http_upstream_rr_peer_data_t *rrp);
95@@ -85,6 +88,14 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
96                 peers->peer[n].max_fails = server[i].max_fails;
97                 peers->peer[n].fail_timeout = server[i].fail_timeout;
98                 peers->peer[n].down = server[i].down;
99+#if (NGX_HTTP_UPSTREAM_CHECK)
100+                if (!server[i].down) {
101+                    peers->peer[n].check_index =
102+                        ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]);
103+                } else {
104+                    peers->peer[n].check_index = (ngx_uint_t) NGX_ERROR;
105+                }
106+#endif
107                 n++;
108             }
109         }
110@@ -139,6 +150,17 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
111                 backup->peer[n].max_fails = server[i].max_fails;
112                 backup->peer[n].fail_timeout = server[i].fail_timeout;
113                 backup->peer[n].down = server[i].down;
114+
115+#if (NGX_HTTP_UPSTREAM_CHECK)
116+                if (!server[i].down) {
117+                    backup->peer[n].check_index =
118+                        ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]);
119+                }
120+                else {
121+                    backup->peer[n].check_index = (ngx_uint_t) NGX_ERROR;
122+                }
123+#endif
124+
125                 n++;
126             }
127         }
128@@ -196,6 +218,9 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
129         peers->peer[i].current_weight = 0;
130         peers->peer[i].max_fails = 1;
131         peers->peer[i].fail_timeout = 10;
132+#if (NGX_HTTP_UPSTREAM_CHECK)
133+        peers->peer[i].check_index = (ngx_uint_t) NGX_ERROR;
134+#endif
135     }
136
137     us->peer.data = peers;
138@@ -302,6 +327,9 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
139         peers->peer[0].current_weight = 0;
140         peers->peer[0].max_fails = 1;
141         peers->peer[0].fail_timeout = 10;
142+#if (NGX_HTTP_UPSTREAM_CHECK)
143+        peers->peer[0].check_index = (ngx_uint_t) NGX_ERROR;
144+#endif
145
146     } else {
147
148@@ -342,6 +370,9 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
149             peers->peer[i].current_weight = 0;
150             peers->peer[i].max_fails = 1;
151             peers->peer[i].fail_timeout = 10;
152+#if (NGX_HTTP_UPSTREAM_CHECK)
153+            peers->peer[i].check_index = (ngx_uint_t) NGX_ERROR;
154+#endif
155         }
156     }
157
158@@ -399,6 +430,12 @@ ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data)
159             goto failed;
160         }
161
162+#if (NGX_HTTP_UPSTREAM_CHECK)
163+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
164+            goto failed;
165+        }
166+#endif
167+
168     } else {
169
170         /* there are several peers */
171@@ -498,6 +535,12 @@ ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
172             continue;
173         }
174
175+#if (NGX_HTTP_UPSTREAM_CHECK)
176+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
177+            continue;
178+        }
179+#endif
180+
181         if (peer->max_fails
182             && peer->fails >= peer->max_fails
183             && now - peer->checked <= peer->fail_timeout)
184diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h
185index ea90ab9..a6fb33f 100644
186--- a/src/http/ngx_http_upstream_round_robin.h
187+++ b/src/http/ngx_http_upstream_round_robin.h
188@@ -30,6 +30,10 @@ typedef struct {
189     ngx_uint_t                      max_fails;
190     time_t                          fail_timeout;
191
192+#if (NGX_HTTP_UPSTREAM_CHECK)
193+    ngx_uint_t                      check_index;
194+#endif
195+
196     ngx_uint_t                      down;          /* unsigned  down:1; */
197
198 #if (NGX_HTTP_SSL)
199