diff --git a/docs/user-guide/nginx-configuration/annotations.md b/docs/user-guide/nginx-configuration/annotations.md index b05b98c66..501df6e67 100644 --- a/docs/user-guide/nginx-configuration/annotations.md +++ b/docs/user-guide/nginx-configuration/annotations.md @@ -80,6 +80,7 @@ You can add these Kubernetes annotations to specific Ingress objects to customiz |[nginx.ingress.kubernetes.io/upstream-vhost](#custom-nginx-upstream-vhost)|string| |[nginx.ingress.kubernetes.io/whitelist-source-range](#whitelist-source-range)|CIDR| |[nginx.ingress.kubernetes.io/proxy-buffering](#proxy-buffering)|string| +|[nginx.ingress.kubernetes.io/proxy-buffers-number](#proxy-buffers-number)|number| |[nginx.ingress.kubernetes.io/proxy-buffer-size](#proxy-buffer-size)|string| |[nginx.ingress.kubernetes.io/ssl-ciphers](#ssl-ciphers)|string| |[nginx.ingress.kubernetes.io/connection-proxy-header](#connection-proxy-header)|string| @@ -547,6 +548,16 @@ To use custom values in an Ingress rule define these annotation: nginx.ingress.kubernetes.io/proxy-buffering: "on" ``` +### Proxy buffers Number + +Sets the number of the buffers in [`proxy_buffers`](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers) used for reading the first part of the response received from the proxied server. +By default proxy buffers number is set as 4 + +To configure this setting globally, set `proxy-buffers-number` in [NGINX ConfigMap](./configmap.md#proxy-buffers-number). To use custom values in an Ingress rule, define this annotation: +```yaml +nginx.ingress.kubernetes.io/proxy-buffers-number: "4" +``` + ### Proxy buffer size Sets the size of the buffer [`proxy_buffer_size`](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size) used for reading the first part of the response received from the proxied server. diff --git a/docs/user-guide/nginx-configuration/configmap.md b/docs/user-guide/nginx-configuration/configmap.md index 10579c924..a3146bbb0 100644 --- a/docs/user-guide/nginx-configuration/configmap.md +++ b/docs/user-guide/nginx-configuration/configmap.md @@ -132,6 +132,7 @@ The following table shows a configuration option's name, type, and the default v |[proxy-connect-timeout](#proxy-connect-timeout)|int|5| |[proxy-read-timeout](#proxy-read-timeout)|int|60| |[proxy-send-timeout](#proxy-send-timeout)|int|60| +|[proxy-buffers-number](#proxy-buffers-number)|int|4| |[proxy-buffer-size](#proxy-buffer-size)|string|"4k"| |[proxy-cookie-path](#proxy-cookie-path)|string|"off"| |[proxy-cookie-domain](#proxy-cookie-domain)|string|"off"| @@ -762,6 +763,10 @@ Sets the timeout in seconds for [reading a response from the proxied server](htt Sets the timeout in seconds for [transmitting a request to the proxied server](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout). The timeout is set only between two successive write operations, not for the transmission of the whole request. +## proxy-buffers-number + +Sets the number of the buffer used for [reading the first part of the response](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers) received from the proxied server. This part usually contains a small response header. + ## proxy-buffer-size Sets the size of the buffer used for [reading the first part of the response](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size) received from the proxied server. This part usually contains a small response header. diff --git a/internal/ingress/annotations/proxy/main.go b/internal/ingress/annotations/proxy/main.go index b8844ed60..1e3fcd49e 100644 --- a/internal/ingress/annotations/proxy/main.go +++ b/internal/ingress/annotations/proxy/main.go @@ -29,6 +29,7 @@ type Config struct { ConnectTimeout int `json:"connectTimeout"` SendTimeout int `json:"sendTimeout"` ReadTimeout int `json:"readTimeout"` + BuffersNumber int `json:"buffersNumber"` BufferSize string `json:"bufferSize"` CookieDomain string `json:"cookieDomain"` CookiePath string `json:"cookiePath"` @@ -60,6 +61,9 @@ func (l1 *Config) Equal(l2 *Config) bool { if l1.ReadTimeout != l2.ReadTimeout { return false } + if l1.BuffersNumber != l2.BuffersNumber { + return false + } if l1.BufferSize != l2.BufferSize { return false } @@ -123,6 +127,11 @@ func (a proxy) Parse(ing *extensions.Ingress) (interface{}, error) { config.ReadTimeout = defBackend.ProxyReadTimeout } + config.BuffersNumber, err = parser.GetIntAnnotation("proxy-buffers-number", ing) + if err != nil { + config.BuffersNumber = defBackend.ProxyBuffersNumber + } + config.BufferSize, err = parser.GetStringAnnotation("proxy-buffer-size", ing) if err != nil { config.BufferSize = defBackend.ProxyBufferSize diff --git a/internal/ingress/annotations/proxy/main_test.go b/internal/ingress/annotations/proxy/main_test.go index 075047ece..33bb6b614 100644 --- a/internal/ingress/annotations/proxy/main_test.go +++ b/internal/ingress/annotations/proxy/main_test.go @@ -73,6 +73,7 @@ func (m mockBackend) GetDefaultBackend() defaults.Backend { ProxyConnectTimeout: 10, ProxySendTimeout: 15, ProxyReadTimeout: 20, + ProxyBuffersNumber: 4, ProxyBufferSize: "10k", ProxyBodySize: "3k", ProxyNextUpstream: "error", @@ -89,6 +90,7 @@ func TestProxy(t *testing.T) { data[parser.GetAnnotationWithPrefix("proxy-connect-timeout")] = "1" data[parser.GetAnnotationWithPrefix("proxy-send-timeout")] = "2" data[parser.GetAnnotationWithPrefix("proxy-read-timeout")] = "3" + data[parser.GetAnnotationWithPrefix("proxy-buffers-number")] = "8" data[parser.GetAnnotationWithPrefix("proxy-buffer-size")] = "1k" data[parser.GetAnnotationWithPrefix("proxy-body-size")] = "2k" data[parser.GetAnnotationWithPrefix("proxy-next-upstream")] = "off" @@ -114,6 +116,9 @@ func TestProxy(t *testing.T) { if p.ReadTimeout != 3 { t.Errorf("expected 3 as read-timeout but returned %v", p.ReadTimeout) } + if p.BuffersNumber != 8 { + t.Errorf("expected 8 as proxy-buffers-number but returned %v", p.BuffersNumber) + } if p.BufferSize != "1k" { t.Errorf("expected 1k as buffer-size but returned %v", p.BufferSize) } @@ -157,6 +162,9 @@ func TestProxyWithNoAnnotation(t *testing.T) { if p.ReadTimeout != 20 { t.Errorf("expected 20 as read-timeout but returned %v", p.ReadTimeout) } + if p.BuffersNumber != 4 { + t.Errorf("expected 4 as buffer-number but returned %v", p.BuffersNumber) + } if p.BufferSize != "10k" { t.Errorf("expected 10k as buffer-size but returned %v", p.BufferSize) } diff --git a/internal/ingress/controller/config/config.go b/internal/ingress/controller/config/config.go index db4703c12..dc613c156 100644 --- a/internal/ingress/controller/config/config.go +++ b/internal/ingress/controller/config/config.go @@ -671,6 +671,7 @@ func NewDefault() Configuration { ProxyConnectTimeout: 5, ProxyReadTimeout: 60, ProxySendTimeout: 60, + ProxyBuffersNumber: 4, ProxyBufferSize: "4k", ProxyCookieDomain: "off", ProxyCookiePath: "off", diff --git a/internal/ingress/controller/controller.go b/internal/ingress/controller/controller.go index c96ebedef..eedcda069 100644 --- a/internal/ingress/controller/controller.go +++ b/internal/ingress/controller/controller.go @@ -889,6 +889,7 @@ func (n *NGINXController) createServers(data []*ingress.Ingress, ConnectTimeout: bdef.ProxyConnectTimeout, SendTimeout: bdef.ProxySendTimeout, ReadTimeout: bdef.ProxyReadTimeout, + BuffersNumber: bdef.ProxyBuffersNumber, BufferSize: bdef.ProxyBufferSize, CookieDomain: bdef.ProxyCookieDomain, CookiePath: bdef.ProxyCookiePath, diff --git a/internal/ingress/defaults/main.go b/internal/ingress/defaults/main.go index 28bf65979..0242c9f7f 100644 --- a/internal/ingress/defaults/main.go +++ b/internal/ingress/defaults/main.go @@ -50,6 +50,10 @@ type Backend struct { // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout ProxySendTimeout int `json:"proxy-send-timeout"` + // Sets the number of the buffers used for reading a response from the proxied server + // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers + ProxyBuffersNumber int `json:"proxy-buffers-number"` + // Sets the size of the buffer used for reading the first part of the response received from the // proxied server. This part usually contains a small response header. // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size) diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index 93308543a..0d9010631 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -976,7 +976,7 @@ stream { proxy_buffering {{ $location.Proxy.ProxyBuffering }}; proxy_buffer_size {{ $location.Proxy.BufferSize }}; - proxy_buffers 4 {{ $location.Proxy.BufferSize }}; + proxy_buffers {{ $location.Proxy.BuffersNumber }} {{ $location.Proxy.BufferSize }}; proxy_request_buffering {{ $location.Proxy.RequestBuffering }}; proxy_http_version 1.1; @@ -1285,7 +1285,7 @@ stream { proxy_buffering {{ $location.Proxy.ProxyBuffering }}; proxy_buffer_size {{ $location.Proxy.BufferSize }}; - proxy_buffers 4 {{ $location.Proxy.BufferSize }}; + proxy_buffers {{ $location.Proxy.BuffersNumber }} {{ $location.Proxy.BufferSize }}; proxy_request_buffering {{ $location.Proxy.RequestBuffering }}; proxy_http_version 1.1; diff --git a/test/data/config.json b/test/data/config.json index 36ea6d64f..2c2975c69 100644 --- a/test/data/config.json +++ b/test/data/config.json @@ -7,6 +7,7 @@ "bind-address-ipv6": [ "[2001:db8:a0b:12f0::1]" ,"[3731:54:65fe:2::a7]" ,"[33:33:33::33::33]" ], "backend": { "custom-http-errors": [404], + "proxy-buffers-number": "4", "proxy-buffer-size": "4k", "proxy-connect-timeout": 5, "proxy-read-timeout": 60, diff --git a/test/e2e/annotations/proxy.go b/test/e2e/annotations/proxy.go index f6169f4a3..2976b47d0 100644 --- a/test/e2e/annotations/proxy.go +++ b/test/e2e/annotations/proxy.go @@ -147,8 +147,9 @@ var _ = framework.IngressNginxDescribe("Annotations - Proxy", func() { It("should turn on proxy-buffering", func() { annotations := map[string]string{ - "nginx.ingress.kubernetes.io/proxy-buffering": "on", - "nginx.ingress.kubernetes.io/proxy-buffer-size": "8k", + "nginx.ingress.kubernetes.io/proxy-buffering": "on", + "nginx.ingress.kubernetes.io/proxy-buffers-number": "8", + "nginx.ingress.kubernetes.io/proxy-buffer-size": "8k", } ing := framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, "http-svc", 80, &annotations) @@ -158,7 +159,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Proxy", func() { func(server string) bool { return strings.Contains(server, "proxy_buffering on;") && strings.Contains(server, "proxy_buffer_size 8k;") && - strings.Contains(server, "proxy_buffers 4 8k;") && + strings.Contains(server, "proxy_buffers 8 8k;") && strings.Contains(server, "proxy_request_buffering on;") }) })