Golang实现的简易反向代理v2版本
Golang实现的简易反向代理v2版本 简单反向代理服务器第二版现已发布。现在我们为服务器添加了HTTPS支持,并提供了更完善的文档(包括如何使用自签名证书)。
geosoft1/reverseproxy
简单的反向代理服务器。可用于通过单一域名访问不同服务器(或虚拟机)上的Web应用程序。
[LE]
祝使用愉快。
更多关于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/httputil和crypto/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)位于可访问路径,或修改代码中的文件路径。

