From 7cca291d62c910c0544f0c0169a8f0c81627e5d3 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Sun, 23 Feb 2020 14:30:52 -0700 Subject: reverse_proxy: Health checks: Don't cross the streams Fixes https://caddy.community/t/v2-health-checks-are-going-to-the-wrong-upstream/7084?u=matt ... I think --- modules/caddyhttp/reverseproxy/reverseproxy.go | 65 +++++++++++++------------- 1 file changed, 33 insertions(+), 32 deletions(-) (limited to 'modules/caddyhttp/reverseproxy/reverseproxy.go') diff --git a/modules/caddyhttp/reverseproxy/reverseproxy.go b/modules/caddyhttp/reverseproxy/reverseproxy.go index acb5213..3601212 100644 --- a/modules/caddyhttp/reverseproxy/reverseproxy.go +++ b/modules/caddyhttp/reverseproxy/reverseproxy.go @@ -168,38 +168,6 @@ func (h *Handler) Provision(ctx caddy.Context) error { return err } - // if active health checks are enabled, configure them and start a worker - if h.HealthChecks != nil && - h.HealthChecks.Active != nil && - (h.HealthChecks.Active.Path != "" || h.HealthChecks.Active.Port != 0) { - h.HealthChecks.Active.logger = h.logger.Named("health_checker.active") - - timeout := time.Duration(h.HealthChecks.Active.Timeout) - if timeout == 0 { - timeout = 5 * time.Second - } - - h.HealthChecks.Active.stopChan = make(chan struct{}) - h.HealthChecks.Active.httpClient = &http.Client{ - Timeout: timeout, - Transport: h.Transport, - } - - if h.HealthChecks.Active.Interval == 0 { - h.HealthChecks.Active.Interval = caddy.Duration(30 * time.Second) - } - - if h.HealthChecks.Active.ExpectBody != "" { - var err error - h.HealthChecks.Active.bodyRegexp, err = regexp.Compile(h.HealthChecks.Active.ExpectBody) - if err != nil { - return fmt.Errorf("expect_body: compiling regular expression: %v", err) - } - } - - go h.activeHealthChecker() - } - // set up upstreams for _, upstream := range h.Upstreams { // create or get the host representation for this upstream @@ -235,6 +203,38 @@ func (h *Handler) Provision(ctx caddy.Context) error { } } + // if active health checks are enabled, configure them and start a worker + if h.HealthChecks != nil && + h.HealthChecks.Active != nil && + (h.HealthChecks.Active.Path != "" || h.HealthChecks.Active.Port != 0) { + h.HealthChecks.Active.logger = h.logger.Named("health_checker.active") + + timeout := time.Duration(h.HealthChecks.Active.Timeout) + if timeout == 0 { + timeout = 5 * time.Second + } + + h.HealthChecks.Active.stopChan = make(chan struct{}) + h.HealthChecks.Active.httpClient = &http.Client{ + Timeout: timeout, + Transport: h.Transport, + } + + if h.HealthChecks.Active.Interval == 0 { + h.HealthChecks.Active.Interval = caddy.Duration(30 * time.Second) + } + + if h.HealthChecks.Active.ExpectBody != "" { + var err error + h.HealthChecks.Active.bodyRegexp, err = regexp.Compile(h.HealthChecks.Active.ExpectBody) + if err != nil { + return fmt.Errorf("expect_body: compiling regular expression: %v", err) + } + } + + go h.activeHealthChecker() + } + return nil } @@ -244,6 +244,7 @@ func (h *Handler) Cleanup() error { if h.HealthChecks != nil && h.HealthChecks.Active != nil && h.HealthChecks.Active.stopChan != nil { + // TODO: consider using context cancellation, could be much simpler close(h.HealthChecks.Active.stopChan) } -- cgit v1.2.3