diff options
Diffstat (limited to 'src/http/modules')
| -rw-r--r-- | src/http/modules/ngx_http_upstream_keepalive_module.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/http/modules/ngx_http_upstream_keepalive_module.c b/src/http/modules/ngx_http_upstream_keepalive_module.c index 8858922a0..11875ded8 100644 --- a/src/http/modules/ngx_http_upstream_keepalive_module.c +++ b/src/http/modules/ngx_http_upstream_keepalive_module.c @@ -22,6 +22,8 @@ typedef struct { ngx_http_upstream_init_pt original_init_upstream; ngx_http_upstream_init_peer_pt original_init_peer; + ngx_uint_t local; /* unsigned local:1; */ + } ngx_http_upstream_keepalive_srv_conf_t; @@ -34,6 +36,8 @@ typedef struct { socklen_t socklen; ngx_sockaddr_t sockaddr; + ngx_http_upstream_conf_t *tag; + } ngx_http_upstream_keepalive_cache_t; @@ -86,7 +90,7 @@ static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, static ngx_command_t ngx_http_upstream_keepalive_commands[] = { { ngx_string("keepalive"), - NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1, + NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12, ngx_http_upstream_keepalive, NGX_HTTP_SRV_CONF_OFFSET, 0, @@ -274,6 +278,10 @@ ngx_http_upstream_get_keepalive_peer(ngx_peer_connection_t *pc, void *data) item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, queue); c = item->connection; + if (kp->conf->local && item->tag != kp->upstream->conf) { + continue; + } + if (ngx_memn2cmp((u_char *) &item->sockaddr, (u_char *) pc->sockaddr, item->socklen, pc->socklen) == 0) @@ -387,6 +395,7 @@ ngx_http_upstream_free_keepalive_peer(ngx_peer_connection_t *pc, void *data, ngx_queue_insert_head(&kp->conf->cache, q); item->connection = c; + item->tag = u->conf; pc->connection = NULL; @@ -544,6 +553,7 @@ ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf) * conf->original_init_upstream = NULL; * conf->original_init_peer = NULL; * conf->max_cached = 0; + * conf->local = 0; */ conf->time = NGX_CONF_UNSET_MSEC; @@ -582,6 +592,17 @@ ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) kcf->max_cached = n; + if (cf->args->nelts == 3) { + if (ngx_strncmp(value[2].data, "local", 5) == 0) { + kcf->local = 1; + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter \"%V\"", &value[2]); + return NGX_CONF_ERROR; + } + } + /* init upstream handler */ uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module); |
