Ami*_*ine 10 proxy reverse-proxy go pydio
我想在主机上运行在VM中运行的两个或多个Web应用程序(不同的端口和一些时间在同一端口下的不同目录中),因为我需要在用户访问这些应用程序之前对其进行记录,我无法使用像Nginx或Apache这样的静态代理.
所以这是我的情况:
192.168.1.1:是主机IP
192.168.1.2:是VM ip
在VM内我有这个:
192.168.1.2/owncloud:owncloud地址
192.168.1.2:8080:另一个应用程序
192.168.1.2:8888:第3个应用程序
我想要这个:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经更改了vm ip地址:192.168.1.2而不是192.168.1.1
制作这样的地图
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",
}
Run Code Online (Sandbox Code Playgroud)
使用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))
}
Run Code Online (Sandbox Code Playgroud)
聆听与服务
h := &baseHandle{}
http.Handle("/", h)
server := &http.Server{
Addr: ":8080",
Handler: h,
}
log.Fatal(server.ListenAndServe())
Run Code Online (Sandbox Code Playgroud)
您可以缓存httputil.ReverseProxy在全局地图中,都在上面的文件中。
您最好通过主机名而不是 URL 来执行此操作。例如
owncloud.domain.com -> IP 192.168.1.2,
app2.domain.com -> IP 192.168.1.3
Run Code Online (Sandbox Code Playgroud)
如果您还不知道,主机名只是一个 HTTP 请求标头(主机:domain.com),因此每个 IP 可以有多个主机名(Apache 称之为“命名虚拟主机”)。
使用主机名而不是 URL 的好处是,另一端的 Web 应用程序不知道您添加前缀的 URL,但需要遵守它们,因此您可能会遇到由 Web 应用程序编写的 URL 不存在的问题。针对反向代理所期望的 URL 进行工作。基于主机名的代理应该可以工作,因为大多数网络应用程序不会重写域名。(虽然这是一个巨大的概括,一些网络应用程序将允许您添加代理地址 - 但通常您会遇到较少的主机名问题)
最大的问题是必须在名称服务器上设置子域。我假设您的注册商/DNS 提供商允许您免费创建子域(大多数应该如此),但如果您使用动态 DNS 之类的东西,并在您的家庭宽带连接上运行,那么您将遇到问题,并且会遇到问题。购买您自己的域名,其中子域 CNAME 到您的动态 DNS 地址(或者使用您的动态 DNS 提供商的付费帐户,如果他们提供子域)。
最后一件事,如果您正在研究 owncloud,那么您可能还想看看 Pydio(以前的 AjaxExplore)。它们都有不同的优点和缺点,但我个人认为 Pydio 是更好的产品。
| 归档时间: |
|
| 查看次数: |
11856 次 |
| 最近记录: |