code: func (h *dnsContext) MakeServers() ([]caddy.Server, error) {
  
  	// we must map (group) each config to a bind address
  	groups, err := groupConfigsByListenAddr(h.configs)
  	if err != nil {
  		return nil, err
  	}
  	// then we create a server for each group
  	var servers []caddy.Server
  	for addr, group := range groups {
  		// switch on addr
  		switch Transport(addr) {
  		case TransportDNS:
  			s, err := NewServer(addr, group)
  			if err != nil {
  				return nil, err
  			}
  			servers = append(servers, s)
  
  		case TransportTLS:
  			s, err := NewServerTLS(addr, group)
  			if err != nil {
  				return nil, err
  			}
  			servers = append(servers, s)
  
  		case TransportGRPC:
  			s, err := NewServergRPC(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.