使用Nginx / Django创建虚拟主机就像编写适当的配置一样简单。
对于Go,我发现了这个https://codereview.appspot.com/4070043,我知道我必须使用ServeMux
但是如何实现它?
我的意思是我必须为所有项目提供1个二进制文件,或者我必须创建一些“路由器”服务器,它将根据主机名路由请求?怎么做“走”了?
答案 0 :(得分:21)
您使用ServeMux是正确的。 godoc for ServeMux有一些关于如何使用它的详细信息。
在标准的http包中,有一个DefaultServeMux可以使用顶级Handle函数进行操作。例如,一个简单的虚拟主机应用程序可能如下所示:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, world!")
})
http.HandleFunc("qa.example.com/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, improved world!")
})
http.ListenAndServe(":8080", nil)
}
在此示例中,对qa.example.com的所有请求都将命中第二个处理程序,对其他主机的所有请求都将命中第一个处理程序。
答案 1 :(得分:0)
以下是如何使用golang提供“虚拟主机”功能的另一个示例:
package main
import(
"net/url"
"net/http"
"net/http/httputil"
)
func main() {
vhost1, err := url.Parse("http://127.0.0.1:1980")
if err != nil {
panic(err)
}
proxy1 := httputil.NewSingleHostReverseProxy(vhost1)
http.HandleFunc("publicdomain1.com/", handler(proxy1))
vhost2, err := url.Parse("http://127.0.0.1:1981")
if err != nil {
panic(err)
}
proxy2 := httputil.NewSingleHostReverseProxy(vhost2)
http.HandleFunc("publicdomain2.com/", handler(proxy2))
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) {
p.ServeHTTP(w, r)
}
}
在这种情况下,每个“虚拟主机”可以是任何http服务器,如其他golang net.http Web服务器,甚至是其他传统的Web服务器,如nginx。它们中的每一个都可以在同一个ip和另一个端口中,或者在另一个ip和任何端口中。如果您希望将其转发到其他物理服务器,则无关紧要。