首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Go中获得“虚拟主机”功能?

如何在Go中获得“虚拟主机”功能?
EN

Stack Overflow用户
提问于 2013-01-05 10:14:27
回答 2查看 5.1K关注 0票数 11

使用Nginx/Django创建虚拟主机就像编写适当的配置一样简单。

对于Go,我找到了这个https://codereview.appspot.com/4070043,我知道我必须使用ServeMux,但是如何实现它呢?

我的意思是,我必须为所有项目创建一个二进制文件,或者我必须创建一些“路由器”服务器,它将根据主机名路由请求?如何做到"Go"-way?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-05 13:18:34

您将使用ServeMux,这是正确的。godoc for ServeMux中有一些关于如何使用它的详细信息。

在标准的http包中,有DefaultServeMux,可以使用顶级处理函数对其进行操作。例如,一个简单的虚拟主机应用程序可能如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的请求都将命中第二个处理程序,所有到其他主机的请求都将命中第一个处理程序。

票数 23
EN

Stack Overflow用户

发布于 2014-10-06 21:13:45

下面是如何使用golang提供“虚拟主机”功能的另一个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中和任何端口中。如果您希望转发到不同的物理服务器,这并不重要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14170799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文