code: func (h *httpContext) MakeServers() ([]caddy.Server, error) {
  	// make sure TLS is disabled for explicitly-HTTP sites
  	// (necessary when HTTP address shares a block containing tls)
  	for _, cfg := range h.siteConfigs {
  		if !cfg.TLS.Enabled {
  			continue
  		}
  		if cfg.Addr.Port == "80" || cfg.Addr.Scheme == "http" {
  			cfg.TLS.Enabled = false
  			log.Printf("[WARNING] TLS disabled for %s", cfg.Addr)
  		} else if cfg.Addr.Scheme == "" {
  			// set scheme to https ourselves, since TLS is enabled
  			// and it was not explicitly set to something else. this
  			// makes it appear as "https" when we print the list of
  			// running sites; otherwise "http" would be assumed which
  			// is incorrect for this site.
  			cfg.Addr.Scheme = "https"
  		}
  		if cfg.Addr.Port == "" && ((!cfg.TLS.Manual && !cfg.TLS.SelfSigned) || cfg.TLS.OnDemand) {
  			// this is vital, otherwise the function call below that
  			// sets the listener address will use the default port
  			// instead of 443 because it doesn't know about TLS.
  			cfg.Addr.Port = "443"
  		}
  	}
  
  	// we must map (group) each config to a bind address
  	groups, err := groupSiteConfigsByListenAddr(h.siteConfigs)
  	if err != nil {
  		return nil, err
  	}
  
  	// then we create a server for each group
  	var servers []caddy.Server
  	for addr, group := range groups {
  		s, err := NewServer(addr, group)
  		if err != nil {
  			return nil, err
  		}
  		servers = append(servers, s)
  	}
  
  	return servers, nil
  }
docs: // MakeServers uses the newly-created siteConfigs to
  // create and return a list of server instances.