Mercurial > hg > nginx
changeset 2422:7af1e5fe102c
variable support for unix sockets in fastcgi_pass and proxy_pass
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 23 Dec 2008 19:35:12 +0000 |
parents | 8f0f1d151f14 |
children | 5bdb1591d37f |
files | 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 |
diffstat | 5 files changed, 77 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_fastcgi_module.c Tue Dec 23 17:25:46 2008 +0000 +++ b/src/http/modules/ngx_http_fastcgi_module.c Tue Dec 23 19:35:12 2008 +0000 @@ -512,8 +512,16 @@ 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; }
--- a/src/http/modules/ngx_http_proxy_module.c Tue Dec 23 17:25:46 2008 +0000 +++ b/src/http/modules/ngx_http_proxy_module.c Tue Dec 23 19:35:12 2008 +0000 @@ -614,10 +614,18 @@ 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; }
--- a/src/http/ngx_http_upstream.c Tue Dec 23 17:25:46 2008 +0000 +++ b/src/http/ngx_http_upstream.c Tue Dec 23 19:35:12 2008 +0000 @@ -414,6 +414,20 @@ } 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);
--- a/src/http/ngx_http_upstream.h Tue Dec 23 17:25:46 2008 +0000 +++ b/src/http/ngx_http_upstream.h Tue Dec 23 19:35:12 2008 +0000 @@ -209,8 +209,13 @@ 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;
--- a/src/http/ngx_http_upstream_round_robin.c Tue Dec 23 17:25:46 2008 +0000 +++ b/src/http/ngx_http_upstream_round_robin.c Tue Dec 23 19:35:12 2008 +0000 @@ -279,35 +279,47 @@ peers->number = ur->naddrs; peers->name = &ur->host; - for (i = 0; i < ur->naddrs; i++) { - - len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1; + 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; - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } + } else { + + 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; + + p = ngx_pnalloc(r->pool, len); + if (p == NULL) { + return NGX_ERROR; + } - sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in)); - if (sin == NULL) { - return NGX_ERROR; - } + len = ngx_inet_ntop(AF_INET, &ur->addrs[i], p, NGX_INET_ADDRSTRLEN); + len = ngx_sprintf(&p[len], ":%d", ur->port) - p; - sin->sin_family = AF_INET; - sin->sin_port = htons(ur->port); - sin->sin_addr.s_addr = ur->addrs[i]; + sin = ngx_pcalloc(r->pool, sizeof(struct sockaddr_in)); + if (sin == NULL) { + return NGX_ERROR; + } - 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->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;