From 7940b50a7259f074a859afa727d6d5df5d54591b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Thu, 8 Jan 2026 01:43:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20PHP=E7=8E=AF=E5=A2=83=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/data/website.go | 2 +- pkg/webserver/apache/vhost.go | 2 +- pkg/webserver/nginx/proxy.go | 12 ++-- pkg/webserver/nginx/vhost.go | 2 +- pkg/webserver/types/proxy.go | 3 +- pkg/webserver/webserver.go | 3 - web/src/api/apps/php/index.ts | 34 --------- web/src/api/panel/environment/php/index.ts | 34 +++++++++ web/src/views/app/EnvironmentView.vue | 9 ++- web/src/views/apps/php74/IndexView.vue | 11 --- web/src/views/apps/php74/route.ts | 22 ------ web/src/views/apps/php80/IndexView.vue | 11 --- web/src/views/apps/php81/IndexView.vue | 11 --- web/src/views/apps/php81/route.ts | 22 ------ web/src/views/apps/php82/IndexView.vue | 11 --- web/src/views/apps/php82/route.ts | 22 ------ web/src/views/apps/php83/IndexView.vue | 11 --- web/src/views/apps/php83/route.ts | 22 ------ web/src/views/apps/php84/IndexView.vue | 11 --- web/src/views/apps/php84/route.ts | 22 ------ .../PhpView.vue => environment/PHPView.vue} | 70 +++++++++---------- .../{apps/php80 => environment}/route.ts | 16 +++-- web/src/views/home/route.ts | 2 +- 23 files changed, 93 insertions(+), 272 deletions(-) delete mode 100644 web/src/api/apps/php/index.ts create mode 100644 web/src/api/panel/environment/php/index.ts delete mode 100644 web/src/views/apps/php74/IndexView.vue delete mode 100644 web/src/views/apps/php74/route.ts delete mode 100644 web/src/views/apps/php80/IndexView.vue delete mode 100644 web/src/views/apps/php81/IndexView.vue delete mode 100644 web/src/views/apps/php81/route.ts delete mode 100644 web/src/views/apps/php82/IndexView.vue delete mode 100644 web/src/views/apps/php82/route.ts delete mode 100644 web/src/views/apps/php83/IndexView.vue delete mode 100644 web/src/views/apps/php83/route.ts delete mode 100644 web/src/views/apps/php84/IndexView.vue delete mode 100644 web/src/views/apps/php84/route.ts rename web/src/views/{apps/php/PhpView.vue => environment/PHPView.vue} (78%) rename web/src/views/{apps/php80 => environment}/route.ts (54%) diff --git a/internal/data/website.go b/internal/data/website.go index d53e936e..2d597f4c 100644 --- a/internal/data/website.go +++ b/internal/data/website.go @@ -491,7 +491,7 @@ func (r *websiteRepo) Update(req *request.WebsiteUpdate) error { Cert: certPath, Key: keyPath, Protocols: lo.If(len(req.SSLProtocols) > 0, req.SSLProtocols).Else([]string{"TLSv1.2", "TLSv1.3"}), - Ciphers: lo.If(req.SSLCiphers != "", req.SSLCiphers).Else("HIGH:!aNULL:!MD5"), + Ciphers: lo.If(req.SSLCiphers != "", req.SSLCiphers).Else("ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305"), HSTS: req.HSTS, OCSP: req.OCSP, HTTPRedirect: req.HTTPRedirect, diff --git a/pkg/webserver/apache/vhost.go b/pkg/webserver/apache/vhost.go index d77be462..82db0864 100644 --- a/pkg/webserver/apache/vhost.go +++ b/pkg/webserver/apache/vhost.go @@ -147,7 +147,7 @@ func (v *baseVhost) Listen() []types.Listen { // Apache 的监听配置通常在 VirtualHost 的参数中 // 例如: for _, arg := range v.vhost.Args { - listen := types.Listen{Address: arg} + listen := types.Listen{Address: arg, Args: []string{}} result = append(result, listen) } diff --git a/pkg/webserver/nginx/proxy.go b/pkg/webserver/nginx/proxy.go index 3694a4e1..742b766e 100644 --- a/pkg/webserver/nginx/proxy.go +++ b/pkg/webserver/nginx/proxy.go @@ -121,7 +121,6 @@ func parseProxyFile(filePath string) (*types.Proxy, error) { if rm := resolverPattern.FindStringSubmatch(blockContent); rm != nil { parts := strings.Fields(rm[1]) proxy.Resolver = parts - proxy.AutoRefresh = true // 有 resolver 通常意味着需要自动刷新 } // 解析 resolver_timeout @@ -218,19 +217,16 @@ func generateProxyConfig(proxy types.Proxy) string { sb.WriteString(fmt.Sprintf("location %s {\n", location)) - // resolver 配置(如果启用自动刷新) - if proxy.AutoRefresh && len(proxy.Resolver) > 0 { + // resolver 配置 + if len(proxy.Resolver) > 0 { sb.WriteString(fmt.Sprintf(" resolver %s;\n", strings.Join(proxy.Resolver, " "))) if proxy.ResolverTimeout > 0 { sb.WriteString(fmt.Sprintf(" resolver_timeout %ds;\n", int(proxy.ResolverTimeout.Seconds()))) } - // 使用变量实现动态解析 - sb.WriteString(fmt.Sprintf(" set $backend \"%s\";\n", proxy.Pass)) - sb.WriteString(" proxy_pass $backend;\n") - } else { - sb.WriteString(fmt.Sprintf(" proxy_pass %s;\n", proxy.Pass)) } + sb.WriteString(fmt.Sprintf(" proxy_pass %s;\n", proxy.Pass)) + // Host 头 if proxy.Host != "" { sb.WriteString(fmt.Sprintf(" proxy_set_header Host \"%s\";\n", proxy.Host)) diff --git a/pkg/webserver/nginx/vhost.go b/pkg/webserver/nginx/vhost.go index 80eee739..61190f57 100644 --- a/pkg/webserver/nginx/vhost.go +++ b/pkg/webserver/nginx/vhost.go @@ -158,7 +158,7 @@ func (v *baseVhost) Listen() []types.Listen { var result []types.Listen for _, dir := range directives { l := v.parser.parameters2Slices(dir.GetParameters()) - listen := types.Listen{Address: l[0]} + listen := types.Listen{Address: l[0], Args: []string{}} for i := 1; i < len(l); i++ { listen.Args = append(listen.Args, l[i]) } diff --git a/pkg/webserver/types/proxy.go b/pkg/webserver/types/proxy.go index c48b1850..0b0cda98 100644 --- a/pkg/webserver/types/proxy.go +++ b/pkg/webserver/types/proxy.go @@ -5,7 +5,6 @@ import "time" // Proxy 反向代理配置 type Proxy struct { Location string `form:"location" json:"location" validate:"required"` // 匹配路径,如: "/", "/api", "~ ^/api/v[0-9]+/" - AutoRefresh bool `form:"auto_refresh" json:"auto_refresh"` // 是否自动刷新解析 Pass string `form:"pass" json:"pass" validate:"required"` // 代理地址,如: "http://example.com", "http://backend" Host string `form:"host" json:"host"` // 代理 Host,如: "example.com" SNI string `form:"sni" json:"sni"` // 代理 SNI,如: "example.com" @@ -18,7 +17,7 @@ type Proxy struct { // Upstream 上游服务器配置 type Upstream struct { - Servers map[string]string `form:"servers" json:"servers" validate:"required"` // 上游服务器及权重,如: map["server1"] = "weight=5" + Servers map[string]string `form:"servers" json:"servers" validate:"required"` // 上游服务器及配置,如: map["server1"] = "weight=5 resolve" Algo string `form:"algo" json:"algo"` // 负载均衡算法,如: "least_conn", "ip_hash" Keepalive int `form:"keepalive" json:"keepalive"` // 保持连接数,如: 32 } diff --git a/pkg/webserver/webserver.go b/pkg/webserver/webserver.go index c5fb2c06..ed111572 100644 --- a/pkg/webserver/webserver.go +++ b/pkg/webserver/webserver.go @@ -8,7 +8,6 @@ import ( "github.com/acepanel/panel/pkg/webserver/types" ) -// NewStaticVhost 创建纯静态虚拟主机实例 func NewStaticVhost(serverType Type, configDir string) (types.StaticVhost, error) { switch serverType { case TypeNginx: @@ -20,7 +19,6 @@ func NewStaticVhost(serverType Type, configDir string) (types.StaticVhost, error } } -// NewPHPVhost 创建 PHP 虚拟主机实例 func NewPHPVhost(serverType Type, configDir string) (types.PHPVhost, error) { switch serverType { case TypeNginx: @@ -32,7 +30,6 @@ func NewPHPVhost(serverType Type, configDir string) (types.PHPVhost, error) { } } -// NewProxyVhost 创建反向代理虚拟主机实例 func NewProxyVhost(serverType Type, configDir string) (types.ProxyVhost, error) { switch serverType { case TypeNginx: diff --git a/web/src/api/apps/php/index.ts b/web/src/api/apps/php/index.ts deleted file mode 100644 index 5f488c62..00000000 --- a/web/src/api/apps/php/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { http } from '@/utils' - -export default { - // 设为 CLI 版本 - setCli: (version: number): any => http.Post(`/apps/php${version}/set_cli`), - // 获取配置 - config: (version: number): any => http.Get(`/apps/php${version}/config`), - // 保存配置 - saveConfig: (version: number, config: string): any => - http.Post(`/apps/php${version}/config`, { config }), - // 获取FPM配置 - fpmConfig: (version: number): any => http.Get(`/apps/php${version}/fpm_config`), - // 保存FPM配置 - saveFPMConfig: (version: number, config: string): any => - http.Post(`/apps/php${version}/fpm_config`, { config }), - // 负载状态 - load: (version: number): any => http.Get(`/apps/php${version}/load`), - // 获取日志 - log: (version: number): any => http.Get(`/apps/php${version}/log`), - // 清空日志 - clearLog: (version: number): any => http.Post(`/apps/php${version}/clear_log`), - // 获取慢日志 - slowLog: (version: number): any => http.Get(`/apps/php${version}/slow_log`), - // 清空慢日志 - clearSlowLog: (version: number): any => http.Post(`/apps/php${version}/clear_slow_log`), - // 拓展列表 - extensions: (version: number): any => http.Get(`/apps/php${version}/extensions`), - // 安装拓展 - installExtension: (version: number, slug: string): any => - http.Post(`/apps/php${version}/extensions`, { slug }), - // 卸载拓展 - uninstallExtension: (version: number, slug: string): any => - http.Delete(`/apps/php${version}/extensions`, { slug }) -} diff --git a/web/src/api/panel/environment/php/index.ts b/web/src/api/panel/environment/php/index.ts new file mode 100644 index 00000000..0a25ed1b --- /dev/null +++ b/web/src/api/panel/environment/php/index.ts @@ -0,0 +1,34 @@ +import { http } from '@/utils' + +export default { + // 设为 CLI 版本 + setCli: (slug: number): any => http.Post(`/environment/php/${slug}/set_cli`), + // 获取配置 + config: (slug: number): any => http.Get(`/environment/php/${slug}/config`), + // 保存配置 + saveConfig: (slug: number, config: string): any => + http.Post(`/environment/php/${slug}/config`, { config }), + // 获取FPM配置 + fpmConfig: (slug: number): any => http.Get(`/environment/php/${slug}/fpm_config`), + // 保存FPM配置 + saveFPMConfig: (slug: number, config: string): any => + http.Post(`/environment/php/${slug}/fpm_config`, { config }), + // 负载状态 + load: (slug: number): any => http.Get(`/environment/php/${slug}/load`), + // 获取日志 + log: (slug: number): any => http.Get(`/environment/php/${slug}/log`), + // 清空日志 + clearLog: (slug: number): any => http.Post(`/environment/php/${slug}/clear_log`), + // 获取慢日志 + slowLog: (slug: number): any => http.Get(`/environment/php/${slug}/slow_log`), + // 清空慢日志 + clearSlowLog: (slug: number): any => http.Post(`/environment/php/${slug}/clear_slow_log`), + // 拓展列表 + modules: (slug: number): any => http.Get(`/environment/php/${slug}/modules`), + // 安装拓展 + installModule: (slug: number, module: string): any => + http.Post(`/environment/php/${slug}/modules`, { slug: module }), + // 卸载拓展 + uninstallModule: (slug: number, module: string): any => + http.Delete(`/environment/php/${slug}/modules`, { slug: module }) +} diff --git a/web/src/views/app/EnvironmentView.vue b/web/src/views/app/EnvironmentView.vue index e6c2bc7c..b04c64b2 100644 --- a/web/src/views/app/EnvironmentView.vue +++ b/web/src/views/app/EnvironmentView.vue @@ -1,5 +1,6 @@ - - diff --git a/web/src/views/apps/php74/route.ts b/web/src/views/apps/php74/route.ts deleted file mode 100644 index 04c442e2..00000000 --- a/web/src/views/apps/php74/route.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { RouteType } from '~/types/router' - -const Layout = () => import('@/layout/IndexView.vue') - -export default { - name: 'php74', - path: '/apps/php74', - component: Layout, - isHidden: true, - children: [ - { - name: 'apps-php74-index', - path: '', - component: () => import('./IndexView.vue'), - meta: { - title: 'PHP 7.4', - role: ['admin'], - requireAuth: true - } - } - ] -} as RouteType diff --git a/web/src/views/apps/php80/IndexView.vue b/web/src/views/apps/php80/IndexView.vue deleted file mode 100644 index 6bfd436b..00000000 --- a/web/src/views/apps/php80/IndexView.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/web/src/views/apps/php81/IndexView.vue b/web/src/views/apps/php81/IndexView.vue deleted file mode 100644 index bd2af949..00000000 --- a/web/src/views/apps/php81/IndexView.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/web/src/views/apps/php81/route.ts b/web/src/views/apps/php81/route.ts deleted file mode 100644 index bae0bf65..00000000 --- a/web/src/views/apps/php81/route.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { RouteType } from '~/types/router' - -const Layout = () => import('@/layout/IndexView.vue') - -export default { - name: 'php81', - path: '/apps/php81', - component: Layout, - isHidden: true, - children: [ - { - name: 'apps-php81-index', - path: '', - component: () => import('./IndexView.vue'), - meta: { - title: 'PHP 8.1', - role: ['admin'], - requireAuth: true - } - } - ] -} as RouteType diff --git a/web/src/views/apps/php82/IndexView.vue b/web/src/views/apps/php82/IndexView.vue deleted file mode 100644 index 4b95052b..00000000 --- a/web/src/views/apps/php82/IndexView.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/web/src/views/apps/php82/route.ts b/web/src/views/apps/php82/route.ts deleted file mode 100644 index 64ec376c..00000000 --- a/web/src/views/apps/php82/route.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { RouteType } from '~/types/router' - -const Layout = () => import('@/layout/IndexView.vue') - -export default { - name: 'php82', - path: '/apps/php82', - component: Layout, - isHidden: true, - children: [ - { - name: 'apps-php82-index', - path: '', - component: () => import('./IndexView.vue'), - meta: { - title: 'PHP 8.2', - role: ['admin'], - requireAuth: true - } - } - ] -} as RouteType diff --git a/web/src/views/apps/php83/IndexView.vue b/web/src/views/apps/php83/IndexView.vue deleted file mode 100644 index c89a8594..00000000 --- a/web/src/views/apps/php83/IndexView.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/web/src/views/apps/php83/route.ts b/web/src/views/apps/php83/route.ts deleted file mode 100644 index a70cf944..00000000 --- a/web/src/views/apps/php83/route.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { RouteType } from '~/types/router' - -const Layout = () => import('@/layout/IndexView.vue') - -export default { - name: 'php83', - path: '/apps/php83', - component: Layout, - isHidden: true, - children: [ - { - name: 'apps-php83-index', - path: '', - component: () => import('./IndexView.vue'), - meta: { - title: 'PHP 8.3', - role: ['admin'], - requireAuth: true - } - } - ] -} as RouteType diff --git a/web/src/views/apps/php84/IndexView.vue b/web/src/views/apps/php84/IndexView.vue deleted file mode 100644 index 4c0e875b..00000000 --- a/web/src/views/apps/php84/IndexView.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/web/src/views/apps/php84/route.ts b/web/src/views/apps/php84/route.ts deleted file mode 100644 index 198446ed..00000000 --- a/web/src/views/apps/php84/route.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { RouteType } from '~/types/router' - -const Layout = () => import('@/layout/IndexView.vue') - -export default { - name: 'php84', - path: '/apps/php84', - component: Layout, - isHidden: true, - children: [ - { - name: 'apps-php84-index', - path: '', - component: () => import('./IndexView.vue'), - meta: { - title: 'PHP 8.4', - role: ['admin'], - requireAuth: true - } - } - ] -} as RouteType diff --git a/web/src/views/apps/php/PhpView.vue b/web/src/views/environment/PHPView.vue similarity index 78% rename from web/src/views/apps/php/PhpView.vue rename to web/src/views/environment/PHPView.vue index 5abdae1a..51543dd2 100644 --- a/web/src/views/apps/php/PhpView.vue +++ b/web/src/views/environment/PHPView.vue @@ -1,44 +1,39 @@