chore(release): 发布 v1.9.2
CI / verify (push) Canceled after 0s
Docker Release / build-and-push (amd64, linux/amd64) (push) Canceled after 0s
Docker Release / build-and-push (arm64, linux/arm64) (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
Docker Release / create-manifest (push) Canceled after 0s

- 「公网服务端」新增 Nginx 启停控制(Agent 0.15.2,停止带二次确认)
- frps 启动失败不再误报成功,并增强启动诊断
- frps vhost 端口禁止 80/443,避免与 VPS 上 Nginx 冲突
- 旧服务端配置的 tcp_mux / login_fail_exit 默认值补齐
- 新增安全审查、页面布局方案与场景操作文档
This commit is contained in:
2026-10-07 19:26:02 +08:00
parent a7d71752e3
commit 2a0740a60f
55 changed files with 5065 additions and 467 deletions
+40 -6
View File
@@ -7,9 +7,15 @@ import (
"io"
"net/http"
"strings"
"sync"
"time"
)
const (
legacyProxyQueryTimeout = 8 * time.Second
legacyProxyConcurrency = 4
)
// frps 管理接口(webServer)返回的代理状态结构,仅取本模块用到的字段。
type frpsProxyStatus struct {
Name string `json:"name"`
@@ -118,15 +124,43 @@ func (c *frpsTrafficClient) fetchLegacyProxyByName(ctx context.Context, server S
// fetchLegacyRouteProxies 按候选规则逐条查询旧版 frps,并保留域名到真实代理名的映射。
func (c *frpsTrafficClient) fetchLegacyRouteProxies(ctx context.Context, server Server, password string, names []string) ServerTraffic {
empty := map[string]ProxyTraffic{}
if len(names) == 0 {
return ServerTraffic{ServerID: server.ID, OK: true, Proxies: empty}
}
queryCtx, cancel := context.WithTimeout(ctx, legacyProxyQueryTimeout)
defer cancel()
type queryResult struct {
info legacyProxyInfo
err error
}
results := make(chan queryResult, len(names))
semaphore := make(chan struct{}, legacyProxyConcurrency)
var wait sync.WaitGroup
for _, name := range names {
wait.Add(1)
go func(name string) {
defer wait.Done()
semaphore <- struct{}{}
defer func() { <-semaphore }()
proxyName := name
if user := strings.TrimSpace(server.Options.User); user != "" && !strings.HasPrefix(proxyName, user+".") {
proxyName = user + "." + proxyName
}
info, _, err := c.fetchLegacyProxyByName(queryCtx, server, password, proxyName)
results <- queryResult{info: info, err: err}
}(name)
}
go func() {
wait.Wait()
close(results)
}()
proxies := make(map[string]ProxyTraffic)
proxyNamesByDomain := make(map[string]string)
var lastErr error
for _, name := range names {
proxyName := name
if user := strings.TrimSpace(server.Options.User); user != "" && !strings.HasPrefix(proxyName, user+".") {
proxyName = user + "." + proxyName
}
info, _, err := c.fetchLegacyProxyByName(ctx, server, password, proxyName)
for result := range results {
info, err := result.info, result.err
if err != nil {
lastErr = err
continue