]> git.kaiwu.me - nginx.git/commitdiff
Upstream: do not unnecessarily create per-request upstreams.
authorRuslan Ermilov <ru@nginx.com>
Mon, 31 Oct 2016 15:33:36 +0000 (18:33 +0300)
committerRuslan Ermilov <ru@nginx.com>
Mon, 31 Oct 2016 15:33:36 +0000 (18:33 +0300)
If proxy_pass (and friends) with variables evaluates an upstream
specified with literal address, nginx always created a per-request
upstream.

Now, if there's a matching upstream specified in the configuration
(either implicit or explicit), it will be used instead.

src/http/ngx_http_upstream.c
src/stream/ngx_stream_proxy_module.c

index 55a62ef8bd87d40966b77fb672ee6a17332758eb..55bd47d02bb1735117d0503b80a3b1ba8196173a 100644 (file)
@@ -654,6 +654,23 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
 
         host = &u->resolved->host;
 
+        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
+
+        uscfp = umcf->upstreams.elts;
+
+        for (i = 0; i < umcf->upstreams.nelts; i++) {
+
+            uscf = uscfp[i];
+
+            if (uscf->host.len == host->len
+                && ((uscf->port == 0 && u->resolved->no_port)
+                     || uscf->port == u->resolved->port)
+                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)
+            {
+                goto found;
+            }
+        }
+
         if (u->resolved->sockaddr) {
 
             if (u->resolved->port == 0
@@ -679,23 +696,6 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
             return;
         }
 
-        umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
-
-        uscfp = umcf->upstreams.elts;
-
-        for (i = 0; i < umcf->upstreams.nelts; i++) {
-
-            uscf = uscfp[i];
-
-            if (uscf->host.len == host->len
-                && ((uscf->port == 0 && u->resolved->no_port)
-                     || uscf->port == u->resolved->port)
-                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)
-            {
-                goto found;
-            }
-        }
-
         if (u->resolved->port == 0) {
             ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                           "no port in upstream \"%V\"", host);
index 4af907c233eab5cf991367464d7dc080bd66fcb7..c03b515057d175b0a3b79a8667d8e5d695009584 100644 (file)
@@ -433,6 +433,23 @@ ngx_stream_proxy_handler(ngx_stream_session_t *s)
 
         host = &u->resolved->host;
 
+        umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module);
+
+        uscfp = umcf->upstreams.elts;
+
+        for (i = 0; i < umcf->upstreams.nelts; i++) {
+
+            uscf = uscfp[i];
+
+            if (uscf->host.len == host->len
+                && ((uscf->port == 0 && u->resolved->no_port)
+                     || uscf->port == u->resolved->port)
+                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)
+            {
+                goto found;
+            }
+        }
+
         if (u->resolved->sockaddr) {
 
             if (u->resolved->port == 0
@@ -456,23 +473,6 @@ ngx_stream_proxy_handler(ngx_stream_session_t *s)
             return;
         }
 
-        umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module);
-
-        uscfp = umcf->upstreams.elts;
-
-        for (i = 0; i < umcf->upstreams.nelts; i++) {
-
-            uscf = uscfp[i];
-
-            if (uscf->host.len == host->len
-                && ((uscf->port == 0 && u->resolved->no_port)
-                     || uscf->port == u->resolved->port)
-                && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0)
-            {
-                goto found;
-            }
-        }
-
         if (u->resolved->port == 0) {
             ngx_log_error(NGX_LOG_ERR, c->log, 0,
                           "no port in upstream \"%V\"", host);