Golang-reverse-proxy mit mehreren apps
Will ich dienen, zwei oder mehr web-Anwendungen laufen in einer VM (verschiedene ports und einige Zeit in ein anderes Verzeichnis unter dem gleichen port) von dem host-Rechner und da Brauch ich den Benutzer angemeldet werden, bevor er Zugriff auf diese apps kann ich nicht verwenden, eine statische proxy wie Nginx oder Apache.
So, hier ist meine situation :
192.168.1.1 : ist die host-ip
192.168.1.2 : ist die VM-ip -
Innerhalb der VM habe ich dieses :
192.168.1.2/owncloud : owncloud-Adresse
192.168.1.2:8080 : eine andere app
192.168.1.2:8888 : 3. app
Ich will diese :
192.168.1.1/app1 --> 192.168.1.2/owncloud
192.168.1.1/app2 --> 192.168.1.2:8080
192.168.1.1/app2 --> 192.168.1.2:8888
Habe ich versucht, golang httputil.ReverseProxy um dies zu erreichen routing, aber ohne viel Erfolg:
mein code basiert auf dieser Arbeit : gist
package main
import(
"log"
"net/url"
"net/http"
"net/http/httputil"
)
func main() {
remote, err := url.Parse("http://192.168.1.2:8080")
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
http.HandleFunc("/app2", handler(proxy))
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) {
log.Println(r.URL)
r.URL.Path = "/"
p.ServeHTTP(w, r)
}
}
Edit :
Ich habe verändert die vm-ip-Adresse: 192.168.1.2 nicht 192.168.1.1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wären Sie besser dran, dies zu tun, indem Sie den Hostnamen anstatt der URL. zB
Wenn Sie nicht bereits wissen, ist der hostname ist nur ein HTTP-request-header (Host: domain.com), so können Sie mehrere Hostnamen pro IP (Apache nennt dies "named virtual hosts").
Den Vorteil der Verwendung von Hostnamen anstelle von URLs ist, dass die web-app am anderen Ende ist nicht bewusst, dass URLs, die Sie sind, indem noch braucht, um Sie zu Ehren, so können Sie laufen in Probleme mit den URLs geschrieben, die durch die web-app funktioniert nicht gegen den URLs wird erwartet, dass durch den reverse-proxy. Wo als hostname-basierten proxies funktionieren sollte, da die meisten web-apps nicht umschreiben, die domain-Namen. (dies ist eine riesige Verallgemeinerung, obwohl einige web-apps, die Ihnen erlauben, fügen Sie einen proxy-Adresse - aber in der Regel führen Sie in die weniger Probleme mit dem Hostnamen)
Das größte Problem ist, dass die Einrichtung von sub-domains auf Ihren Namen-server. Ich gehe davon aus, dass Ihre verga /DNS-Anbieter können Sie subdomains erstellen kostenlos (die meisten sollten), aber wenn Sie mit so etwas wie dynamische DNS, die mit dieser läuft aus Ihrem home broadband-Verbindung, dann werden Sie Probleme und kaufen Sie Ihre eigenen domain-Namen mit der sub-domains CNAME ' ed zu Ihrem dynamischen DNS-Adresse (oder verwenden Sie ein kostenpflichtiges Konto mit Ihrem dynamic DNS-Anbieter, wenn Sie bieten subdomains).
Eine Letzte Sache, wenn Sie auf der Suche in owncloud dann möchten Sie vielleicht auch, um einen Blick auf Pydio (vormals AjaxExplore) als gut. Beide haben unterschiedliche stärken und Schwächen, aber meiner persönlichen Meinung nach Pydio ist ein besseres Produkt.
err = syscall.Setgid(daemon_group_id); err = syscall.Setuid(daemon_user_id)
Machen Sie eine Karte wie diese
Verwenden
httputil.ReverseProxy
bauen Sie Ihren handlerListenAndServe
Können Sie zwischengespeicherte
httputil.ReverseProxy
im globalen Karte, alle in der Datei oben.Hier ist ein SSLDocker Projekt gesehen, um zu Ihnen passen am besten.
Ihre Weitergabe die falsche IP des reverse-proxy. Sollte dein VM
192.168.1.2
.In der docs
NewSingleHostReverseProxy returns a new ReverseProxy that rewrites URLs to the scheme, host, and base path provided in target.