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

Aci*_*dic 5 port http nginx go

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

例如,Golang app 1正在侦听端口8084,Golang app 2正在侦听端口8060.当有人从域请求时,我希望Golang app 1能够在域example1.com和Golang应用2请求时提供服务example2.com.

我相信你可以用Nginx做到这一点但我无法弄清楚如何做到这一点.

Mar*_*ovy 8

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
Run Code Online (Sandbox Code Playgroud)

然后使用gorilla/mux或类似方法为每个主机创建路由,甚至从中获取"子路由器"

r := mux.NewRouter()
s := r.Host("www.example.com").Subrouter()
Run Code Online (Sandbox Code Playgroud)

所以完整的解决方案就是

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.ListenAndServe(":8000", nil)
}
Run Code Online (Sandbox Code Playgroud)


Sat*_*tys 3

请尝试以下代码,

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;
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

app_ip 是主机的 IP,如果在同一台机器上,则输入http://127.0.0.1http://localhost