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

我正在运行安装了Ubuntu的VPS。 我怎样才能使用相同的VPS(相同的IP)为多个Golang网站提供服务,而不必在URL中指定端口(xxx.xxx.xxx.xxx:8084)?

例如, Golang应用程序1正在侦听端口8084,Golang应用程序2正在侦听端口8060 。 我希望Golang应用程序1在有人从域example1.com请求时提供,而Golang应用程序2则在有人从example2.com请求时提供服务。

我相信你可以用Nginx做到这一点,但我一直无法弄清楚。

请尝试下面的代码,

 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

Nginx免费解决方案。

首先,您可以将端口80上的连接重定向为普通用户

 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() 

所以完整的解决方案将是

 package main import ( "net/http" "github.com/gorilla/mux" "fmt" ) func Example1IndexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello www.example1.com!") // send data to client side } func Example2IndexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello www.example2.com!") // send data to client side } func main() { r := mux.NewRouter() s1 := r.Host("www.example1.com").Subrouter() s2 := r.Host("www.example2.com").Subrouter() s1.HandleFunc("/", Example1IndexHandler) s2.HandleFunc("/", Example2IndexHandler) http.listnAndServe(":8000", nil) }