From f8432ba5212fadcd1818c17fbd530f65aa5a2b87 Mon Sep 17 00:00:00 2001 From: zhengkunwang223 <31820853+zhengkunwang223@users.noreply.github.com> Date: Wed, 12 Apr 2023 21:52:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E7=BD=91=E7=AB=99?= =?UTF-8?q?=E5=81=9C=E6=AD=A2=E4=B9=8B=E5=90=8E=E6=97=A0=E6=B3=95=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E7=9A=84=E9=97=AE=E9=A2=98=20(#602)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/model/website.go | 1 + backend/app/service/website.go | 41 ++++++++++++++-------- backend/app/service/website_utils.go | 35 +++++++++--------- backend/init/migration/migrate.go | 1 + backend/init/migration/migrations/init.go | 9 ++++- backend/utils/nginx/components/config.go | 1 + backend/utils/nginx/components/location.go | 2 +- backend/utils/nginx/components/server.go | 20 +++++++---- frontend/src/api/interface/website.ts | 1 + 9 files changed, 72 insertions(+), 39 deletions(-) diff --git a/backend/app/model/website.go b/backend/app/model/website.go index 4b9866d87..1eaaeaf54 100644 --- a/backend/app/model/website.go +++ b/backend/app/model/website.go @@ -16,6 +16,7 @@ type Website struct { WebsiteGroupID uint `gorm:"type:integer" json:"webSiteGroupId"` WebsiteSSLID uint `gorm:"type:integer" json:"webSiteSSLId"` Proxy string `gorm:"type:varchar(128);not null" json:"proxy"` + ProxyType string `gorm:"type:varchar;" json:"proxyType"` ErrorLog bool `json:"errorLog"` AccessLog bool `json:"accessLog"` DefaultServer bool `json:"defaultServer"` diff --git a/backend/app/service/website.go b/backend/app/service/website.go index 62da1aee6..4413039ad 100644 --- a/backend/app/service/website.go +++ b/backend/app/service/website.go @@ -166,6 +166,7 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) } } }() + var proxy string switch create.Type { case constant.Deployment: @@ -184,8 +185,9 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) return err } tx.Commit() - website.AppInstallID = install.ID appInstall = install + website.AppInstallID = install.ID + website.Proxy = fmt.Sprintf("127.0.0.1:%d", appInstall.HttpPort) } else { var install model.AppInstall install, err = appInstallRepo.GetFirst(commonRepo.WithByID(create.AppInstallID)) @@ -194,6 +196,7 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) } appInstall = &install website.AppInstallID = appInstall.ID + website.Proxy = fmt.Sprintf("127.0.0.1:%d", appInstall.HttpPort) } case constant.Runtime: runtime, err = runtimeRepo.GetFirst(commonRepo.WithByID(create.RuntimeID)) @@ -226,23 +229,27 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) tx.Commit() website.AppInstallID = install.ID appInstall = install + website.Proxy = fmt.Sprintf("127.0.0.1:%d", appInstall.HttpPort) + } else { + website.ProxyType = create.ProxyType + if website.ProxyType == constant.RuntimeProxyUnix { + proxy = fmt.Sprintf("unix:%s", path.Join("/www/sites", website.Alias, "php-pool", "php-fpm.sock")) + } + if website.ProxyType == constant.RuntimeProxyTcp { + proxy = fmt.Sprintf("127.0.0.1:%d", create.Port) + } + website.Proxy = proxy } } - tx, ctx := helper.GetTxAndContext() - defer tx.Rollback() - if err = websiteRepo.Create(ctx, website); err != nil { - return err - } var domains []model.WebsiteDomain - domains = append(domains, model.WebsiteDomain{Domain: website.PrimaryDomain, WebsiteID: website.ID, Port: 80}) - + domains = append(domains, model.WebsiteDomain{Domain: website.PrimaryDomain, Port: 80}) otherDomainArray := strings.Split(create.OtherDomains, "\n") for _, domain := range otherDomainArray { if domain == "" { continue } - domainModel, err := getDomain(domain, website.ID) + domainModel, err := getDomain(domain) if err != nil { return err } @@ -251,12 +258,18 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) } domains = append(domains, domainModel) } - if len(domains) > 0 { - if err = websiteDomainRepo.BatchCreate(ctx, domains); err != nil { - return err - } + if err != configDefaultNginx(website, domains, appInstall, runtime) { + return err } - if err != configDefaultNginx(website, domains, appInstall, runtime, create.RuntimeConfig) { + tx, ctx := helper.GetTxAndContext() + defer tx.Rollback() + if err = websiteRepo.Create(ctx, website); err != nil { + return err + } + for i := range domains { + domains[i].WebsiteID = website.ID + } + if err = websiteDomainRepo.BatchCreate(ctx, domains); err != nil { return err } tx.Commit() diff --git a/backend/app/service/website_utils.go b/backend/app/service/website_utils.go index b30785bf0..0bd235fcb 100644 --- a/backend/app/service/website_utils.go +++ b/backend/app/service/website_utils.go @@ -20,10 +20,8 @@ import ( "gorm.io/gorm" ) -func getDomain(domainStr string, websiteID uint) (model.WebsiteDomain, error) { - domain := model.WebsiteDomain{ - WebsiteID: websiteID, - } +func getDomain(domainStr string) (model.WebsiteDomain, error) { + domain := model.WebsiteDomain{} domainArray := strings.Split(domainStr, ":") if len(domainArray) == 1 { domain.Domain = domainArray[0] @@ -123,7 +121,7 @@ func createWebsiteFolder(nginxInstall model.AppInstall, website *model.Website, return fileOp.CopyDir(path.Join(nginxFolder, "www", "common", "waf", "rules"), path.Join(siteFolder, "waf")) } -func configDefaultNginx(website *model.Website, domains []model.WebsiteDomain, appInstall *model.AppInstall, runtime *model.Runtime, runtimeConfig request.RuntimeConfig) error { +func configDefaultNginx(website *model.Website, domains []model.WebsiteDomain, appInstall *model.AppInstall, runtime *model.Runtime) error { nginxInstall, err := getAppInstallByKey(constant.AppOpenresty) if err != nil { return err @@ -171,23 +169,15 @@ func configDefaultNginx(website *model.Website, domains []model.WebsiteDomain, a switch runtime.Type { case constant.RuntimePHP: server.UpdateRoot(rootIndex) - proxy := "" localPath := path.Join(nginxInstall.GetPath(), rootIndex, "index.php") - if runtimeConfig.ProxyType == constant.RuntimeProxyUnix { - proxy = fmt.Sprintf("unix:%s", path.Join("/www/sites", website.Alias, "php-pool", "php-fpm.sock")) - } - if runtimeConfig.ProxyType == constant.RuntimeProxyTcp { - proxy = fmt.Sprintf("127.0.0.1:%d", runtimeConfig.Port) - } - server.UpdatePHPProxy([]string{proxy}, localPath) + server.UpdatePHPProxy([]string{website.Proxy}, localPath) } } if runtime.Resource == constant.ResourceAppstore { switch runtime.Type { case constant.RuntimePHP: server.UpdateRoot(rootIndex) - proxy := fmt.Sprintf("127.0.0.1:%d", appInstall.HttpPort) - server.UpdatePHPProxy([]string{proxy}, "") + server.UpdatePHPProxy([]string{website.Proxy}, "") } } } @@ -457,8 +447,11 @@ func opWebsite(website *model.Website, operate string) error { } server := servers[0] if operate == constant.StopWeb { - if website.Type != constant.Static { - server.RemoveDirective("location", []string{"/"}) + if website.Type == constant.Deployment || website.Type == constant.Static || website.Type == constant.Proxy { + server.RemoveDirective("location", []string{"", "/"}) + } + if website.Type == constant.Runtime { + server.RemoveDirective("location", []string{"~", "[^/]\\.php(/|$)"}) } server.UpdateRoot("/usr/share/nginx/html/stop") website.Status = constant.WebStopped @@ -479,6 +472,14 @@ func opWebsite(website *model.Website, operate string) error { case constant.Proxy: server.RemoveDirective("root", nil) server.UpdateRootProxy([]string{website.Proxy}) + case constant.Runtime: + rootIndex := path.Join("/www/sites", website.Alias, "index") + server.UpdateRoot(rootIndex) + localPath := "" + if website.ProxyType == constant.RuntimeProxyUnix { + localPath = path.Join(nginxInstall.Install.GetPath(), rootIndex, "index.php") + } + server.UpdatePHPProxy([]string{website.Proxy}, localPath) } website.Status = constant.WebRunning now := time.Now() diff --git a/backend/init/migration/migrate.go b/backend/init/migration/migrate.go index db2d247ea..597519e0f 100644 --- a/backend/init/migration/migrate.go +++ b/backend/init/migration/migrate.go @@ -24,6 +24,7 @@ func Init() { migrations.AddTableRuntime, migrations.UpdateTableApp, migrations.UpdateTableHost, + migrations.UpdateTableWebsite, }) if err := m.Migrate(); err != nil { global.LOG.Error(err) diff --git a/backend/init/migration/migrations/init.go b/backend/init/migration/migrations/init.go index e7b7ea5e0..7c8c94239 100644 --- a/backend/init/migration/migrations/init.go +++ b/backend/init/migration/migrations/init.go @@ -251,7 +251,7 @@ var AddDefaultGroup = &gormigrate.Migration{ var AddTableRuntime = &gormigrate.Migration{ ID: "20230406-add-table-runtime", Migrate: func(tx *gorm.DB) error { - return tx.AutoMigrate(&model.Runtime{}, &model.Website{}) + return tx.AutoMigrate(&model.Runtime{}) }, } @@ -274,3 +274,10 @@ var UpdateTableHost = &gormigrate.Migration{ return nil }, } + +var UpdateTableWebsite = &gormigrate.Migration{ + ID: "20230406-update-table-website", + Migrate: func(tx *gorm.DB) error { + return tx.AutoMigrate(&model.Website{}) + }, +} diff --git a/backend/utils/nginx/components/config.go b/backend/utils/nginx/components/config.go index 7592895e7..ec5107c08 100644 --- a/backend/utils/nginx/components/config.go +++ b/backend/utils/nginx/components/config.go @@ -44,6 +44,7 @@ var repeatKeys = map[string]struct { "set": {}, "if": {}, "proxy_set_header": {}, + "location": {}, } func IsRepeatKey(key string) bool { diff --git a/backend/utils/nginx/components/location.go b/backend/utils/nginx/components/location.go index f3d585af0..784ff8c34 100644 --- a/backend/utils/nginx/components/location.go +++ b/backend/utils/nginx/components/location.go @@ -24,8 +24,8 @@ func NewLocation(directive *Directive) *Location { location.Match = directive.Parameters[0] return location } else if len(directive.Parameters) == 2 { - location.Modifier = directive.Parameters[0] location.Match = directive.Parameters[1] + location.Modifier = directive.Parameters[0] return location } return nil diff --git a/backend/utils/nginx/components/server.go b/backend/utils/nginx/components/server.go index a33f8e008..a7b6da79d 100644 --- a/backend/utils/nginx/components/server.go +++ b/backend/utils/nginx/components/server.go @@ -116,14 +116,22 @@ func (s *Server) RemoveDirective(key string, params []string) { directives := s.Directives var newDirectives []IDirective for _, dir := range directives { - if dir.GetName() == key { - if IsRepeatKey(key) && len(params) > 0 { - oldParams := dir.GetParameters() - if oldParams[0] == params[0] { + if key == "location" { + if location, ok := dir.(*Location); ok { + if len(params) == 2 && location.Match == params[1] && location.Modifier == params[0] { + continue + } + } + } else { + if dir.GetName() == key { + if len(params) > 0 { + oldParams := dir.GetParameters() + if oldParams[0] == params[0] { + continue + } + } else { continue } - } else { - continue } } newDirectives = append(newDirectives, dir) diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 7f2ba5a71..31186c7ba 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -55,6 +55,7 @@ export namespace Website { webSiteGroupId: number; otherDomains: string; proxy: string; + proxyType: string; } export interface WebSiteUpdateReq {