2013-01-05 10 views
7

Z Nginx/Django tworzenie virtualhosts jest tak proste, jak napisanie odpowiedniej konfiguracji.Jak uzyskać funkcjonalność "virtualhost" w Go?

Dla Go znalazłem ten https://codereview.appspot.com/4070043 i rozumiem, że muszę użyć ServeMux, ale jak go wdrożyć?

Mam na myśli, że muszę mieć 1 plik binarny dla wszystkich projektów lub muszę utworzyć serwer "routera", który będzie kierował żądania w zależności od nazwy hosta? Jak to zrobić "idź" - droga?

Odpowiedz

18

Masz rację, że użyjesz ServeMux. Numer godoc for ServeMux zawiera szczegółowe informacje o tym, jak go używać.

W standardowym pakiecie http znajduje się DefaultServeMux, którym można manipulować przy użyciu funkcji najwyższego poziomu Handle. Na przykład, prosta aplikacja wirtualnego hosta może wyglądać następująco:

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

W tym przykładzie wszystkie żądania do qa.example.com trafi drugi obsługi, a wszystkie wnioski do innych komputerów trafi pierwszy obsługi.

+1

Jestem ciekawy drugiej części jego pytania dotyczącego liczby wymaganych plików binarnych. Czy konieczne jest skompilowanie wszystkich oddzielnych projektów hostów wirtualnych w jeden plik binarny, aby serwer ServeMux mógł poprawnie przeprowadzić multipleks? Jedyną inną metodą, którą mogę wymyślić jest użycie pakietu os do uruchamiania innych plików binarnych, co wydaje się po prostu złe. –

+1

powiązane z tym: Jak uruchomić dwa serwery w tym samym programie: http://stackoverflow.com/questions/21183183/running-twoje-web-server-athe-same-time-in-one-go -programm – Ali

+0

@MorganFreeman Aby użyć opisanej tutaj metody, uruchomisz pojedynczy plik binarny Go, który działa na pojedynczym hoście. Wszystkie zwirtualizowane nazwy hostów muszą być rozpoznawane na tym komputerze, na którym działa twój plik binarny. –

1

Oto kolejny przykład tego, jak zapewnić „virtual hosts” funkcjonalności przy użyciu golang:

https://gist.github.com/camoles/523dac8cc0fe40d52f66

W tym przypadku każdy „wirtualnego hosta” może być dowolny serwer http, podobnie jak inne golang net.http serwer WWW lub nawet inny konwencjonalny serwer WWW, taki jak nginx. Każdy z nich może znajdować się w tym samym ip i na innym porcie lub w innym ip i dowolnym porcie. Nie ma znaczenia, czy przesyłasz do innego serwera fizycznego, jeśli chcesz to zrobić.