diff --git a/internal/data/website.go b/internal/data/website.go index 5ef2e261..437d249b 100644 --- a/internal/data/website.go +++ b/internal/data/website.go @@ -236,6 +236,18 @@ func (r *websiteRepo) Create(req *request.WebsiteCreate) (*biz.Website, error) { return nil, err } + // 创建配置文件目录 + if err = os.MkdirAll(filepath.Join(app.Root, "sites", req.Name, "config", "site"), 0644); err != nil { + return nil, err + } + if err = os.MkdirAll(filepath.Join(app.Root, "sites", req.Name, "config", "shared"), 0644); err != nil { + return nil, err + } + // 创建日志目录 + if err = os.MkdirAll(filepath.Join(app.Root, "sites", req.Name, "log"), 0644); err != nil { + return nil, err + } + // 监听地址 var listens []webservertypes.Listen for _, listen := range req.Listens { @@ -263,19 +275,6 @@ func (r *websiteRepo) Create(req *request.WebsiteCreate) (*biz.Website, error) { if err = vhost.SetErrorLog(filepath.Join(app.Root, "sites", req.Name, "log", "error.log")); err != nil { return nil, err } - - // 创建配置文件目录 - if err = os.MkdirAll(filepath.Join(app.Root, "sites", req.Name, "config", "site"), 0644); err != nil { - return nil, err - } - if err = os.MkdirAll(filepath.Join(app.Root, "sites", req.Name, "config", "shared"), 0644); err != nil { - return nil, err - } - // 创建日志目录 - if err = os.MkdirAll(filepath.Join(app.Root, "sites", req.Name, "log"), 0644); err != nil { - return nil, err - } - // 404 页面 // TODO 需要兼容 Apache if err = vhost.SetConfig("010-error-404.conf", "site", `error_page 404 /404.html;`); err != nil { diff --git a/pkg/webserver/nginx/parser.go b/pkg/webserver/nginx/parser.go index dddd3ded..2a2a9b61 100644 --- a/pkg/webserver/nginx/parser.go +++ b/pkg/webserver/nginx/parser.go @@ -200,7 +200,7 @@ func (p *Parser) Dump() string { // Save 保存配置到文件 func (p *Parser) Save() error { p.sortDirectives(p.cfg.Directives, order) - content := p.Dump() + content := p.Dump() + "\n" if err := os.WriteFile(p.cfgPath, []byte(content), 0644); err != nil { return fmt.Errorf("failed to save config file: %w", err) } @@ -215,6 +215,18 @@ func (p *Parser) SetConfigPath(path string) { func (p *Parser) sortDirectives(directives []config.IDirective, orderIndex map[string]int) { slices.SortFunc(directives, func(a config.IDirective, b config.IDirective) int { + // 块指令(如 server、location)应该排在普通指令(如 include)后面 + aIsBlock := a.GetBlock() != nil && len(a.GetBlock().GetDirectives()) > 0 + bIsBlock := b.GetBlock() != nil && len(b.GetBlock().GetDirectives()) > 0 + + if aIsBlock != bIsBlock { + if aIsBlock { + return 1 // a 是块指令,排在后面 + } + return -1 // b 是块指令,排在前面 + } + + // 同类指令,按 order 排序 if orderIndex[a.GetName()] != orderIndex[b.GetName()] { return orderIndex[a.GetName()] - orderIndex[b.GetName()] }