我想从主机为在 VM 中运行的两个或多个 Web 应用程序提供服务(不同的端口,有时在同一端口下的不同目录中),因为我需要先登录用户才能访问那些我无法使用的应用程序像 Nginx 或 Apache 这样的静态代理。
所以这是我的情况:
192.168.1.1 : 是主机 ip
192.168.1.2 : 是虚拟机 ip
在VM里面我有这个:
192.168.1.2/owncloud:owncloud 地址
192.168.1.2:8080:另一个应用程序
192.168.1.2:8888:第三个应用程序
我想要这个:
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