diff --git a/pkg/webserver/apache/data.go b/pkg/webserver/apache/data.go index ff92d731..40442f70 100644 --- a/pkg/webserver/apache/data.go +++ b/pkg/webserver/apache/data.go @@ -1,13 +1,10 @@ package apache -// DisableConfName 禁用配置文件名 -const DisableConfName = "000-disable.conf" +// DisablePagePath 禁用页面路径 +const DisablePagePath = "/opt/ace/server/apache/stop" -// DisableConfContent 禁用配置内容 -const DisableConfContent = `# 网站已停止 -RewriteEngine on -RewriteRule ^.*$ - [R=503,L] -` +// SitesPath 网站目录 +const SitesPath = "/opt/ace/sites" // 配置文件序号范围 const ( diff --git a/pkg/webserver/apache/vhost.go b/pkg/webserver/apache/vhost.go index 9cabc4be..cf73bf38 100644 --- a/pkg/webserver/apache/vhost.go +++ b/pkg/webserver/apache/vhost.go @@ -104,27 +104,44 @@ func NewProxyVhost(configDir string) (*ProxyVhost, error) { } func (v *baseVhost) Enable() bool { - // 检查禁用配置文件是否存在 - disableFile := filepath.Join(v.configDir, "site", DisableConfName) - _, err := os.Stat(disableFile) - return os.IsNotExist(err) + root := v.vhost.GetDirectiveValue("DocumentRoot") + return root != DisablePagePath } -func (v *baseVhost) SetEnable(enable bool, _ ...string) error { - serverDir := filepath.Join(v.configDir, "site") - disableFile := filepath.Join(serverDir, DisableConfName) +func (v *baseVhost) SetEnable(enable bool, siteConfig ...string) error { + name := "" + path := DisablePagePath if enable { - // 启用:删除禁用配置文件 - if err := os.Remove(disableFile); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("failed to remove disable config: %w", err) + if len(siteConfig) != 2 { + return fmt.Errorf("site config is required to enable the vhost") } - return nil + name = siteConfig[0] + path = siteConfig[1] } - // 禁用:创建禁用配置文件 - if err := os.WriteFile(disableFile, []byte(DisableConfContent), 0644); err != nil { - return fmt.Errorf("failed to write disable config: %w", err) + // 设置根目录 + v.vhost.SetDirective("DocumentRoot", path) + + // 更新 Directory 块 + dirBlock := v.vhost.GetBlock("Directory") + if dirBlock != nil { + dirBlock.Args = []string{path} + } else { + block := v.vhost.AddBlock("Directory", path) + if block.Block != nil { + block.Block.Directives = append(block.Block.Directives, + &Directive{Name: "Options", Args: []string{"-Indexes", "+FollowSymLinks"}}, + &Directive{Name: "AllowOverride", Args: []string{"All"}}, + &Directive{Name: "Require", Args: []string{"all", "granted"}}, + ) + } + } + + // 设置 Include 配置 + v.vhost.RemoveDirectives("IncludeOptional") + if enable { + v.vhost.AddDirective("IncludeOptional", fmt.Sprintf("%s/%s/config/site/*.conf", SitesPath, name)) } return nil diff --git a/pkg/webserver/apache/vhost_test.go b/pkg/webserver/apache/vhost_test.go index ee9f4031..625cb294 100644 --- a/pkg/webserver/apache/vhost_test.go +++ b/pkg/webserver/apache/vhost_test.go @@ -51,39 +51,16 @@ func (s *VhostTestSuite) TestNewVhost() { } func (s *VhostTestSuite) TestEnable() { - // 默认应该是启用状态(没有 000-disable.conf) + // 默认应该是启用状态 s.True(s.vhost.Enable()) // 禁用网站 s.NoError(s.vhost.SetEnable(false)) s.False(s.vhost.Enable()) - // 验证禁用文件存在 - disableFile := filepath.Join(s.configDir, "site", DisableConfName) - _, err := os.Stat(disableFile) - s.NoError(err) - // 重新启用 - s.NoError(s.vhost.SetEnable(true)) + s.NoError(s.vhost.SetEnable(true, "testsite", "/var/www/test")) s.True(s.vhost.Enable()) - - // 验证禁用文件已删除 - _, err = os.Stat(disableFile) - s.True(os.IsNotExist(err)) -} - -func (s *VhostTestSuite) TestDisableConfigContent() { - // 禁用网站 - s.NoError(s.vhost.SetEnable(false)) - - // 读取禁用配置内容 - disableFile := filepath.Join(s.configDir, "site", DisableConfName) - content, err := os.ReadFile(disableFile) - s.NoError(err) - - // 验证内容包含 503 返回 - s.Contains(string(content), "503") - s.Contains(string(content), "RewriteRule") } func (s *VhostTestSuite) TestServerName() { diff --git a/pkg/webserver/nginx/data.go b/pkg/webserver/nginx/data.go index 9af20e3a..1c001308 100644 --- a/pkg/webserver/nginx/data.go +++ b/pkg/webserver/nginx/data.go @@ -1,14 +1,10 @@ package nginx -// DisableConfName 禁用配置文件名 -const DisableConfName = "000-disable.conf" +// DisablePagePath 禁用页面路径 +const DisablePagePath = "/opt/ace/server/nginx/stop" -// DisableConfContent 禁用配置内容 -const DisableConfContent = `# 网站已停止 -location / { - return 503; -} -` +// SitesPath 网站目录 +const SitesPath = "/opt/ace/sites" // 配置文件序号范围 const ( diff --git a/pkg/webserver/nginx/vhost.go b/pkg/webserver/nginx/vhost.go index 21e45ad7..de6da82b 100644 --- a/pkg/webserver/nginx/vhost.go +++ b/pkg/webserver/nginx/vhost.go @@ -75,6 +75,7 @@ func NewStaticVhost(configDir string) (*StaticVhost, error) { if err != nil { return nil, err } + return &StaticVhost{baseVhost: base}, nil } @@ -84,6 +85,7 @@ func NewPHPVhost(configDir string) (*PHPVhost, error) { if err != nil { return nil, err } + return &PHPVhost{baseVhost: base}, nil } @@ -93,31 +95,51 @@ func NewProxyVhost(configDir string) (*ProxyVhost, error) { if err != nil { return nil, err } + return &ProxyVhost{baseVhost: base}, nil } func (v *baseVhost) Enable() bool { - // 检查禁用配置文件是否存在 - disableFile := filepath.Join(v.configDir, "site", DisableConfName) - _, err := os.Stat(disableFile) - return os.IsNotExist(err) -} - -func (v *baseVhost) SetEnable(enable bool, _ ...string) error { - serverDir := filepath.Join(v.configDir, "site") - disableFile := filepath.Join(serverDir, DisableConfName) - - if enable { - // 启用:删除禁用配置文件 - if err := os.Remove(disableFile); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("failed to remove disable config: %w", err) - } - return nil + directive, err := v.parser.FindOne("server.root") + if err != nil { + return false } - // 禁用:创建禁用配置文件 - if err := os.WriteFile(disableFile, []byte(DisableConfContent), 0644); err != nil { - return fmt.Errorf("failed to write disable config: %w", err) + return directive.GetParameters()[0].GetValue() != DisablePagePath +} + +func (v *baseVhost) SetEnable(enable bool, siteConfig ...string) error { + name := "" + path := DisablePagePath + + if enable { + if len(siteConfig) != 2 { + return fmt.Errorf("site config is required to enable the vhost") + } + name = siteConfig[0] + path = siteConfig[1] + } + + // 设置根目录 + _ = v.parser.Clear("server.root") + if err := v.parser.Set("server", []*config.Directive{ + { + Name: "root", + Parameters: v.parser.slices2Parameters([]string{path}), + }, + }); err != nil { + return err + } + + // 设置导入配置 + _ = v.parser.Clear("server.include") + if enable { + return v.parser.Set("server", []*config.Directive{ + { + Name: "include", + Parameters: v.parser.slices2Parameters([]string{fmt.Sprintf("%s/%s/config/site/*.conf", SitesPath, name)}), + }, + }) } return nil diff --git a/pkg/webserver/nginx/vhost_test.go b/pkg/webserver/nginx/vhost_test.go index 30fd7194..2f2e8928 100644 --- a/pkg/webserver/nginx/vhost_test.go +++ b/pkg/webserver/nginx/vhost_test.go @@ -50,39 +50,16 @@ func (s *VhostTestSuite) TestNewVhost() { } func (s *VhostTestSuite) TestEnable() { - // 默认应该是启用状态(没有 000-disable.conf) + // 默认应该是启用状态 s.True(s.vhost.Enable()) // 禁用网站 s.NoError(s.vhost.SetEnable(false)) s.False(s.vhost.Enable()) - // 验证禁用文件存在 - disableFile := filepath.Join(s.configDir, "site", DisableConfName) - _, err := os.Stat(disableFile) - s.NoError(err) - // 重新启用 - s.NoError(s.vhost.SetEnable(true)) + s.NoError(s.vhost.SetEnable(true, "testsite", "/var/www/test")) s.True(s.vhost.Enable()) - - // 验证禁用文件已删除 - _, err = os.Stat(disableFile) - s.True(os.IsNotExist(err)) -} - -func (s *VhostTestSuite) TestDisableConfigContent() { - // 禁用网站 - s.NoError(s.vhost.SetEnable(false)) - - // 读取禁用配置内容 - disableFile := filepath.Join(s.configDir, "site", DisableConfName) - content, err := os.ReadFile(disableFile) - s.NoError(err) - - // 验证内容包含 503 返回 - s.Contains(string(content), "503") - s.Contains(string(content), "return") } func (s *VhostTestSuite) TestServerName() { diff --git a/pkg/webserver/types/vhost.go b/pkg/webserver/types/vhost.go index e8d42d74..0090572b 100644 --- a/pkg/webserver/types/vhost.go +++ b/pkg/webserver/types/vhost.go @@ -6,8 +6,8 @@ type Vhost interface { // Enable 取启用状态 Enable() bool - // SetEnable 设置启用状态及停止页路径 - SetEnable(enable bool, stopPage ...string) error + // SetEnable 设置启用状态及网站名称和根目录 + SetEnable(enable bool, siteConfig ...string) error // Listen 取监听配置 Listen() []Listen