Skip to content
JamLee edited this page Feb 14, 2025 · 1 revision

Go Proxy

package main

import (
	"io"
	"log"
	"net/http"
	"net/url"
	"runtime"
)

func main() {
	runtime.GOMAXPROCS(1)

	// 设置后端服务器地址
	backendURL, err := url.Parse("http://127.0.0.1:8888")
	if err != nil {
		log.Fatal("后端服务器地址解析错误:", err)
	}

	proxy := &http.Server{
		Addr: ":8080",
		Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			// 修改请求URL,指向后端服务器
			r.URL.Host = backendURL.Host
			r.URL.Scheme = backendURL.Scheme
			r.Host = backendURL.Host

			// 创建新的请求
			proxyReq, err := http.NewRequest(r.Method, r.URL.String(), r.Body)
			if err != nil {
				http.Error(w, err.Error(), http.StatusInternalServerError)
				return
			}

			// 复制原始请求的 header
			for key, values := range r.Header {
				for _, value := range values {
					proxyReq.Header.Add(key, value)
				}
			}

			// 发送代理请求
			client := &http.Client{}
			resp, err := client.Do(proxyReq)
			if err != nil {
				http.Error(w, err.Error(), http.StatusInternalServerError)
				return
			}
			defer resp.Body.Close()

			// 复制响应 header
			for key, values := range resp.Header {
				for _, value := range values {
					w.Header().Add(key, value)
				}
			}

			// 设置状态码
			w.WriteHeader(resp.StatusCode)

			// 复制响应体
			io.Copy(w, resp.Body)
		}),
	}

	log.Printf("代理服务器启动在 :8080,后端服务器地址: %s", backendURL)
	if err := proxy.ListenAndServe(); err != nil {
		log.Fatal("代理服务器错误:", err)
	}
}

Nodejs Proxy

const http = require('http');

// 设置后端服务器地址
const backendHost = '127.0.0.1';
const backendPort = 8888;

// 创建代理服务器
const server = http.createServer((clientReq, clientRes) => {
    const options = {
        hostname: backendHost,
        port: backendPort,
        path: clientReq.url,
        method: clientReq.method,
        headers: clientReq.headers
    };

    const proxyReq = http.request(options, (backendRes) => {
        // 复制响应头
        clientRes.writeHead(backendRes.statusCode, backendRes.headers);
        
        // 复制响应体
        backendRes.pipe(clientRes);
    });

    // 错误处理
    proxyReq.on('error', (err) => {
        console.error('代理请求错误:', err);
        clientRes.writeHead(500);
        clientRes.end('代理服务器错误');
    });

    // 将客户端请求体传递给后端
    clientReq.pipe(proxyReq);
});

// 启动服务器
const PORT = 8080;
server.listen(PORT, () => {
    console.log(`代理服务器启动在 :${PORT},后端服务器地址: http://${backendHost}:${backendPort}`);
});

// 错误处理
server.on('error', (err) => {
    console.error('服务器错误:', err);
});

// 确保只使用单核
process.env.UV_THREADPOOL_SIZE = '1';
Clone this wiki locally