Golang实现的简易反向代理v2版本

Golang实现的简易反向代理v2版本 简单反向代理服务器第二版现已发布。现在我们为服务器添加了HTTPS支持,并提供了更完善的文档(包括如何使用自签名证书)。

GitHub

geosoft1/reverseproxy

头像

简单的反向代理服务器。可用于通过单一域名访问不同服务器(或虚拟机)上的Web应用程序。

[LE]

  • 旧项目仍可通过1.0.1版本获取,但新项目已包含其所有功能
  • 为了测试HTTPS部分及其他功能,新的hello服务器现已可用 🙂

祝使用愉快。


更多关于Golang实现的简易反向代理v2版本的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang实现的简易反向代理v2版本的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是使用Go语言实现支持HTTPS的简易反向代理服务器的示例代码。该代码基于标准库的net/http/httputilcrypto/tls包构建,支持自定义证书配置。

package main

import (
	"crypto/tls"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
	"strings"
)

// 反向代理处理器结构体
type ReverseProxy struct {
	target *url.URL
	proxy  *httputil.ReverseProxy
}

// 创建新的反向代理实例
func NewReverseProxy(target string) *ReverseProxy {
	u, _ := url.Parse(target)
	rp := httputil.NewSingleHostReverseProxy(u)
	
	// 修改请求头以正确传递原始主机信息
	originalDirector := rp.Director
	rp.Director = func(req *http.Request) {
		originalDirector(req)
		req.Header.Set("X-Forwarded-Host", req.Header.Get("Host"))
		req.Host = u.Host
	}
	
	return &ReverseProxy{
		target: u,
		proxy:  rp,
	}
}

// 实现http.Handler接口
func (rp *ReverseProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	log.Printf("代理请求: %s %s -> %s", r.Method, r.URL.Path, rp.target)
	rp.proxy.ServeHTTP(w, r)
}

// 路由映射配置
type ProxyConfig struct {
	PathPrefix string
	TargetURL  string
}

func main() {
	// 配置多个后端服务路由
	configs := []ProxyConfig{
		{"/app1/", "http://localhost:8081"},
		{"/app2/", "http://localhost:8082"},
		{"/api/", "https://api.example.com"},
	}
	
	// 创建多路复用器
	mux := http.NewServeMux()
	
	// 为每个路由创建反向代理
	for _, config := range configs {
		proxy := NewReverseProxy(config.TargetURL)
		mux.Handle(config.PathPrefix, proxy)
	}
	
	// 默认处理器
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusNotFound)
		w.Write([]byte("未找到对应的代理路由"))
	})
	
	// TLS配置 - 使用自签名证书
	tlsConfig := &tls.Config{
		MinVersion: tls.VersionTLS12,
	}
	
	// 创建HTTPS服务器
	server := &http.Server{
		Addr:      ":8443",
		Handler:   mux,
		TLSConfig: tlsConfig,
	}
	
	log.Println("反向代理服务器启动在 :8443 (HTTPS)")
	
	// 启动HTTPS服务器,需要提供证书和密钥文件路径
	err := server.ListenAndServeTLS("cert.pem", "key.pem")
	if err != nil {
		log.Fatal("服务器启动失败: ", err)
	}
}

证书生成示例(使用OpenSSL生成自签名证书):

# 生成私钥
openssl genrsa -out key.pem 2048

# 生成证书签名请求
openssl req -new -key key.pem -out cert.csr

# 生成自签名证书(有效期为365天)
openssl x509 -req -days 365 -in cert.csr -signkey key.pem -out cert.pem

此实现包含以下关键特性:

  • 支持多路径路由到不同后端服务
  • 完整的HTTPS/TLS支持
  • 请求头正确处理
  • 简单的日志记录
  • 使用标准库实现,无需外部依赖

运行前请确保证书文件(cert.pem和key.pem)位于可访问路径,或修改代码中的文件路径。

回到顶部