changeset 7340:70c6b08973a0

Upstream keepalive: keepalive_requests directive. The directive configures maximum number of requests allowed on a connection kept in the cache. Once a connection reaches the number of requests configured, it is no longer saved to the cache. The default is 100. Much like keepalive_requests for client connections, this is mostly a safeguard to make sure connections are closed periodically and the memory allocated from the connection pool is freed.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 10 Aug 2018 21:54:46 +0300
parents d9029e113a05
children 15ea84e65d07
files src/http/modules/ngx_http_upstream_keepalive_module.c src/http/ngx_http_upstream.c
diffstat 2 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/http/modules/ngx_http_upstream_keepalive_module.c
+++ b/src/http/modules/ngx_http_upstream_keepalive_module.c
@@ -12,6 +12,7 @@
 
 typedef struct {
     ngx_uint_t                         max_cached;
+    ngx_uint_t                         requests;
     ngx_msec_t                         timeout;
 
     ngx_queue_t                        cache;
@@ -92,6 +93,13 @@ static ngx_command_t  ngx_http_upstream_
       offsetof(ngx_http_upstream_keepalive_srv_conf_t, timeout),
       NULL },
 
+    { ngx_string("keepalive_requests"),
+      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_num_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_upstream_keepalive_srv_conf_t, requests),
+      NULL },
+
       ngx_null_command
 };
 
@@ -142,6 +150,7 @@ ngx_http_upstream_init_keepalive(ngx_con
                                           ngx_http_upstream_keepalive_module);
 
     ngx_conf_init_msec_value(kcf->timeout, 60000);
+    ngx_conf_init_uint_value(kcf->requests, 100);
 
     if (kcf->original_init_upstream(cf, us) != NGX_OK) {
         return NGX_ERROR;
@@ -312,6 +321,10 @@ ngx_http_upstream_free_keepalive_peer(ng
         goto invalid;
     }
 
+    if (c->requests >= kp->conf->requests) {
+        goto invalid;
+    }
+
     if (!u->keepalive) {
         goto invalid;
     }
@@ -500,6 +513,7 @@ ngx_http_upstream_keepalive_create_conf(
      */
 
     conf->timeout = NGX_CONF_UNSET_MSEC;
+    conf->requests = NGX_CONF_UNSET_UINT;
 
     return conf;
 }
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -1546,6 +1546,8 @@ ngx_http_upstream_connect(ngx_http_reque
 
     c = u->peer.connection;
 
+    c->requests++;
+
     c->data = r;
 
     c->write->handler = ngx_http_upstream_handler;