From: Jim Jagielski Date: Thu, 14 Feb 2008 12:55:57 +0000 (+0000) Subject: Add in mod_jk's disablereuse analog for mod_proxy. X-Git-Tag: 2.3.0~970 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1858ec21313e1a37087613f5a7c278e23a665d8;p=apache Add in mod_jk's disablereuse analog for mod_proxy. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@627728 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 30a484b6f6..598479ce57 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,10 @@ Changes with Apache 2.3.0 [ When backported to 2.2.x, remove entry from this file ] + *) Added 'disablereuse' option for ProxyPass which, essentially, + disables connection pooling for the backend servers. + [Jim Jagielski] + *) Activate mod_cache, mod_file_cache and mod_disc_cache as part of the 'most' set for '--enable-modules' and '--enable-shared-mods'. Include mod_mem_cache in 'all' as well. [Dirk-Willem van Gulik] diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml index c9e933b7eb..f25640d736 100644 --- a/docs/manual/mod/mod_proxy.xml +++ b/docs/manual/mod/mod_proxy.xml @@ -693,6 +693,16 @@ expressions in the pool the Apache will return SERVER_BUSY status to the client. + disablereuse + Off + This parameter should be used when you want to force mod_proxy + to immediately close a connection to the backend after being used, and + thus, disable its persistant connection and pool for that backend. + This helps in various situations where a firewall between Apache and + the backend server (irregardless of protocol) tends to silently + drop connections. To prevent mod_proxy from reusing the backend connection, + set this property value to On. + flushpackets off Determines whether the proxy module will auto-flush the output diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 4afb9ca8aa..8ed42df24c 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -176,6 +176,15 @@ static const char *set_worker_param(apr_pool_t *p, return "KeepAlive must be On|Off"; worker->keepalive_set = 1; } + else if (!strcasecmp(key, "disablereuse")) { + if (!strcasecmp(val, "on")) + worker->disablereuse = 1; + else if (!strcasecmp(val, "off")) + worker->disablereuse = 0; + else + return "DisableReuse must be On|Off"; + worker->disablereuse_set = 1; + } else if (!strcasecmp(key, "route")) { /* Worker route. */ diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 34eafab44b..f13456415f 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -352,6 +352,8 @@ struct proxy_worker { char ping_timeout_set; int lbset; /* load balancer cluster set */ char retry_set; + char disablereuse; + char disablereuse_set; }; /* diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 448e327989..0a27b18c27 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1698,7 +1698,7 @@ static apr_status_t connection_cleanup(void *theconn) } /* determine if the connection need to be closed */ - if (conn->close || !worker->is_address_reusable) { + if (conn->close || !worker->is_address_reusable || worker->disablereuse) { apr_pool_t *p = conn->pool; apr_pool_clear(p); conn = apr_pcalloc(p, sizeof(proxy_conn_rec)); @@ -1902,8 +1902,13 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_worker(proxy_worker *worker, ser if (!worker->retry_set) { worker->retry = apr_time_from_sec(PROXY_WORKER_DEFAULT_RETRY); } - /* By default address is reusable */ - worker->is_address_reusable = 1; + /* By default address is reusable unless DisableReuse is set */ + if (worker->disablereuse) { + worker->is_address_reusable = 0; + } + else { + worker->is_address_reusable = 1; + } #if APR_HAS_THREADS ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads); @@ -2114,7 +2119,8 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, * * TODO: Handle this much better... */ - if (!conn->hostname || !worker->is_address_reusable || + if (!conn->hostname || !worker->is_address_reusable || + worker->disablereuse || (r->connection->keepalives && (r->proxyreq == PROXYREQ_PROXY || r->proxyreq == PROXYREQ_REVERSE) && (strcasecmp(conn->hostname, uri->hostname) != 0) ) ) {