diff --git a/controllers/nginx/nginx.tmpl b/controllers/nginx/nginx.tmpl index 1f178a636..e72eb4f6f 100644 --- a/controllers/nginx/nginx.tmpl +++ b/controllers/nginx/nginx.tmpl @@ -276,7 +276,7 @@ http { # default server, including healthcheck server { - listen 8080 default_server reuseport; + listen 8080 default_server reuseport backlog={{ .backlogSize }}; location /healthz { access_log off; diff --git a/controllers/nginx/nginx/template.go b/controllers/nginx/nginx/template.go index b12641efa..1b131c7fb 100644 --- a/controllers/nginx/nginx/template.go +++ b/controllers/nginx/nginx/template.go @@ -61,6 +61,7 @@ func (ngx *Manager) loadTemplate() { func (ngx *Manager) writeCfg(cfg config.Configuration, ingressCfg IngressConfig) (bool, error) { conf := make(map[string]interface{}) + conf["backlogSize"] = sysctlSomaxconn() conf["upstreams"] = ingressCfg.Upstreams conf["servers"] = ingressCfg.Servers conf["tcpUpstreams"] = ingressCfg.TCPUpstreams diff --git a/controllers/nginx/nginx/utils.go b/controllers/nginx/nginx/utils.go index 906642914..a4e49f737 100644 --- a/controllers/nginx/nginx/utils.go +++ b/controllers/nginx/nginx/utils.go @@ -28,6 +28,7 @@ import ( "github.com/golang/glog" "github.com/mitchellh/mapstructure" "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/util/sysctl" "k8s.io/contrib/ingress/controllers/nginx/nginx/config" ) @@ -220,3 +221,14 @@ func diff(b1, b2 []byte) (data []byte, err error) { } return } + +// sysctlSomaxconn returns the value of net.core.somaxconn, i.e. +// maximum number of connections that can be queued for acceptance +func sysctlSomaxconn() int { + maxConns, err := sysctl.GetSysctl("net.core.somaxconn") + if err != nil || maxConns < 512 { + return 511 + } + + return maxConns +}