在一个IP上托管多个Golang站点并根据域请求提供服务?

时间:2016-10-06 10:57:31

标签: http nginx go port

我安装了Ubuntu运行VPS。如何在不指定URL的端口(xxx.xxx.xxx.xxx:8084)的情况下,使用相同的VPS(相同IP)为多个Golang网站提供服务?

例如, Golang app 1正在侦听端口8084 Golang app 2正在侦听端口8060 。我希望当有人从域example1.com请求来自域example2.com和Golang应用2时请求投放Golang应用1。

我确定你可以用Nginx做到这一点,但我还没有弄清楚如何。

3 个答案:

答案 0 :(得分:7)

Nginx免费解决方案。

首先,您可以重定向connections on port 80 as a normal user

CR

然后使用gorilla/mux或类似方法为每个主机创建路由,甚至获得一个" subrouter"从它

sudo apt-get install iptables-persistent
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
sudo netfilter-persistent save
sudo netfilter-persistent reload

所以完整的解决方案是

r := mux.NewRouter()
s := r.Host("www.example.com").Subrouter()

答案 1 :(得分:1)

请尝试以下代码,

server {
   ...
   server_name www.example1.com example1.com;
   ...
   location / {
      proxy_pass app_ip:8084;
   }
   ...
}

...

server {
   ...
   server_name www.example2.com example2.com;
   ...
   location / {
      proxy_pass app_ip:8060;
   }
   ...
}

app_ip是机器的ip,无论托管在哪里,如果在同一台机器上,请http://127.0.0.1http://localhost

答案 2 :(得分:1)

您不需要任何第三方路由器。只需创建实现 http.Handler 接口的主机开关即可。

import (
    "fmt"
    "log"
    "net/http"
)

type HostSwitch map[string]http.Handler

// Implement the ServerHTTP method
func (hs HostSwitch) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if handler, ok := hs[r.Host]; ok && handler != nil {
        handler.ServeHTTP(w, r)
    } else {
        http.Error(w, "Forbidden", http.StatusForbidden)
    }
}

我希望这能给您带来灵感。如果您需要完整的代码示例https://play.golang.org/p/bMbKPGE7LhT

您也可以在my blog

上了解更多有关它的信息。