gpt4 book ai didi

具有多个应用程序的 Golang 反向代理

转载 作者:IT老高 更新时间:2023-10-28 13:10:57 25 4
gpt4 key购买 nike

我想从主机为在 VM 中运行的两个或多个 Web 应用程序提供服务(不同的端口,有时在同一端口下的不同目录中),因为我需要先登录用户才能访问这些应用程序不能使用像 Nginx 或 Apache 这样的静态代理。

这是我的情况:

192.168.1.1 : is the host ip
192.168.1.2 : is the VM ip

在虚拟机里面我有这个:

192.168.1.2/owncloud : owncloud address
192.168.1.2:8080 : an other app
192.168.1.2:8888 : 3rd app

我想要这个:

192.168.1.1/app1 --> 192.168.1.2/owncloud
192.168.1.1/app2 --> 192.168.1.2:8080
192.168.1.1/app2 --> 192.168.1.2:8888

我曾尝试使用 golang httputil.ReverseProxy 来实现此路由,但没有多大成功:我的代码基于这项工作:gist

package main

import(
"log"
"net/url"
"net/http"
"net/http/httputil"
)

func main() {
remote, err := url.Parse("http://192.168.1.2:8080")
if err != nil {
panic(err)
}

proxy := httputil.NewSingleHostReverseProxy(remote)
http.HandleFunc("/app2", handler(proxy))
err = http.ListenAndServe(":80", nil)
if err != nil {
panic(err)
}
}

func handler(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL)
r.URL.Path = "/"
p.ServeHTTP(w, r)
}
}

编辑:
我已更改 vm ip 地址:192.168.1.2 而不是 192.168.1.1

最佳答案

制作这样的 map

hostTarget = map[string]string{
"app1.domain.com": "http://192.168.1.2/owncloud",
"app2.domain.com": "http://192.168.1.2:8080",
"app3.domain.com": "http://192.168.1.2:8888",
}

使用 httputil.ReverseProxy 构建您的处理程序

type baseHandle struct{}

func (h *baseHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
host := r.Host

if target, ok := hostTarget[host]; ok {
remoteUrl, err := url.Parse(target)
if err != nil {
log.Println("target parse fail:", err)
return
}

proxy := httputil.NewSingleHostReverseProxy(remoteUrl)
proxy.ServeHTTP(w, r)
return
}
w.Write([]byte("403: Host forbidden " + host))
}

聆听并服务

h := &baseHandle{}
http.Handle("/", h)

server := &http.Server{
Addr: ":8080",
Handler: h,
}
log.Fatal(server.ListenAndServe())

您可以在全局 map 中缓存httputil.ReverseProxyall in file以上。

这里是 SSLDocker最适合您的项目。

关于具有多个应用程序的 Golang 反向代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21055182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com