package main import ( "flag" "fmt" "log" "net/http" "os" "os/signal" "syscall" "github.com/darkit/goproxy" "github.com/darkit/goproxy/config" ) func main() { // 解析命令行参数 listenAddr := flag.String("listen", ":8080", "监听地址") targetAddr := flag.String("target", "http://localhost:8080", "目标服务地址") enableHTTPS := flag.Bool("https", false, "启用HTTPS") certFile := flag.String("cert", "", "TLS证书文件") keyFile := flag.String("key", "", "TLS私钥文件") enableCache := flag.Bool("cache", false, "启用缓存") enableCompression := flag.Bool("compression", true, "启用压缩") enableCORS := flag.Bool("cors", false, "启用CORS") preserveClientIP := flag.Bool("preserve-ip", true, "保留客户端IP") addXForwardedFor := flag.Bool("x-forwarded-for", true, "添加X-Forwarded-For头") addXRealIP := flag.Bool("x-real-ip", true, "添加X-Real-IP头") flag.Parse() // 创建配置 cfg := config.DefaultConfig() // 配置反向代理 cfg.ReverseProxy = true // 启用反向代理模式 cfg.ListenAddr = *listenAddr // 监听地址 cfg.TargetAddr = *targetAddr // 目标地址 cfg.DecryptHTTPS = *enableHTTPS // 启用HTTPS cfg.TLSCert = *certFile // 证书文件 cfg.TLSKey = *keyFile // 私钥文件 cfg.EnableCache = *enableCache // 启用缓存 cfg.EnableCompression = *enableCompression // 启用压缩 cfg.EnableCORS = *enableCORS // 启用CORS cfg.PreserveClientIP = *preserveClientIP // 保留客户端IP cfg.AddXForwardedFor = *addXForwardedFor // 添加X-Forwarded-For头 cfg.AddXRealIP = *addXRealIP // 添加X-Real-IP头 // 创建代理实例 proxy := goproxy.New(&goproxy.Options{ Config: cfg, }) // 创建HTTP服务器 server := &http.Server{ Addr: *listenAddr, Handler: proxy, } // 优雅退出 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 启动HTTP服务器 go func() { fmt.Printf("反向代理启动在 %s,转发到 %s\n", *listenAddr, *targetAddr) var err error if *enableHTTPS && *certFile != "" && *keyFile != "" { err = server.ListenAndServeTLS(*certFile, *keyFile) } else { err = server.ListenAndServe() } if err != nil && err != http.ErrServerClosed { log.Fatalf("服务器启动失败: %v\n", err) } }() // 等待退出信号 <-quit fmt.Println("服务器正在关闭...") // 关闭服务器 server.Shutdown(nil) // 简化版,不使用context fmt.Println("服务器已关闭") }