diff --git a/nginx-controller/controller/controller.go b/nginx-controller/controller/controller.go index 002e7fc275..d6b90b4409 100644 --- a/nginx-controller/controller/controller.go +++ b/nginx-controller/controller/controller.go @@ -332,6 +332,22 @@ func (lbc *LoadBalancerController) syncCfgm(key string) { if logFormat, exists := cfgm.Data["log-format"]; exists { cfg.MainLogFormat = logFormat } + if proxyBufferingStr, exists := cfgm.Data["proxy-buffering"]; exists { + if ProxyBuffering, err := strconv.ParseBool(proxyBufferingStr); err == nil { + cfg.ProxyBuffering = ProxyBuffering + } else { + glog.Errorf("In configmap %v/%v 'proxy-buffering' contains invalid declaration: %v, ignoring", cfgm.Namespace, cfgm.Name, err) + } + } + if proxyBuffers, exists := cfgm.Data["proxy-buffers"]; exists { + cfg.ProxyBuffers = proxyBuffers + } + if proxyBufferSize, exists := cfgm.Data["proxy-buffer-size"]; exists { + cfg.ProxyBufferSize = proxyBufferSize + } + if proxyMaxTempFileSize, exists := cfgm.Data["proxy-max-temp-file-size"]; exists { + cfg.ProxyMaxTempFileSize = proxyMaxTempFileSize + } } lbc.cnf.UpdateConfig(cfg) diff --git a/nginx-controller/nginx/config.go b/nginx-controller/nginx/config.go index d514829821..d7de99ff79 100644 --- a/nginx-controller/nginx/config.go +++ b/nginx-controller/nginx/config.go @@ -9,6 +9,10 @@ type Config struct { MainServerNamesHashBucketSize string MainServerNamesHashMaxSize string MainLogFormat string + ProxyBuffering bool + ProxyBuffers string + ProxyBufferSize string + ProxyMaxTempFileSize string } // NewDefaultConfig creates a Config with default values @@ -18,5 +22,6 @@ func NewDefaultConfig() *Config { ProxyReadTimeout: "60s", ClientMaxBodySize: "1m", MainServerNamesHashMaxSize: "512", + ProxyBuffering: true, } } diff --git a/nginx-controller/nginx/configurator.go b/nginx-controller/nginx/configurator.go index 9e92516991..aaab417326 100644 --- a/nginx-controller/nginx/configurator.go +++ b/nginx-controller/nginx/configurator.go @@ -187,6 +187,22 @@ func (cnf *Configurator) createConfig(ingEx *IngressEx) Config { glog.Errorf("In %v/%v nginx.org/http2 contains invalid declaration: %v, ignoring", ingEx.Ingress.Namespace, ingEx.Ingress.Name, err) } } + if proxyBufferingStr, exists := ingEx.Ingress.Annotations["nginx.org/proxy-buffering"]; exists { + if ProxyBuffering, err := strconv.ParseBool(proxyBufferingStr); err == nil { + ingCfg.ProxyBuffering = ProxyBuffering + } else { + glog.Errorf("In %v/%v nginx.org/proxy-buffering contains invalid declaration: %v, ignoring", ingEx.Ingress.Namespace, ingEx.Ingress.Name, err) + } + } + if proxyBuffers, exists := ingEx.Ingress.Annotations["nginx.org/proxy-buffers"]; exists { + ingCfg.ProxyBuffers = proxyBuffers + } + if proxyBufferSize, exists := ingEx.Ingress.Annotations["nginx.org/proxy-buffer-size"]; exists { + ingCfg.ProxyBufferSize = proxyBufferSize + } + if proxyMaxTempFileSize, exists := ingEx.Ingress.Annotations["nginx.org/proxy-max-temp-file-size"]; exists { + ingCfg.ProxyMaxTempFileSize = proxyMaxTempFileSize + } return ingCfg } @@ -252,14 +268,18 @@ func getSSLServices(ingEx *IngressEx) map[string]bool { func createLocation(path string, upstream Upstream, cfg *Config, websocket bool, rewrite string, ssl bool) Location { loc := Location{ - Path: path, - Upstream: upstream, - ProxyConnectTimeout: cfg.ProxyConnectTimeout, - ProxyReadTimeout: cfg.ProxyReadTimeout, - ClientMaxBodySize: cfg.ClientMaxBodySize, - Websocket: websocket, - Rewrite: rewrite, - SSL: ssl, + Path: path, + Upstream: upstream, + ProxyConnectTimeout: cfg.ProxyConnectTimeout, + ProxyReadTimeout: cfg.ProxyReadTimeout, + ClientMaxBodySize: cfg.ClientMaxBodySize, + Websocket: websocket, + Rewrite: rewrite, + SSL: ssl, + ProxyBuffering: cfg.ProxyBuffering, + ProxyBuffers: cfg.ProxyBuffers, + ProxyBufferSize: cfg.ProxyBufferSize, + ProxyMaxTempFileSize: cfg.ProxyMaxTempFileSize, } return loc diff --git a/nginx-controller/nginx/ingress.tmpl b/nginx-controller/nginx/ingress.tmpl index 1ba3ddc731..755940b12b 100644 --- a/nginx-controller/nginx/ingress.tmpl +++ b/nginx-controller/nginx/ingress.tmpl @@ -39,6 +39,17 @@ server { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; proxy_set_header X-Forwarded-Proto $scheme; + + proxy_buffering {{if $location.ProxyBuffering}}on{{else}}off{{end}}; + {{- if $location.ProxyBuffers}} + proxy_buffers {{$location.ProxyBuffers}}; + {{- end}} + {{- if $location.ProxyBufferSize}} + proxy_buffer_size {{$location.ProxyBufferSize}}; + {{- end}} + {{- if $location.ProxyMaxTempFileSize}} + proxy_max_temp_file_size {{$location.ProxyMaxTempFileSize}}; + {{- end}} {{if $location.SSL}} proxy_pass https://{{$location.Upstream.Name}}{{$location.Rewrite}}; {{else}} diff --git a/nginx-controller/nginx/nginx.go b/nginx-controller/nginx/nginx.go index 91bb815730..5d32b166c1 100644 --- a/nginx-controller/nginx/nginx.go +++ b/nginx-controller/nginx/nginx.go @@ -48,14 +48,18 @@ type Server struct { // Location describes an NGINX location type Location struct { - Path string - Upstream Upstream - ProxyConnectTimeout string - ProxyReadTimeout string - ClientMaxBodySize string - Websocket bool - Rewrite string - SSL bool + Path string + Upstream Upstream + ProxyConnectTimeout string + ProxyReadTimeout string + ClientMaxBodySize string + Websocket bool + Rewrite string + SSL bool + ProxyBuffering bool + ProxyBuffers string + ProxyBufferSize string + ProxyMaxTempFileSize string } // NginxMainConfig describe the main NGINX configuration file