From f58f19475249668d4bcc4a6d517f81d7e6db763f Mon Sep 17 00:00:00 2001 From: xfy Date: Wed, 3 Jun 2026 11:44:14 +0800 Subject: [PATCH] fix(server): serialize listener creation in multi-server mode Remove VHost fallback during graceful upgrade. Serialize listener creation before parallel router/middleware setup to prevent concurrent inherited listener consumption. Fix tcpAddrMatch to match when either side is any-addr (0.0.0.0/::). --- internal/server/server.go | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index 834d282..c55747d 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -709,22 +709,28 @@ func (s *Server) startVHostMode() error { // // 注意事项: // - 每个服务器有独立的中间件配置 -// - 热升级场景下回退到虚拟主机模式 // - 使用 goroutine 并行启动多个服务器 func (s *Server) startMultiServerMode() error { - // 热升级检测:multi_server 热升级未实现,回退到 vhost 模式 - if os.Getenv("GRACEFUL_UPGRADE") == "1" { - logging.Warn().Msg("multi_server mode not implemented for graceful upgrade, falling back to vhost mode") - return s.startVHostMode() - } - s.fastServers = make([]*fasthttp.Server, len(s.config.Servers)) s.listeners = make([]net.Listener, len(s.config.Servers)) + for i := range s.config.Servers { + serverCfg := &s.config.Servers[i] + ln, err := s.createListener(serverCfg) + if err != nil { + for j := 0; j < i; j++ { + if s.listeners[j] != nil { + _ = s.listeners[j].Close() + } + } + return fmt.Errorf("failed to listen on %s: %w", serverCfg.Listen, err) + } + s.listeners[i] = ln + } + var wg sync.WaitGroup errCh := make(chan error, len(s.config.Servers)) - // 并行创建监听器和 fasthttp.Server for i := range s.config.Servers { wg.Add(1) go func(idx int) { @@ -732,15 +738,6 @@ func (s *Server) startMultiServerMode() error { serverCfg := &s.config.Servers[idx] - // 创建监听器 - ln, err := s.createListener(serverCfg) - if err != nil { - errCh <- fmt.Errorf("failed to listen on %s: %w", serverCfg.Listen, err) - return - } - s.listeners[idx] = ln - - // 创建路由器 router := handler.NewRouter() // 注册状态监控端点(仅默认服务器)