From b4241741d651032866675d1fdf5a5fe3e22ace9f Mon Sep 17 00:00:00 2001 From: HomeDash Bot Date: Sat, 12 Sep 2026 09:20:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20=E9=97=A8=E6=88=B7=E6=AE=B5?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=20root=20=E5=AF=BC=E8=87=B4=20nginx=20-t=20?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v52 部署被 apply 的校验拦下("root directive is duplicate"):writeErrorPages 已写过 root /app/portal;,我又在 portal 分支写了一次。移除重复行,并加单测断言 该指令在生成结果里恰好出现一次。回滚机制按预期工作,服务未中断。 --- admin-server/gateway.go | 3 ++- admin-server/gateway_test.go | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/admin-server/gateway.go b/admin-server/gateway.go index f1f071e..3a3636a 100644 --- a/admin-server/gateway.go +++ b/admin-server/gateway.go @@ -259,7 +259,8 @@ func writeRouteServer(b *strings.Builder, cfg *GatewayConfig, r Route) error { if routeKind(r) == "portal" { // 门户首页交给 admin-server 渲染(pageInfo 可配置 + 支持数据卷整页覆盖), // 静态资源仍由本容器提供(root /app/portal)。 - b.WriteString(" root /app/portal;\n") + // 注意:不要在这里再写 root —— writeErrorPages 已经写过一次, + // 重复会让 nginx -t 报 "root directive is duplicate"(本轮真实踩到)。 b.WriteString(" location = / { proxy_pass http://127.0.0.1:3005/portal-page; proxy_set_header Host $host; proxy_redirect off; }\n") b.WriteString(" location / { try_files $uri $uri/ /404.html; }\n}\n\n") return nil diff --git a/admin-server/gateway_test.go b/admin-server/gateway_test.go index c404953..e41e5b6 100644 --- a/admin-server/gateway_test.go +++ b/admin-server/gateway_test.go @@ -2,6 +2,7 @@ package main import ( "os" + "strings" "testing" ) @@ -372,3 +373,14 @@ func TestPortalKindUsesRenderer(t *testing.T) { t.Fatalf("静态资源根目录丢失:\n%s", out) } } + +// nginx 不允许同一 server 段内重复的 root 指令(实测报 emerg)。 +func TestPortalKindNoDuplicateRoot(t *testing.T) { + out, err := RenderGatewayConf(&GatewayConfig{ListenPort: 8081, Routes: []Route{{Host: "p.com", Kind: "portal"}}}) + if err != nil { + t.Fatalf("渲染失败: %v", err) + } + if strings.Count(out, "root /app/portal;") != 1 { + t.Fatalf("root 指令重复(应恰好 1 次):\n%s", out) + } +}