fix(server): protect accessLogMiddleware and accessControl from concurrent writes

This commit is contained in:
xfy 2026-06-05 11:49:19 +08:00
parent 76257a7859
commit f73a761632
3 changed files with 12 additions and 5 deletions

View File

@ -42,8 +42,8 @@ func (s *Server) cleanupResources() {
}
// 关闭 AccessControl (释放 GeoIP 资源)
if s.accessControl != nil {
if err := s.accessControl.Close(); err != nil {
for _, ac := range s.accessControls {
if err := ac.Close(); err != nil {
logging.Warn().Err(err).Msg("Failed to close AccessControl")
}
}

View File

@ -12,7 +12,6 @@ import (
"rua.plus/lolly/internal/config"
"rua.plus/lolly/internal/lua"
"rua.plus/lolly/internal/middleware"
"rua.plus/lolly/internal/middleware/accesslog"
"rua.plus/lolly/internal/middleware/bodylimit"
"rua.plus/lolly/internal/middleware/compression"
"rua.plus/lolly/internal/middleware/errorintercept"
@ -40,7 +39,6 @@ func (s *Server) buildMiddlewareChain(serverCfg *config.ServerConfig) (*middlewa
var middlewares []middleware.Middleware
// 1. AccessLog (已集成)
s.accessLogMiddleware = accesslog.New(&s.config.Logging)
middlewares = append(middlewares, s.accessLogMiddleware)
// 2. Security: AccessControl (IP 访问控制)
@ -50,7 +48,10 @@ func (s *Server) buildMiddlewareChain(serverCfg *config.ServerConfig) (*middlewa
return nil, fmt.Errorf("failed to create access control middleware: %w", err)
}
middlewares = append(middlewares, ac)
s.accessControlsMu.Lock()
s.accessControl = ac
s.accessControls = append(s.accessControls, ac)
s.accessControlsMu.Unlock()
}
// 3. Security: RateLimiter (速率限制)

View File

@ -66,6 +66,8 @@ type Server struct {
accessLogMiddleware *accesslog.AccessLog
luaEngine *lua.LuaEngine
accessControl *security.AccessControl
accessControls []*security.AccessControl
accessControlsMu sync.Mutex
errorPageManager *handler.ErrorPageManager
fileCache *cache.FileCache
pool *GoroutinePool
@ -96,7 +98,11 @@ type Server struct {
// 返回值:
// - *Server: 创建的服务器实例
func New(cfg *config.Config) *Server {
return &Server{config: cfg}
s := &Server{config: cfg}
if cfg != nil {
s.accessLogMiddleware = accesslog.New(&cfg.Logging)
}
return s
}
func (s *Server) handleRegistrationError(source, path string, err error) error {