我安装了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做到这一点,但我还没有弄清楚如何。
答案 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.1
或http://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
上了解更多有关它的信息。