]> git.kaiwu.me - nginx.git/commitdiff
variable support for unix sockets in fastcgi_pass and proxy_pass
authorIgor Sysoev <igor@sysoev.ru>
Tue, 23 Dec 2008 19:35:12 +0000 (19:35 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Tue, 23 Dec 2008 19:35:12 +0000 (19:35 +0000)
src/http/modules/ngx_http_fastcgi_module.c
src/http/modules/ngx_http_proxy_module.c
src/http/ngx_http_upstream.c
src/http/ngx_http_upstream.h
src/http/ngx_http_upstream_round_robin.c

index 9579277415878ec2d832634c078f4a01c5d86422..6e4d956d82170efedd0e02f4e3d946d8e534aed4 100644 (file)
@@ -512,8 +512,16 @@ ngx_http_fastcgi_eval(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf)
         return NGX_ERROR;
     }
 
-    r->upstream->resolved->host = u.host;
-    r->upstream->resolved->port = u.port;
+    if (u.addrs[0].sockaddr) {
+        r->upstream->resolved->sockaddr = u.addrs[0].sockaddr;
+        r->upstream->resolved->socklen = u.addrs[0].socklen;
+        r->upstream->resolved->naddrs = 1;
+        r->upstream->resolved->host = u.addrs[0].name;
+
+    } else {
+        r->upstream->resolved->host = u.host;
+        r->upstream->resolved->port = u.port;
+    }
 
     return NGX_OK;
 }
index 2cf009bd9eddb51bac1dda41f9223cddb12781bb..2bf58ab68b443f5f451a362fa799c763d24a024e 100644 (file)
@@ -614,10 +614,18 @@ ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,
         return NGX_ERROR;
     }
 
-    r->upstream->resolved->host = u.host;
-    r->upstream->resolved->port = (in_port_t) (u.no_port ? u.default_port:
-                                                           u.port);
-    r->upstream->resolved->no_port = u.no_port;
+    if (u.addrs[0].sockaddr) {
+        r->upstream->resolved->sockaddr = u.addrs[0].sockaddr;
+        r->upstream->resolved->socklen = u.addrs[0].socklen;
+        r->upstream->resolved->naddrs = 1;
+        r->upstream->resolved->host = u.addrs[0].name;
+
+    } else {
+        r->upstream->resolved->host = u.host;
+        r->upstream->resolved->port = (in_port_t) (u.no_port ? u.default_port:
+                                                               u.port);
+        r->upstream->resolved->no_port = u.no_port;
+    }
 
     return NGX_OK;
 }
index 9a96a1e3cf026fed334ee4e048d93da67ba6bec5..f567a438e3e11063e5aacd3e195ed9d3a32ae417 100644 (file)
@@ -414,6 +414,20 @@ ngx_http_upstream_init(ngx_http_request_t *r)
 
     } else {
 
+        if (u->resolved->sockaddr) {
+
+            if (ngx_http_upstream_create_round_robin_peer(r, u->resolved)
+                != NGX_OK)
+            {
+                ngx_http_finalize_request(r, 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);
index b6f2161d4f046f61e24f4415e72ce79f93e6a4e0..3c141276da12bc3a7e139f6803aa384755eb3bd8 100644 (file)
@@ -209,8 +209,13 @@ typedef struct {
     ngx_str_t                       host;
     in_port_t                       port;
     ngx_uint_t                      no_port; /* unsigned  no_port:1 */
+
     ngx_uint_t                      naddrs;
     in_addr_t                      *addrs;
+
+    struct sockaddr                *sockaddr;
+    socklen_t                       socklen;
+
     ngx_resolver_ctx_t             *ctx;
 } ngx_http_upstream_resolved_t;
 
index 2479baa7876b001a1dc3c8cbc7044d883a0fad43..52bd80858d172156330b148af14bba3779a5bbf9 100644 (file)
@@ -279,35 +279,47 @@ ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
     peers->number = ur->naddrs;
     peers->name = &ur->host;
 
-    for (i = 0; i < ur->naddrs; i++) {
+    if (ur->sockaddr) {
+        peers->peer[0].sockaddr = ur->sockaddr;
+        peers->peer[0].socklen = ur->socklen;
+        peers->peer[0].name = ur->host;
+        peers->peer[0].weight = 1;
+        peers->peer[0].current_weight = 1;
+        peers->peer[0].max_fails = 1;
+        peers->peer[0].fail_timeout = 10;
 
-        len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
+    } else {
 
-        p = ngx_pnalloc(r->pool, len);
-        if (p == NULL) {
-            return NGX_ERROR;
-        }
+        for (i = 0; i < ur->naddrs; i++) {
 
-        len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
-        len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
+            len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
 
-        sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in));
-        if (sin == NULL) {
-            return NGX_ERROR;
-        }
+            p = ngx_pnalloc(r->pool, len);
+            if (p == NULL) {
+                return NGX_ERROR;
+            }
 
-        sin->sin_family = AF_INET;
-        sin->sin_port = htons(ur->port);
-        sin->sin_addr.s_addr = ur->addrs[i];
+            len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN);
+            len = ngx_sprintf(&p[len], ":%d", ur->port) - p;
 
-        peers->peer[i].sockaddr = (struct sockaddr *) sin;
-        peers->peer[i].socklen = sizeof(struct sockaddr_in);
-        peers->peer[i].name.len = len;
-        peers->peer[i].name.data = p;
-        peers->peer[i].weight = 1;
-        peers->peer[i].current_weight = 1;
-        peers->peer[i].max_fails = 1;
-        peers->peer[i].fail_timeout = 10;
+            sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in));
+            if (sin == NULL) {
+                return NGX_ERROR;
+            }
+
+            sin->sin_family = AF_INET;
+            sin->sin_port = htons(ur->port);
+            sin->sin_addr.s_addr = ur->addrs[i];
+
+            peers->peer[i].sockaddr = (struct sockaddr *) sin;
+            peers->peer[i].socklen = sizeof(struct sockaddr_in);
+            peers->peer[i].name.len = len;
+            peers->peer[i].name.data = p;
+            peers->peer[i].weight = 1;
+            peers->peer[i].current_weight = 1;
+            peers->peer[i].max_fails = 1;
+            peers->peer[i].fail_timeout = 10;
+        }
     }
 
     rrp->peers = peers;