Welcome! Log In Create A New Profile

Advanced

PATCH Upstream: new "keepalive_max_connection_duration" directive

Jussi Maki
April 07, 2021 01:52PM
# HG changeset patch
# User Jussi Maki <jusmaki at gmail.com>
# Date 1617816597 -10800
# Wed Apr 07 20:29:57 2021 +0300
# Node ID 3699288ff20a3e51ee4b7689898ce0241f64f0f5
# Parent e2e9e0fae74734b28974c64daacc492d751b4781
Upstream: new "keepalive_max_connection_duration" directive

Added a new keepalive_max_connection duration which provides
the time in milliseconds for the upstream block on how long
the connection should be kept connected. The current keepalive
directives either define the idle time or the number of requests
but there is no elapsed time-based parameter.

The elapsed time-based connection parameter is useful in a case
when there are multiple backends and the connection should be
evenly load balanced to them and the response times for upstream
requests vary.

diff -r e2e9e0fae747 -r 3699288ff20a src/core/ngx_connection.h
--- a/src/core/ngx_connection.h Mon Apr 05 20:14:16 2021 +0300
+++ b/src/core/ngx_connection.h Wed Apr 07 20:29:57 2021 +0300
@@ -191,6 +191,8 @@
#if (NGX_THREADS || NGX_COMPAT)
ngx_thread_task_t *sendfile_task;
#endif
+
+ ngx_msec_t connection_started_time;
};


diff -r e2e9e0fae747 -r 3699288ff20a
src/http/modules/ngx_http_upstream_keepalive_module.c
--- a/src/http/modules/ngx_http_upstream_keepalive_module.c Mon Apr 05
20:14:16 2021 +0300
+++ b/src/http/modules/ngx_http_upstream_keepalive_module.c Wed Apr 07
20:29:57 2021 +0300
@@ -14,6 +14,7 @@
ngx_uint_t max_cached;
ngx_uint_t requests;
ngx_msec_t timeout;
+ ngx_msec_t duration;

ngx_queue_t cache;
ngx_queue_t free;
@@ -100,6 +101,13 @@
offsetof(ngx_http_upstream_keepalive_srv_conf_t, requests),
NULL },

+ { ngx_string("keepalive_max_connection_duration"),
+ 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, duration),
+ NULL },
+
ngx_null_command
};
@@ -387,7 +395,13 @@
item->socklen = pc->socklen;
ngx_memcpy(&item->sockaddr, pc->sockaddr, pc->socklen);

- if (c->read->ready) {
+ if (kp->conf->duration != NGX_CONF_UNSET_MSEC &&
+ ngx_current_msec - c->connection_started_time > kp->conf->duration)
{
+ ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
+ "free keepalive peer: expired connection %p", c);
+ c->close = 1;
+ }
+ if (c->close || c->read->ready) {
ngx_http_upstream_keepalive_close_handler(c->read);
}

@@ -515,6 +529,7 @@

conf->timeout = NGX_CONF_UNSET_MSEC;
conf->requests = NGX_CONF_UNSET_UINT;
+ conf->duration = NGX_CONF_UNSET_MSEC;

return conf;
}
diff -r e2e9e0fae747 -r 3699288ff20a src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c Mon Apr 05 20:14:16 2021 +0300
+++ b/src/http/ngx_http_upstream.c Wed Apr 07 20:29:57 2021 +0300
@@ -2017,6 +2017,10 @@
u->state->connect_time = ngx_current_msec - u->start_time;
}

+ if (!c->connection_started_time) {
+ c->connection_started_time = ngx_current_msec;
+ }
+
if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) {
ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR);
return;
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

PATCH Upstream: new "keepalive_max_connection_duration" directive

Jussi Maki 65 April 07, 2021 01:52PM

Re: PATCH Upstream: new "keepalive_max_connection_duration" directive

Maxim Dounin 11 April 07, 2021 07:08PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 61
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready