From b66099379d065ec3340cbe147f65dcf0a39e8e52 Mon Sep 17 00:00:00 2001 From: Francis Lavoie Date: Fri, 30 Oct 2020 14:05:21 -0400 Subject: [PATCH] reverseproxy: Add max_idle_conns_per_host; fix godocs (#3829) --- ...roxy_h2c.txt => reverse_proxy_options.txt} | 8 +++++- modules/caddyhttp/reverseproxy/caddyfile.go | 28 ++++++++++++++++++- .../caddyhttp/reverseproxy/httptransport.go | 4 +++ 3 files changed, 38 insertions(+), 2 deletions(-) rename caddytest/integration/caddyfile_adapt/{reverse_proxy_h2c.txt => reverse_proxy_options.txt} (93%) diff --git a/caddytest/integration/caddyfile_adapt/reverse_proxy_h2c.txt b/caddytest/integration/caddyfile_adapt/reverse_proxy_options.txt similarity index 93% rename from caddytest/integration/caddyfile_adapt/reverse_proxy_h2c.txt rename to caddytest/integration/caddyfile_adapt/reverse_proxy_options.txt index 9f3bc93f4..423bd8fdb 100644 --- a/caddytest/integration/caddyfile_adapt/reverse_proxy_h2c.txt +++ b/caddytest/integration/caddyfile_adapt/reverse_proxy_options.txt @@ -6,11 +6,15 @@ https://example.com { header_up X-Forwarded-For {remote} header_up X-Forwarded-Port {server_port} header_up X-Forwarded-Proto "http" + + buffer_requests + transport http { versions h2c 2 compression off + max_conns_per_host 5 + max_idle_conns_per_host 2 } - buffer_requests } } @@ -64,6 +68,8 @@ https://example.com { }, "transport": { "compression": false, + "max_conns_per_host": 5, + "max_idle_conns_per_host": 2, "protocol": "http", "versions": [ "h2c", diff --git a/modules/caddyhttp/reverseproxy/caddyfile.go b/modules/caddyhttp/reverseproxy/caddyfile.go index 193487a04..7fa118c2a 100644 --- a/modules/caddyhttp/reverseproxy/caddyfile.go +++ b/modules/caddyhttp/reverseproxy/caddyfile.go @@ -72,6 +72,7 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) // // # streaming // flush_interval +// buffer_requests // // # header manipulation // header_up [+|-] [ []] @@ -588,13 +589,18 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { // read_buffer // write_buffer // dial_timeout -// tls_client_auth +// tls +// tls_client_auth | // tls_insecure_skip_verify // tls_timeout // tls_trusted_ca_certs +// tls_server_name // keepalive [off|] // keepalive_idle_conns // versions +// compression off +// max_conns_per_host +// max_idle_conns_per_host // } // func (h *HTTPTransport) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { @@ -738,6 +744,26 @@ func (h *HTTPTransport) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { } } + case "max_conns_per_host": + if !d.NextArg() { + return d.ArgErr() + } + num, err := strconv.Atoi(d.Val()) + if err != nil { + return d.Errf("bad integer value '%s': %v", d.Val(), err) + } + h.MaxConnsPerHost = num + + case "max_idle_conns_per_host": + if !d.NextArg() { + return d.ArgErr() + } + num, err := strconv.Atoi(d.Val()) + if err != nil { + return d.Errf("bad integer value '%s': %v", d.Val(), err) + } + h.MaxIdleConnsPerHost = num + default: return d.Errf("unrecognized subdirective %s", d.Val()) } diff --git a/modules/caddyhttp/reverseproxy/httptransport.go b/modules/caddyhttp/reverseproxy/httptransport.go index dce7b9e87..d2a995166 100644 --- a/modules/caddyhttp/reverseproxy/httptransport.go +++ b/modules/caddyhttp/reverseproxy/httptransport.go @@ -62,6 +62,9 @@ type HTTPTransport struct { // Maximum number of connections per host. Default: 0 (no limit) MaxConnsPerHost int `json:"max_conns_per_host,omitempty"` + // Maximum number of idle connections per host. Default: 0 (uses Go's default of 2) + MaxIdleConnsPerHost int `json:"max_idle_conns_per_host,omitempty"` + // How long to wait before timing out trying to connect to // an upstream. DialTimeout caddy.Duration `json:"dial_timeout,omitempty"` @@ -193,6 +196,7 @@ func (h *HTTPTransport) NewTransport(ctx caddy.Context) (*http.Transport, error) return conn, nil }, MaxConnsPerHost: h.MaxConnsPerHost, + MaxIdleConnsPerHost: h.MaxIdleConnsPerHost, ResponseHeaderTimeout: time.Duration(h.ResponseHeaderTimeout), ExpectContinueTimeout: time.Duration(h.ExpectContinueTimeout), MaxResponseHeaderBytes: h.MaxResponseHeaderSize,