diff --git a/modules/caddyhttp/reverseproxy/healthchecker.go b/modules/caddyhttp/reverseproxy/healthchecker.go
index add3aa025..39dca1b06 100755
--- a/modules/caddyhttp/reverseproxy/healthchecker.go
+++ b/modules/caddyhttp/reverseproxy/healthchecker.go
@@ -15,24 +15,32 @@ type HealthChecker struct {
 	upstream   Upstream
 	Ticker     *time.Ticker
 	HTTPClient *http.Client
+	StopChan   chan bool
 }
 
 // ScheduleChecks periodically runs health checks against an upstream host.
 func (h *HealthChecker) ScheduleChecks(url string) {
 	// check if a host is healthy on start vs waiting for timer
 	h.upstream.SetHealthiness(h.IsHealthy(url))
+	stop := make(chan bool)
+	h.StopChan = stop
 
-	for {
-		select {
-		case <-h.Ticker.C:
-			h.upstream.SetHealthiness(h.IsHealthy(url))
+	go func() {
+		for {
+			select {
+			case <-h.Ticker.C:
+				h.upstream.SetHealthiness(h.IsHealthy(url))
+			case <-stop:
+				return
+			}
 		}
-	}
+	}()
 }
 
 // Stop stops the healthchecker from makeing further requests.
 func (h *HealthChecker) Stop() {
 	h.Ticker.Stop()
+	close(h.StopChan)
 }
 
 // IsHealthy attempts to check if a upstream host is healthy.
diff --git a/modules/caddyhttp/reverseproxy/upstream.go b/modules/caddyhttp/reverseproxy/upstream.go
index b8a0330c6..db0395428 100755
--- a/modules/caddyhttp/reverseproxy/upstream.go
+++ b/modules/caddyhttp/reverseproxy/upstream.go
@@ -140,7 +140,7 @@ func NewLoadBalancedReverseProxy(lb *LoadBalanced, ctx caddy2.Context) error {
 		// TODO :- if path is empty why does this empty the entire Target?
 		// nu.Target.Path = uc.HealthCheckPath
 
-		go nu.healthChecker.ScheduleChecks(nu.Target.String())
+		nu.healthChecker.ScheduleChecks(nu.Target.String())
 		lb.HealthCheckers = append(lb.HealthCheckers, nu.healthChecker)
 
 		us = append(us, nu)