[PATCH] Proxy: support configuration of socket buffer sizes

Karstens, Nate Nate.Karstens at garmin.com
Thu May 18 18:22:41 UTC 2017


Greetings,

I just wanted to follow up on this patch and make sure that the fraud detection notice or confidentiality notice added by my company wasn't precluding it from consideration.

Thanks!

Nate

-----Original Message-----
From: nginx-devel [mailto:nginx-devel-bounces at nginx.org] On Behalf Of Karstens, Nate
Sent: Sunday, April 30, 2017 12:19 PM
To: nginx-devel at nginx.org
Subject: [PATCH] Proxy: support configuration of socket buffer sizes

[This sender failed our fraud detection checks and may not be who they appear to be. Learn about spoofing at http://aka.ms/LearnAboutSpoofing]

# HG changeset patch
# User Nate Karstens <nate.karstens at garmin.com> # Date 1493467011 18000
#      Sat Apr 29 06:56:51 2017 -0500
# Node ID 1251a543804b17941b2c96b84bd1f4e58a37bc15
# Parent  8801ff7d58e1650c9d1abb50e09f5979e4f9ffbf
Proxy: support configuration of socket buffer sizes

Allows the size of the buffers used by the TCP sockets for HTTP proxy connections to be configured. The new configuration directives are:

 * proxy_socket_rcvbuf
 * proxy_socket_sndbuf

These correspond with the SO_RCVBUF and SO_SNDBUF socket options, respectively.

This is be useful in cases where the proxy processes received data slowly. Data was being buffered in three separate TCP buffers (nginx-from-client receive, nginx- to-proxy send, and proxy-from-nginx receive). The cumulative effect is that the client thinks it has sent all of the data, but times out waiting for a reply from the proxy, which cannot reply because it is still processing the data in its buffers.

Signed-off-by: Nate Karstens <nate.karstens at garmin.com>

diff -r 8801ff7d58e1 -r 1251a543804b src/event/ngx_event_connect.c
--- a/src/event/ngx_event_connect.c     Tue Apr 25 23:39:13 2017 +0300
+++ b/src/event/ngx_event_connect.c     Sat Apr 29 06:56:51 2017 -0500
@@ -73,6 +73,16 @@
         }
     }

+    if (pc->sndbuf) {
+        if (setsockopt(s, SOL_SOCKET, SO_SNDBUF,
+                       (const void *) &pc->sndbuf, sizeof(int)) == -1)
+        {
+            ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
+                          "setsockopt(SO_SNDBUF) failed");
+            goto failed;
+        }
+    }
+
     if (ngx_nonblocking(s) == -1) {
         ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
                       ngx_nonblocking_n " failed"); diff -r 8801ff7d58e1 -r 1251a543804b src/event/ngx_event_connect.h
--- a/src/event/ngx_event_connect.h     Tue Apr 25 23:39:13 2017 +0300
+++ b/src/event/ngx_event_connect.h     Sat Apr 29 06:56:51 2017 -0500
@@ -57,6 +57,7 @@

     int                              type;
     int                              rcvbuf;
+    int                              sndbuf;

     ngx_log_t                       *log;

diff -r 8801ff7d58e1 -r 1251a543804b src/http/modules/ngx_http_proxy_module.c
--- a/src/http/modules/ngx_http_proxy_module.c  Tue Apr 25 23:39:13 2017 +0300
+++ b/src/http/modules/ngx_http_proxy_module.c  Sat Apr 29 06:56:51 2017 
+++ -0500
@@ -90,6 +90,9 @@
     ngx_uint_t                     headers_hash_max_size;
     ngx_uint_t                     headers_hash_bucket_size;

+    ngx_int_t                      rcvbuf;
+    ngx_int_t                      sndbuf;
+
 #if (NGX_HTTP_SSL)
     ngx_uint_t                     ssl;
     ngx_uint_t                     ssl_protocols;
@@ -629,6 +632,20 @@
       offsetof(ngx_http_proxy_loc_conf_t, http_version),
       &ngx_http_proxy_http_version },

+    { ngx_string("proxy_socket_rcvbuf"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_num_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_proxy_loc_conf_t, rcvbuf),
+      NULL },
+
+    { ngx_string("proxy_socket_sndbuf"),
+      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_num_slot,
+      NGX_HTTP_LOC_CONF_OFFSET,
+      offsetof(ngx_http_proxy_loc_conf_t, sndbuf),
+      NULL },
+
 #if (NGX_HTTP_SSL)

     { ngx_string("proxy_ssl_session_reuse"),
@@ -905,6 +922,13 @@

     u->buffering = plcf->upstream.buffering;

+    if (plcf->rcvbuf != NGX_CONF_UNSET) {
+        u->peer.rcvbuf = plcf->rcvbuf;
+    }
+    if (plcf->sndbuf != NGX_CONF_UNSET) {
+        u->peer.sndbuf = plcf->sndbuf;
+    }
+
     u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));
     if (u->pipe == NULL) {
         return NGX_HTTP_INTERNAL_SERVER_ERROR; @@ -2902,6 +2926,9 @@
     conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;
     conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;

+    conf->rcvbuf = NGX_CONF_UNSET;
+    conf->sndbuf = NGX_CONF_UNSET;
+
     ngx_str_set(&conf->upstream.module, "proxy");

     return conf;
@@ -3297,6 +3324,12 @@
     ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,
                               prev->headers_hash_bucket_size, 64);

+    ngx_conf_merge_value(conf->rcvbuf,
+                         prev->rcvbuf, NGX_CONF_UNSET);
+
+    ngx_conf_merge_value(conf->sndbuf,
+                         prev->sndbuf, NGX_CONF_UNSET);
+
     conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,
                                                ngx_cacheline_size);


________________________________

CONFIDENTIALITY NOTICE: This email and any attachments are for the sole use of the intended recipient(s) and contain information that may be Garmin confidential and/or Garmin legally privileged. If you have received this email in error, please notify the sender by reply email and delete the message. Any disclosure, copying, distribution or use of this communication (including attachments) by someone other than the intended recipient is prohibited. Thank you.
_______________________________________________
nginx-devel mailing list
nginx-devel at nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


More information about the nginx-devel mailing list