[nginx] Upstream keepalive: keepalive_timeout directive.

Maxim Dounin mdounin at mdounin.ru
Fri Aug 10 20:02:48 UTC 2018


details:   http://hg.nginx.org/nginx/rev/d9029e113a05
branches:  
changeset: 7339:d9029e113a05
user:      Maxim Dounin <mdounin at mdounin.ru>
date:      Fri Aug 10 21:54:23 2018 +0300
description:
Upstream keepalive: keepalive_timeout directive.

The directive configures maximum time a connection can be kept in the
cache.  By configuring a time which is smaller than the corresponding
timeout on the backend side one can avoid the race between closing
a connection by the backend and nginx trying to use the same connection
to send a request at the same time.

diffstat:

 src/http/modules/ngx_http_upstream_keepalive_module.c |  25 +++++++++++++++---
 1 files changed, 20 insertions(+), 5 deletions(-)

diffs (77 lines):

diff --git a/src/http/modules/ngx_http_upstream_keepalive_module.c b/src/http/modules/ngx_http_upstream_keepalive_module.c
--- 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_msec_t                         timeout;
 
     ngx_queue_t                        cache;
     ngx_queue_t                        free;
@@ -84,6 +85,13 @@ static ngx_command_t  ngx_http_upstream_
       0,
       NULL },
 
+    { ngx_string("keepalive_timeout"),
+      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_msec_slot,
+      NGX_HTTP_SRV_CONF_OFFSET,
+      offsetof(ngx_http_upstream_keepalive_srv_conf_t, timeout),
+      NULL },
+
       ngx_null_command
 };
 
@@ -133,6 +141,8 @@ ngx_http_upstream_init_keepalive(ngx_con
     kcf = ngx_http_conf_upstream_srv_conf(us,
                                           ngx_http_upstream_keepalive_module);
 
+    ngx_conf_init_msec_value(kcf->timeout, 60000);
+
     if (kcf->original_init_upstream(cf, us) != NGX_OK) {
         return NGX_ERROR;
     }
@@ -261,6 +271,10 @@ found:
     c->write->log = pc->log;
     c->pool->log = pc->log;
 
+    if (c->read->timer_set) {
+        ngx_del_timer(c->read);
+    }
+
     pc->connection = c;
     pc->cached = 1;
 
@@ -339,10 +353,9 @@ ngx_http_upstream_free_keepalive_peer(ng
 
     pc->connection = NULL;
 
-    if (c->read->timer_set) {
-        c->read->delayed = 0;
-        ngx_del_timer(c->read);
-    }
+    c->read->delayed = 0;
+    ngx_add_timer(c->read, kp->conf->timeout);
+
     if (c->write->timer_set) {
         ngx_del_timer(c->write);
     }
@@ -393,7 +406,7 @@ ngx_http_upstream_keepalive_close_handle
 
     c = ev->data;
 
-    if (c->close) {
+    if (c->close || c->read->timedout) {
         goto close;
     }
 
@@ -486,6 +499,8 @@ ngx_http_upstream_keepalive_create_conf(
      *     conf->max_cached = 0;
      */
 
+    conf->timeout = NGX_CONF_UNSET_MSEC;
+
     return conf;
 }
 


More information about the nginx-devel mailing list