From b0c26195944680225db061237698692748297219 Mon Sep 17 00:00:00 2001 From: Manuel de Brito Fontes Date: Fri, 20 Jan 2017 18:53:32 -0300 Subject: [PATCH] Add annotation to allow custom body sizes --- controllers/nginx/configuration.md | 2 +- controllers/nginx/pkg/config/config.go | 6 +----- .../nginx/rootfs/etc/nginx/template/nginx.tmpl | 6 +++--- core/pkg/ingress/annotations/proxy/main.go | 13 ++++++++++--- core/pkg/ingress/controller/controller.go | 1 + core/pkg/ingress/defaults/main.go | 5 +++++ 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/controllers/nginx/configuration.md b/controllers/nginx/configuration.md index e27dfa9365..9dd2121cda 100644 --- a/controllers/nginx/configuration.md +++ b/controllers/nginx/configuration.md @@ -179,7 +179,7 @@ Please check the [whitelist](examples/whitelist/README.md) example. ### **Allowed parameters in configuration ConfigMap** -**body-size:** Sets the maximum allowed size of the client request body. See NGINX [client_max_body_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size). +**proxy-body-size:** Sets the maximum allowed size of the client request body. See NGINX [client_max_body_size](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size). **custom-http-errors:** Enables which HTTP codes should be passed for processing with the [error_page directive](http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page). diff --git a/controllers/nginx/pkg/config/config.go b/controllers/nginx/pkg/config/config.go index 9cf9b987ae..afd03ef041 100644 --- a/controllers/nginx/pkg/config/config.go +++ b/controllers/nginx/pkg/config/config.go @@ -78,10 +78,6 @@ var ( type Configuration struct { defaults.Backend `json:",squash"` - // http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size - // Sets the maximum allowed size of the client request body - BodySize string `json:"body-size,omitempty"` - // EnableDynamicTLSRecords enables dynamic TLS record sizes // https://blog.cloudflare.com/optimizing-tls-over-tcp-to-reduce-latency // By default this is enabled @@ -225,7 +221,6 @@ type Configuration struct { // NewDefault returns the default nginx configuration func NewDefault() Configuration { cfg := Configuration{ - BodySize: bodySize, EnableDynamicTLSRecords: true, EnableSPDY: false, ErrorLogLevel: errorLevel, @@ -253,6 +248,7 @@ func NewDefault() Configuration { VtsStatusZoneSize: "10m", UseHTTP2: true, Backend: defaults.Backend{ + ProxyBodySize: bodySize, ProxyConnectTimeout: 5, ProxyReadTimeout: 60, ProxySendTimeout: 60, diff --git a/controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl b/controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl index 4370577453..7c77f52e64 100644 --- a/controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl +++ b/controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl @@ -70,9 +70,7 @@ http { gzip_proxied any; {{ end }} - server_tokens {{ if $cfg.ShowServerTokens }}on{{ else }}off{{ end }}; - - client_max_body_size "{{ $cfg.BodySize }}"; + server_tokens {{ if $cfg.ShowServerTokens }}on{{ else }}off{{ end }}; log_format upstreaminfo '{{ if $cfg.UseProxyProtocol }}$proxy_protocol_addr{{ else }}$remote_addr{{ end }} - ' '[$proxy_add_x_forwarded_for] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" ' @@ -281,6 +279,8 @@ http { {{ template "CORS" }} {{ end }} + client_max_body_size "{{ $location.Proxy.BodySize }}"; + proxy_set_header Host $host; # Pass Real IP diff --git a/core/pkg/ingress/annotations/proxy/main.go b/core/pkg/ingress/annotations/proxy/main.go index 97f3dddc0c..c1ee7e47be 100644 --- a/core/pkg/ingress/annotations/proxy/main.go +++ b/core/pkg/ingress/annotations/proxy/main.go @@ -24,6 +24,7 @@ import ( ) const ( + bodySize = "ingress.kubernetes.io/proxy-body-size" connect = "ingress.kubernetes.io/proxy-connect-timeout" send = "ingress.kubernetes.io/proxy-send-timeout" read = "ingress.kubernetes.io/proxy-read-timeout" @@ -32,6 +33,7 @@ const ( // Configuration returns the proxy timeout to use in the upstream server/s type Configuration struct { + BodySize string `json:"bodySize"` ConnectTimeout int `json:"conectTimeout"` SendTimeout int `json:"sendTimeout"` ReadTimeout int `json:"readTimeout"` @@ -66,10 +68,15 @@ func (a proxy) Parse(ing *extensions.Ingress) (interface{}, error) { rt = defBackend.ProxyReadTimeout } - bs, err := parser.GetStringAnnotation(bufferSize, ing) + bufs, err := parser.GetStringAnnotation(bufferSize, ing) + if err != nil || bufs == "" { + bufs = defBackend.ProxyBufferSize + } + + bs, err := parser.GetStringAnnotation(bodySize, ing) if err != nil || bs == "" { - bs = defBackend.ProxyBufferSize + bs = defBackend.ProxyBodySize } - return &Configuration{ct, st, rt, bs}, nil + return &Configuration{bs, ct, st, rt, bufs}, nil } diff --git a/core/pkg/ingress/controller/controller.go b/core/pkg/ingress/controller/controller.go index 87cddf59c8..a5f3917788 100644 --- a/core/pkg/ingress/controller/controller.go +++ b/core/pkg/ingress/controller/controller.go @@ -788,6 +788,7 @@ func (ic *GenericController) createServers(data []interface{}, upstreams map[str bdef := ic.GetDefaultBackend() ngxProxy := proxy.Configuration{ + BodySize: bdef.ProxyBodySize, ConnectTimeout: bdef.ProxyConnectTimeout, SendTimeout: bdef.ProxySendTimeout, ReadTimeout: bdef.ProxyReadTimeout, diff --git a/core/pkg/ingress/defaults/main.go b/core/pkg/ingress/defaults/main.go index 88a817d937..12badd1b23 100644 --- a/core/pkg/ingress/defaults/main.go +++ b/core/pkg/ingress/defaults/main.go @@ -6,12 +6,17 @@ import "net" // The reason of this requirements is the annotations are generic. If some implementation do not supports // one or more annotations it just can provides defaults type Backend struct { + // enables which HTTP codes should be passed for processing with the error_page directive // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors // http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page // By default this is disabled CustomHTTPErrors []int `json:"custom-http-errors,-"` + // http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size + // Sets the maximum allowed size of the client request body + ProxyBodySize string `json:"proxy-body-size"` + // Defines a timeout for establishing a connection with a proxied server. // It should be noted that this timeout cannot usually exceed 75 seconds. // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout