<div dir="ltr"><div><br></div><div># HG changeset patch<br># User Sunggon Song <<a href="mailto:sunggon.song@quantil.com">sunggon.song@quantil.com</a>><br># Date 1721178360 -32400<br>#      Wed Jul 17 10:06:00 2024 +0900<br># Node ID 3db2df01147dcbcc7bc63670207a0aa2439f6a8c<br># Parent  072ca4906154effb64cbf8209dfe86742ff074d7<br>[PATCH] Delayed closing of idle connections<br><br>Delays processing of closing idle connection to read unread requests<br>while nginx performs a graceful shutdown.<br>This is the case where the client sent the request message<br>through the keepalive(idle) connection, but nginx has not yet read it<br>from the socket recv buffer.<br>If there is no delay time and there are some unread requests<br>in the socket recv buffer, the idle connection is immediately closed<br>and a TCP reset is sent to the client by the TCP stack of the kernel.<br><br>diff -r 072ca4906154 -r 3db2df01147d src/core/nginx.c<br>--- a/src/core/nginx.c     Thu Jun 27 17:29:56 2024 +0400<br>+++ b/src/core/nginx.c  Wed Jul 17 10:06:00 2024 +0900<br>@@ -153,6 +153,13 @@<br>       0,<br>       NULL },<br> <br>+    { ngx_string("close_idle_connections_delay"),<br>+      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,<br>+      ngx_conf_set_close_idle_connecions_delay,<br>+      0,<br>+      offsetof(ngx_core_conf_t, close_idle_connections_delay),<br>+      NULL },<br>+<br>       ngx_null_command<br> };<br> <br>@@ -1125,6 +1132,8 @@<br>     ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;<br>     ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT;<br> <br>+    ccf->close_idle_connections_delay = NGX_CONF_UNSET;<br>+<br>     if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t))<br>         != NGX_OK)<br>     {<br>@@ -1148,6 +1157,8 @@<br>     ngx_conf_init_value(ccf->worker_processes, 1);<br>     ngx_conf_init_value(ccf->debug_points, 0);<br> <br>+    ngx_conf_init_value(ccf->close_idle_connections_delay, 0);<br>+<br> #if (NGX_HAVE_CPU_AFFINITY)<br> <br>     if (!ccf->cpu_affinity_auto<br>diff -r 072ca4906154 -r 3db2df01147d src/core/ngx_conf_file.c<br>--- a/src/core/ngx_conf_file.c       Thu Jun 27 17:29:56 2024 +0400<br>+++ b/src/core/ngx_conf_file.c  Wed Jul 17 10:06:00 2024 +0900<br>@@ -1484,3 +1484,31 @@<br> <br>     return NGX_CONF_ERROR;<br> }<br>+<br>+char *<br>+ngx_conf_set_close_idle_connecions_delay(ngx_conf_t *cf, ngx_command_t *cmd,<br>+        void *conf)<br>+{<br>+    char  *p = conf;<br>+<br>+    time_t           *sp;<br>+    ngx_str_t        *value;<br>+<br>+    sp = (time_t *) (p + cmd->offset);<br>+    if (*sp != NGX_CONF_UNSET) {<br>+        return "is duplicate";<br>+    }<br>+<br>+    value = cf->args->elts;<br>+<br>+    *sp = ngx_parse_time(&value[1], 1);<br>+<br>+    if (*sp == (time_t) NGX_ERROR) {<br>+        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,<br>+                    "invalid value \"%s\"", value[i].data);<br>+<br>+        return NGX_CONF_ERROR;<br>+    }<br>+<br>+    return NGX_CONF_OK;<br>+}<br>diff -r 072ca4906154 -r 3db2df01147d src/core/ngx_conf_file.h<br>--- a/src/core/ngx_conf_file.h     Thu Jun 27 17:29:56 2024 +0400<br>+++ b/src/core/ngx_conf_file.h  Wed Jul 17 10:06:00 2024 +0900<br>@@ -290,6 +290,7 @@<br> char *ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);<br> char *ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);<br> char *ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);<br>-<br>+char *ngx_conf_set_close_idle_connecions_delay(ngx_conf_t *cf,<br>+    ngx_command_t *cmd, void *conf);<br> <br> #endif /* _NGX_CONF_FILE_H_INCLUDED_ */<br>diff -r 072ca4906154 -r 3db2df01147d src/core/ngx_cycle.h<br>--- a/src/core/ngx_cycle.h    Thu Jun 27 17:29:56 2024 +0400<br>+++ b/src/core/ngx_cycle.h      Wed Jul 17 10:06:00 2024 +0900<br>@@ -118,6 +118,8 @@<br>     ngx_array_t               env;<br>     char                    **environment;<br> <br>+    time_t                    close_idle_connections_delay;<br>+<br>     ngx_uint_t                transparent;  /* unsigned  transparent:1; */<br> } ngx_core_conf_t;<br> <br>diff -r 072ca4906154 -r 3db2df01147d src/os/unix/ngx_process_cycle.c<br>--- a/src/os/unix/ngx_process_cycle.c  Thu Jun 27 17:29:56 2024 +0400<br>+++ b/src/os/unix/ngx_process_cycle.c   Wed Jul 17 10:06:00 2024 +0900<br>@@ -51,6 +51,7 @@<br> sig_atomic_t  ngx_noaccept;<br> ngx_uint_t    ngx_noaccepting;<br> ngx_uint_t    ngx_restart;<br>+ngx_uint_t    ngx_delayed_close_done;<br> <br> <br> static u_char  master_process[] = "master process";<br>@@ -698,6 +699,9 @@<br> static void<br> ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)<br> {<br>+    time_t            now;<br>+    ngx_core_conf_t  *ccf;<br>+    time_t            delay_sec;<br>     ngx_int_t worker = (intptr_t) data;<br> <br>     ngx_process = NGX_PROCESS_WORKER;<br>@@ -706,10 +710,26 @@<br>     ngx_worker_process_init(cycle, worker);<br> <br>     ngx_setproctitle("worker process");<br>+    delay_sec = 0;<br>+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);<br> <br>     for ( ;; ) {<br> <br>         if (ngx_exiting) {<br>+            now = ngx_time();<br>+            if (ccf->close_idle_connections_delay &&<br>+                    !ngx_delayed_close_done)<br>+            {<br>+<br>+                if (!delay_sec) {<br>+                    delay_sec = now + ccf->close_idle_connections_delay;<br>+                } else {<br>+                    if (delay_sec < now) {<br>+                        ngx_close_idle_connections(cycle);<br>+                        ngx_delayed_close_done = 1;<br>+                    }<br>+                }<br>+            }<br>             if (ngx_event_no_timers_left() == NGX_OK) {<br>                 ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");<br>                 ngx_worker_process_exit(cycle);<br>@@ -735,7 +755,9 @@<br>                 ngx_exiting = 1;<br>                 ngx_set_shutdown_timer(cycle);<br>                 ngx_close_listening_sockets(cycle);<br>-                ngx_close_idle_connections(cycle);<br>+                if (!ccf->close_idle_connections_delay) {<br>+                    ngx_close_idle_connections(cycle);<br>+                }<br>                 ngx_event_process_posted(cycle, &ngx_posted_events);<br>             }<br>         }<br>@@ -941,6 +963,16 @@<br> {<br>     ngx_uint_t         i;<br>     ngx_connection_t  *c;<br>+    ngx_core_conf_t   *ccf;<br>+<br>+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);<br>+<br>+    if (ccf->close_idle_connections_delay &&<br>+            !ngx_delayed_close_done)<br>+    {<br>+        ngx_close_idle_connections(cycle);<br>+        ngx_delayed_close_done = 1;<br>+    }<br> <br>     for (i = 0; cycle->modules[i]; i++) {<br>         if (cycle->modules[i]->exit_process) {<br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>Best Regards and thanks, <br></div><div>Sunggon<br></div><div><span style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);display:inline;float:none">---------------------------------------------------------------------</span><br style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)"><span style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);display:inline;float:none">Sunggon Song I Principal Research Engineer<span> </span></span><br style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)"><span style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);display:inline;float:none">Cache Team</span><br style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)"><span style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);display:inline;float:none">Office. 82-2-3441-0375    Cell. 82-10-8744-0133</span><br style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)"><span style="color:rgb(0,0,0);font-family:Calibri,Arial,Helvetica,sans-serif,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols,EmojiFont,"Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols;font-size:13.3333px;font-style:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);display:inline;float:none">E-mail. <a href="mailto:sunggon.song@cdnetworks.co.kr" target="_blank">sunggon.song@cdnetworks.co.kr</a>, </span><span><span><a href="mailto:sunggon.song@quantil.com" target="_blank">sunggon.song@quantil.com</a></span></span></div></div></div></div></div></div></div></div></div></div></div>