From d2cd5e226a918bae61e327d01a1e13a77a19d59f Mon Sep 17 00:00:00 2001 From: CityFun <31820853+zhengkunwang223@users.noreply.github.com> Date: Wed, 21 May 2025 17:00:50 +0800 Subject: [PATCH] feat: Refactor reverse proxy to reuse Transport and enable connection pooling (#8772) --- core/init/proxy/proxy.go | 39 +++++++++++++++++++++++++++++++++++++++ core/init/router/proxy.go | 34 ++++------------------------------ core/server/server.go | 2 ++ 3 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 core/init/proxy/proxy.go diff --git a/core/init/proxy/proxy.go b/core/init/proxy/proxy.go new file mode 100644 index 000000000..efda4a052 --- /dev/null +++ b/core/init/proxy/proxy.go @@ -0,0 +1,39 @@ +package proxy + +import ( + "context" + "net" + "net/http" + "net/http/httputil" + "time" +) + +var ( + sockPath = "/etc/1panel/agent.sock" + + LocalAgentProxy *httputil.ReverseProxy +) + +func Init() { + dialUnix := func(ctx context.Context, network, addr string) (net.Conn, error) { + return net.Dial("unix", sockPath) + } + transport := &http.Transport{ + DialContext: dialUnix, + ForceAttemptHTTP2: false, + MaxIdleConns: 50, + MaxIdleConnsPerHost: 50, + IdleConnTimeout: 30 * time.Second, + } + LocalAgentProxy = &httputil.ReverseProxy{ + Director: func(req *http.Request) { + req.URL.Scheme = "http" + req.URL.Host = "unix" + }, + Transport: transport, + ErrorHandler: func(rw http.ResponseWriter, req *http.Request, err error) { + rw.WriteHeader(http.StatusBadGateway) + rw.Write([]byte("Bad Gateway")) + }, + } +} diff --git a/core/init/router/proxy.go b/core/init/router/proxy.go index 893e4d760..4c9f2924b 100644 --- a/core/init/router/proxy.go +++ b/core/init/router/proxy.go @@ -1,22 +1,18 @@ package router import ( - "context" - "net" + "github.com/1Panel-dev/1Panel/core/init/proxy" "net/http" - "net/http/httputil" "net/url" "os" "strconv" "strings" + "github.com/1Panel-dev/1Panel/core/app/api/v2/helper" "github.com/1Panel-dev/1Panel/core/app/repo" "github.com/1Panel-dev/1Panel/core/cmd/server/res" "github.com/1Panel-dev/1Panel/core/constant" "github.com/1Panel-dev/1Panel/core/global" - "github.com/1Panel-dev/1Panel/core/utils/security" - - "github.com/1Panel-dev/1Panel/core/app/api/v2/helper" "github.com/1Panel-dev/1Panel/core/utils/xpack" "github.com/gin-gonic/gin" ) @@ -54,35 +50,13 @@ func Proxy() gin.HandlerFunc { return } - if !strings.HasPrefix(c.Request.URL.Path, "/api/v2/core") && (currentNode == "local" || len(currentNode) == 0 || currentNode == "127.0.0.1") { + if !strings.HasPrefix(c.Request.URL.Path, "/api/v2/core") && (currentNode == "local" || len(currentNode) == 0) { sockPath := "/etc/1panel/agent.sock" if _, err := os.Stat(sockPath); err != nil { helper.ErrorWithDetail(c, http.StatusBadRequest, "ErrProxy", err) return } - dialUnix := func() (conn net.Conn, err error) { - return net.Dial("unix", sockPath) - } - transport := &http.Transport{ - DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { - return dialUnix() - }, - } - proxy := &httputil.ReverseProxy{ - Director: func(req *http.Request) { - req.URL.Scheme = "http" - req.URL.Host = "unix" - }, - Transport: transport, - ModifyResponse: func(response *http.Response) error { - if response.StatusCode == 404 { - security.HandleNotSecurity(c, "") - c.Abort() - } - return nil - }, - } - proxy.ServeHTTP(c.Writer, c.Request) + proxy.LocalAgentProxy.ServeHTTP(c.Writer, c.Request) c.Abort() return } diff --git a/core/server/server.go b/core/server/server.go index 9d696c109..f8e370dd1 100644 --- a/core/server/server.go +++ b/core/server/server.go @@ -4,6 +4,7 @@ import ( "crypto/tls" "encoding/gob" "fmt" + "github.com/1Panel-dev/1Panel/core/init/proxy" "net" "net/http" "os" @@ -45,6 +46,7 @@ func Start() { InitOthers() run.Init() + proxy.Init() rootRouter := router.Routers()