From 39371c7f065071cee4cea2d774304229d1e34088 Mon Sep 17 00:00:00 2001 From: xfy Date: Wed, 15 Apr 2026 12:48:36 +0800 Subject: [PATCH] =?UTF-8?q?refactor(config):=20=E7=A7=BB=E9=99=A4=E6=97=A7?= =?UTF-8?q?=E7=89=88=20server=20=E9=85=8D=E7=BD=AE=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除 migrateLegacyConfig 函数及其调用,不再支持旧版单 server 配置格式。配置文件必须使用 servers 数组格式。 Co-Authored-By: Claude Opus 4.6 --- internal/config/config.go | 34 +---------------------- internal/config/config_test.go | 30 ++++++++++----------- internal/config/defaults.go | 49 ---------------------------------- 3 files changed, 16 insertions(+), 97 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 5859460..1d04ea0 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1591,7 +1591,6 @@ type StreamProxySSLConfig struct { // 注意事项: // - 加载后会自动调用 Validate 进行配置验证 // - 文件不存在或格式错误都会返回错误 -// - 自动迁移旧版配置(server 转换为 servers[0]) func Load(path string) (*Config, error) { data, err := os.ReadFile(path) if err != nil { @@ -1603,9 +1602,6 @@ func Load(path string) (*Config, error) { return nil, fmt.Errorf("解析配置文件失败: %w", err) } - // 迁移旧版配置 - cfg.migrateLegacyConfig() - if err := Validate(&cfg); err != nil { return nil, fmt.Errorf("配置验证失败: %w", err) } @@ -1626,16 +1622,12 @@ func Load(path string) (*Config, error) { // // 注意事项: // - 加载后会自动调用 Validate 进行配置验证 -// - 自动迁移旧版配置(server 转换为 servers[0]) func LoadFromString(yamlStr string) (*Config, error) { var cfg Config if err := yaml.Unmarshal([]byte(yamlStr), &cfg); err != nil { return nil, fmt.Errorf("解析配置失败: %w", err) } - // 迁移旧版配置 - cfg.migrateLegacyConfig() - if err := Validate(&cfg); err != nil { return nil, fmt.Errorf("配置验证失败: %w", err) } @@ -1669,25 +1661,6 @@ func Save(cfg *Config, path string) error { return nil } -// migrateLegacyConfig 迁移旧版配置到新版。 -// -// 将旧版 server 配置自动转换为 servers[0] 格式,实现向后兼容。 -// 如果 server 有配置但 servers 为空,则将 server 添加到 servers[0]。 -// -// 注意事项: -// - 仅在检测到旧版配置时输出警告日志 -// - 迁移后清空 server 字段,统一使用 servers 格式 -// - 如果同时配置了 server 和 servers,忽略 server 配置 -func (c *Config) migrateLegacyConfig() { - // 如果配置了旧版 server 且 servers 为空,进行迁移 - if c.Server.Listen != "" && len(c.Servers) == 0 { - fmt.Fprintf(os.Stderr, "[警告] 使用旧版配置格式 server,已自动迁移到 servers[0]。请将配置更新为 servers 格式。\n") - c.Servers = []ServerConfig{c.Server} - // 清空旧版配置,避免混淆 - c.Server = ServerConfig{} - } -} - // HasServers 检查是否为多虚拟主机模式。 // // 返回值: @@ -1724,7 +1697,6 @@ func (c *Config) GetDefaultServer() *ServerConfig { // - servers 数量 == 1 → single // - servers 数量 > 1 且所有 listen 地址相同 → vhost // - servers 数量 > 1 且 listen 地址不同 → multi_server -// - servers 为空但 server 有配置 → single(兼容旧配置) // // 返回值: // - ServerMode: 推断后的服务器运行模式 @@ -1737,12 +1709,8 @@ func (c *Config) GetMode() ServerMode { // 自动推断模式 serverCount := len(c.Servers) - // servers 为空但 server 有配置 → single(兼容旧配置) + // servers 为空 → auto(配置验证会确保至少有一个服务器) if serverCount == 0 { - if c.HasDefaultServer() { - return ServerModeSingle - } - // 理论上不会到达这里(配置验证会确保至少有一个服务器) return ServerModeAuto } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 62c62f4..348f3fc 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -12,13 +12,13 @@ func TestLoad(t *testing.T) { t.Run("有效配置文件", func(t *testing.T) { // 创建临时配置文件 content := ` -server: - listen: ":8080" - static: - - path: "/" - root: "/var/www" - index: - - "index.html" +servers: + - listen: ":8080" + static: + - path: "/" + root: "/var/www" + index: + - "index.html" logging: access: path: "/var/log/access.log" @@ -137,11 +137,11 @@ servers: func TestLoadFromString(t *testing.T) { t.Run("有效字符串", func(t *testing.T) { yamlStr := ` -server: - listen: ":9090" - static: - - path: "/" - root: "/app/public" +servers: + - listen: ":9090" + static: + - path: "/" + root: "/app/public" ` cfg, err := LoadFromString(yamlStr) if err != nil { @@ -158,9 +158,9 @@ server: t.Run("无效YAML", func(t *testing.T) { yamlStr := ` -server: - listen: ":8080" - broken: [unclosed +servers: + - listen: ":8080" + broken: [unclosed ` _, err := LoadFromString(yamlStr) if err == nil { diff --git a/internal/config/defaults.go b/internal/config/defaults.go index 9ee7e6b..6f6a692 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -460,55 +460,6 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) { fmt.Fprintf(&buf, " fast_timeout: %ds # 快速停止超时(SIGINT/SIGTERM,0=使用默认5s)\n", int(cfg.Shutdown.FastTimeout.Seconds())) buf.WriteString("\n") - // servers 配置说明 - 完整示例 - buf.WriteString("# 多虚拟主机模式(可选,每个虚拟主机支持完整的 server 配置)\n") - buf.WriteString("# servers:\n") - buf.WriteString("# - listen: \":8080\" # 监听地址\n") - buf.WriteString("# name: \"api.example.com\" # 服务器名称(用于虚拟主机匹配)\n") - buf.WriteString("# read_timeout: 30s # 读取超时(0 表示不限制)\n") - buf.WriteString("# write_timeout: 30s # 写入超时(0 表示不限制)\n") - buf.WriteString("# idle_timeout: 120s # 空闲超时(0 表示不限制)\n") - buf.WriteString("# max_conns_per_ip: 1000 # 每 IP 最大连接数(0 表示不限制)\n") - buf.WriteString("# max_requests_per_conn: 10000 # 每连接最大请求数(0 表示不限制)\n") - buf.WriteString("# static: # 静态文件配置(支持多个目录)\n") - buf.WriteString("# - path: /\n") - buf.WriteString("# root: /var/www/api\n") - buf.WriteString("# index: [index.html]\n") - buf.WriteString("# proxy: # 反向代理配置\n") - buf.WriteString("# - path: /api\n") - buf.WriteString("# targets:\n") - buf.WriteString("# - url: http://backend:8080\n") - buf.WriteString("# load_balance: round_robin\n") - buf.WriteString("# ssl: # SSL/TLS 配置\n") - buf.WriteString("# cert: /path/to/api.cert.pem\n") - buf.WriteString("# key: /path/to/api.key.pem\n") - buf.WriteString("# protocols: [TLSv1.2, TLSv1.3]\n") - buf.WriteString("# hsts:\n") - buf.WriteString("# max_age: 31536000\n") - buf.WriteString("# include_sub_domains: true\n") - buf.WriteString("# security: # 安全配置\n") - buf.WriteString("# access:\n") - buf.WriteString("# default: allow\n") - buf.WriteString("# rate_limit:\n") - buf.WriteString("# request_rate: 100\n") - buf.WriteString("# headers:\n") - buf.WriteString("# x_frame_options: DENY\n") - buf.WriteString("# compression: # 响应压缩配置\n") - buf.WriteString("# type: gzip\n") - buf.WriteString("# level: 6\n") - buf.WriteString("# - listen: \":8443\" # 另一个虚拟主机\n") - buf.WriteString("# name: \"static.example.com\"\n") - buf.WriteString("# static:\n") - buf.WriteString("# - path: /\n") - buf.WriteString("# root: /var/www/static\n") - buf.WriteString("# index: [index.html, index.htm]\n") - buf.WriteString("# ssl:\n") - buf.WriteString("# cert: /path/to/static.cert.pem\n") - buf.WriteString("# key: /path/to/static.key.pem\n") - buf.WriteString("# compression:\n") - buf.WriteString("# type: gzip\n") - buf.WriteString("\n") - // SSL 默认值说明(即使不启用也展示默认配置) buf.WriteString("# SSL/TLS 默认配置说明(未配置证书时不启用)\n") buf.WriteString("# 默认 TLS 协议: TLSv1.2, TLSv1.3(不支持 TLSv1.0/1.1)\n")