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;
socklen_t socklen;
ngx_sockaddr_t sockaddr;
+ ngx_http_upstream_conf_t *tag;
+
} ngx_http_upstream_keepalive_cache_t;
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,
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)
ngx_queue_insert_head(&kp->conf->cache, q);
item->connection = c;
+ item->tag = u->conf;
pc->connection = NULL;
* conf->original_init_upstream = NULL;
* conf->original_init_peer = NULL;
* conf->max_cached = 0;
+ * conf->local = 0;
*/
conf->time = NGX_CONF_UNSET_MSEC;
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);