11

Nginx / Djangoを使用すると、適切な構成を作成するのと同じくらい簡単に仮想ホストを作成できます。

Goの場合、このhttps://codereview.appspot.com/4070043を見つけました。使用する必要があることは理解していますServeMuxが、どのように実装するのですか?

つまり、すべてのプロジェクトに1つのバイナリが必要ですか、それともホスト名に応じてリクエストをルーティングする「ルーター」サーバーを作成する必要がありますか?それを「行く」方法で行う方法は?

4

2 に答える 2

23

ServeMuxを使用するのは正しいです。ServeMuxのgodocには、その使用方法に関する詳細情報があります。

標準のhttpパッケージには、最上位のHandle関数を使用して操作できるDefaultServeMuxがあります。たとえば、単純な仮想ホストアプリケーションは次のようになります。

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へのすべてのリクエストが2番目のハンドラーにヒットし、他のホストへのすべてのリクエストが最初のハンドラーにヒットします。

于 2013-01-05T13:18:34.210 に答える
2

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

この場合、各「仮想ホスト」は、他のgolang net.http Webサーバーやnginxなどの他の従来のWebサーバーのように、任意のhttpサーバーにすることができます。それらのそれぞれは、同じIPと別のポート、または別のIPと任意のポートのいずれかにあります。別の物理サーバーに転送する場合は、転送するかどうかは関係ありません。

于 2014-10-06T21:13:45.243 に答える