2016-08-01 18 views
5

auf Dienststoff Host I einen Dienst Stoffcluster mit einer Domäne von foo.northcentralus.cloudapp.azure.com entfaltetenmehrere öffentliche Websites

Es hat einen einzigen Typ Knoten mit einer einzigen öffentlichen IP-Adresse/Load Balancer.

Lets sagen, ich habe die beiden folgenden Anwendungen eingesetzt:

Wie kann ich dies so einrichten I 80 mehrere Domains jede gehostete auf Port haben kann? (Vorausgesetzt, ich besitze beiden Domänen offensichtlich)

Brauche ich mehr als eine öffentliche IP-Adresse in meinem Cluster, dies zu unterstützen?

Antwort

9

Sie sollten dies mit einer einzigen öffentlichen IP-Adresse durch einige http.sys Magie tun können.

Angenommen, Sie Katana verwenden für Ihre Web-Host (das Wort zählen und visuelles Objekt Samples Verwendung Katana Referenz), dann sollte so einfach sein wie Sie den Server starten Sie den Domänennamen in der URL:

Der zugrunde liegende Windows HTTP Server API registriert diesen Server mit dieser URL, und jede HTTP-Anforderung, die mit einem Header Host: visualobjects.com kommt, wird automatisch an diesen Server weitergeleitet. Wiederholen Sie dies für eine beliebige Anzahl von Servern mit einem eigenen Hostnamen. Dies ist das Host-Routing, das http.sys für Multi-Website-Hosting auf einer einzelnen Maschine durchführt, genau wie in IIS.

Das Problem, mit dem Sie konfrontiert werden, besteht darin, den Hostnamen zu reservieren, den Sie vor dem Öffnen des Servers unter einem erhöhten Benutzerkonto ausführen müssen. Service Fabric hat für diese Unterstützung in Form von Endpoint-Konfiguration in ServiceManifest.xml beschränkt:

<!-- THIS WON'T WORK FOR REGISTERING HOSTNAMES --> 
<Resources> 
    <Endpoints> 
    <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="80" /> 
    </Endpoints> 
</Resources> 

Die Einschränkung hier ist, dass es nirgends einen Hostnamen angeben, so Service Stoff wird immer „http://+:[port]“ registrieren. Das funktioniert leider nicht, wenn Sie einen Server für einen bestimmten Hostnamen öffnen wollen - Sie müssen nur den Hostnamen registrieren, den Sie verwenden möchten. Sie müssen diesen Teil manuell mit netsh () und entfernen Sie alle Endpunkte für den gleichen Port aus ServiceManifest.xml, sonst wird es Ihre Registrierung Hostnamen überschreiben).

Um die Hostnamen mit http.sys manuell zu registrieren, müssen Sie netsh für die Hostnamen, Port und Benutzerkonto ausgeführt werden, unter dem Ihr Dienst ausgeführt wird, die standardmäßig Network Service ist:

netsh http add urlacl url=http://visualobjects.com:80/ user="NT AUTHORITY\NETWORK SERVICE" 

Aber Sie muss dies von einem erhöhten Konto auf jeder Maschine tun, auf der der Dienst läuft. Zum Glück haben wir service setup entry points that can run under elevated account privileges.

bearbeiten

Eine Sache, die Sie tun, um dies zu arbeiten brauchen, ist die Firewall auf dem gleichen Port öffnen Sie hören. Sie können das mit dem folgenden tun:

<Resources> 
    <Endpoints> 
     <Endpoint Protocol="tcp" Name="ServiceEndpoint" Type="Input" Port="80" /> 
    </Endpoints> 
</Resources> 

Beachten Sie, dass das Protokoll tcp anstelle von http ist. Dadurch wird der Firewall-Port geöffnet, die http.sys-Registrierung, die Sie mit dem .bat-Skript eingerichtet haben, wird jedoch nicht überschrieben.

+0

Brilliant, gut gemacht! Ich habe eine Weile mit dieser tiefen Konfiguration gekämpft, da ich keine Dokumentation darüber finden konnte. Ich musste etwas arbeiten, aber diese Antwort ist sehr klar. –

+1

gibt es diese Einschränkung noch? Aus Ihrer Antwort: "Die Einschränkung hier ist, dass es keinen Hostnamen geben kann, daher registriert Service Fabric immer" http: // +: [port] ". –

0

Ich glaube schon. Trennen Sie öffentliche IP-Adressen, die dann eingerichtet werden können, um Routing von diesen IPs zu denselben Back-End-Pools zu ermöglichen, jedoch an verschiedenen Ports.

+0

Das ist eigentlich eine bessere Antwort als genehmigt. Während ich hörte, dass es 5 IP-Adressenlimit in SF gibt (nicht bestätigt, aber etwas, über das man sich bewusst sein muss). – Dalius