refactor(config): 移除旧版 server 配置迁移逻辑
移除 migrateLegacyConfig 函数及其调用,不再支持旧版单 server 配置格式。配置文件必须使用 servers 数组格式。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d99011aab6
commit
39371c7f06
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user