1diff -burN nginx-1.12.1_orig/src/http/modules/ngx_http_upstream_hash_module.c nginx-1.12.1/src/http/modules/ngx_http_upstream_hash_module.c
2--- nginx-1.12.1_orig/src/http/modules/ngx_http_upstream_hash_module.c	2017-07-11 13:24:08.000000000 +0000
3+++ nginx-1.12.1/src/http/modules/ngx_http_upstream_hash_module.c	2017-07-13 17:58:44.687213233 +0000
4@@ -9,6 +9,9 @@
5 #include <ngx_core.h>
6 #include <ngx_http.h>
7
8+#if (NGX_HTTP_UPSTREAM_CHECK)
9+#include "ngx_http_upstream_check_module.h"
10+#endif
11
12 typedef struct {
13     uint32_t                            hash;
14@@ -235,6 +238,14 @@
15             goto next;
16         }
17
18+#if (NGX_HTTP_UPSTREAM_CHECK)
19+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
20+                       "get hash peer, check_index: %ui", peer->check_index);
21+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
22+            goto next;
23+        }
24+#endif
25+
26         if (peer->max_fails
27             && peer->fails >= peer->max_fails
28             && now - peer->checked <= peer->fail_timeout)
29@@ -538,6 +549,15 @@
30                 continue;
31             }
32
33+#if (NGX_HTTP_UPSTREAM_CHECK)
34+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
35+                           "get consistent_hash peer, check_index: %ui",
36+                           peer->check_index);
37+            if (ngx_http_upstream_check_peer_down(peer->check_index)) {
38+                continue;
39+            }
40+#endif
41+
42             if (peer->server.len != server->len
43                 || ngx_strncmp(peer->server.data, server->data, server->len)
44                    != 0)
45diff -burN nginx-1.12.1_orig/src/http/modules/ngx_http_upstream_ip_hash_module.c nginx-1.12.1/src/http/modules/ngx_http_upstream_ip_hash_module.c
46--- nginx-1.12.1_orig/src/http/modules/ngx_http_upstream_ip_hash_module.c	2017-07-11 13:24:08.000000000 +0000
47+++ nginx-1.12.1/src/http/modules/ngx_http_upstream_ip_hash_module.c	2017-07-13 17:59:48.205692500 +0000
48@@ -9,6 +9,9 @@
49 #include <ngx_core.h>
50 #include <ngx_http.h>
51
52+#if (NGX_HTTP_UPSTREAM_CHECK)
53+#include "ngx_http_upstream_check_module.h"
54+#endif
55
56 typedef struct {
57     /* the round robin data must be first */
58@@ -205,6 +208,15 @@
59             goto next;
60         }
61
62+#if (NGX_HTTP_UPSTREAM_CHECK)
63+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
64+            "get ip_hash peer, check_index: %ui",
65+             peer->check_index);
66+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
67+            goto next;
68+        }
69+#endif
70+
71         if (peer->max_fails
72             && peer->fails >= peer->max_fails
73             && now - peer->checked <= peer->fail_timeout)
74diff -burN nginx-1.12.1_orig/src/http/modules/ngx_http_upstream_least_conn_module.c nginx-1.12.1/src/http/modules/ngx_http_upstream_least_conn_module.c
75--- nginx-1.12.1_orig/src/http/modules/ngx_http_upstream_least_conn_module.c	2017-07-11 13:24:08.000000000 +0000
76+++ nginx-1.12.1/src/http/modules/ngx_http_upstream_least_conn_module.c	2017-07-13 18:05:34.417398156 +0000
77@@ -9,6 +9,10 @@
78 #include <ngx_core.h>
79 #include <ngx_http.h>
80
81+#if (NGX_HTTP_UPSTREAM_CHECK)
82+#include "ngx_http_upstream_check_module.h"
83+#endif
84+
85
86 static ngx_int_t ngx_http_upstream_init_least_conn_peer(ngx_http_request_t *r,
87     ngx_http_upstream_srv_conf_t *us);
88@@ -147,6 +151,16 @@
89             continue;
90         }
91
92+#if (NGX_HTTP_UPSTREAM_CHECK)
93+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
94+                "get least_conn peer, check_index: %ui",
95+                peer->check_index);
96+
97+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
98+            continue;
99+        }
100+#endif
101+
102         if (peer->max_fails
103             && peer->fails >= peer->max_fails
104             && now - peer->checked <= peer->fail_timeout)
105@@ -202,6 +216,16 @@
106                 continue;
107             }
108
109+#if (NGX_HTTP_UPSTREAM_CHECK)
110+            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
111+                    "get least_conn peer, check_index: %ui",
112+                    peer->check_index);
113+
114+            if (ngx_http_upstream_check_peer_down(peer->check_index)) {
115+                continue;
116+            }
117+#endif
118+
119             if (peer->conns * best->weight != best->conns * peer->weight) {
120                 continue;
121             }
122diff -burN nginx-1.12.1_orig/src/http/ngx_http_upstream_round_robin.c nginx-1.12.1/src/http/ngx_http_upstream_round_robin.c
123--- nginx-1.12.1_orig/src/http/ngx_http_upstream_round_robin.c	2017-07-11 13:24:09.000000000 +0000
124+++ nginx-1.12.1/src/http/ngx_http_upstream_round_robin.c	2017-07-13 18:13:00.510764315 +0000
125@@ -9,6 +9,10 @@
126 #include <ngx_core.h>
127 #include <ngx_http.h>
128
129+#if (NGX_HTTP_UPSTREAM_CHECK)
130+#include "ngx_http_upstream_check_module.h"
131+#endif
132+
133
134 #define ngx_http_upstream_tries(p) ((p)->number                               \
135                                     + ((p)->next ? (p)->next->number : 0))
136@@ -98,6 +102,15 @@
137                 peer[n].down = server[i].down;
138                 peer[n].server = server[i].name;
139
140+#if (NGX_HTTP_UPSTREAM_CHECK)
141+                if (!server[i].down) {
142+                    peer[n].check_index =
143+                        ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]);
144+                } else {
145+                    peer[n].check_index = (ngx_uint_t) NGX_ERROR;
146+                }
147+#endif
148+
149                 *peerp = &peer[n];
150                 peerp = &peer[n].next;
151                 n++;
152@@ -162,6 +175,16 @@
153                 peer[n].down = server[i].down;
154                 peer[n].server = server[i].name;
155
156+#if (NGX_HTTP_UPSTREAM_CHECK)
157+                if (!server[i].down) {
158+                    peer[n].check_index =
159+                        ngx_http_upstream_check_add_peer(cf, us, &server[i].addrs[j]);
160+                }
161+                else {
162+                    peer[n].check_index = (ngx_uint_t) NGX_ERROR;
163+                }
164+#endif
165+
166                 *peerp = &peer[n];
167                 peerp = &peer[n].next;
168                 n++;
169@@ -228,6 +251,9 @@
170         peer[i].max_conns = 0;
171         peer[i].max_fails = 1;
172         peer[i].fail_timeout = 10;
173+#if (NGX_HTTP_UPSTREAM_CHECK)
174+        peer[i].check_index = (ngx_uint_t) NGX_ERROR;
175+#endif
176         *peerp = &peer[i];
177         peerp = &peer[i].next;
178     }
179@@ -344,6 +370,9 @@
180         peer[0].max_conns = 0;
181         peer[0].max_fails = 1;
182         peer[0].fail_timeout = 10;
183+#if (NGX_HTTP_UPSTREAM_CHECK)
184+        peer[0].check_index = (ngx_uint_t) NGX_ERROR;
185+#endif
186         peers->peer = peer;
187
188     } else {
189@@ -378,6 +407,9 @@
190             peer[i].max_conns = 0;
191             peer[i].max_fails = 1;
192             peer[i].fail_timeout = 10;
193+#if (NGX_HTTP_UPSTREAM_CHECK)
194+            peer[i].check_index = (ngx_uint_t) NGX_ERROR;
195+#endif
196             *peerp = &peer[i];
197             peerp = &peer[i].next;
198         }
199@@ -443,6 +475,12 @@
200             goto failed;
201         }
202
203+#if (NGX_HTTP_UPSTREAM_CHECK)
204+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
205+            goto failed;
206+        }
207+#endif
208+
209         rrp->current = peer;
210
211     } else {
212@@ -537,6 +575,12 @@
213             continue;
214         }
215
216+#if (NGX_HTTP_UPSTREAM_CHECK)
217+        if (ngx_http_upstream_check_peer_down(peer->check_index)) {
218+            continue;
219+        }
220+#endif
221+
222         if (peer->max_fails
223             && peer->fails >= peer->max_fails
224             && now - peer->checked <= peer->fail_timeout)
225diff -burN nginx-1.12.1_orig/src/http/ngx_http_upstream_round_robin.h nginx-1.12.1/src/http/ngx_http_upstream_round_robin.h
226--- nginx-1.12.1_orig/src/http/ngx_http_upstream_round_robin.h	2017-07-11 13:24:09.000000000 +0000
227+++ nginx-1.12.1/src/http/ngx_http_upstream_round_robin.h	2017-07-13 18:13:30.254055435 +0000
228@@ -38,6 +38,10 @@
229     ngx_msec_t                      slow_start;
230     ngx_msec_t                      start_time;
231
232+#if (NGX_HTTP_UPSTREAM_CHECK)
233+    ngx_uint_t                      check_index;
234+#endif
235+
236     ngx_uint_t                      down;
237
238 #if (NGX_HTTP_SSL || NGX_COMPAT)
239