
Ich habe eine Anwendung, die auf Verbindungen an einem Port wartet, aber ich schalte sie gelegentlich für Updates und dergleichen ab. Ich hätte gerne eine Möglichkeit, das System so zu konfigurieren, dass, wenn dieses Programm läuft, Anfragen für diesen Port an die Anwendung gesendet werden, aber wenn es nicht läuft, werden die Anfragen an eine andere Anwendung weitergeleitet (die eine „vorübergehend nicht verfügbar“-Meldung zurückgeben kann). Was ist der einfachste Weg, dies zu erreichen?
Ich habe keinen Root-Zugriff auf dem Zielcomputer, daher möchte ich Dinge wie vermeiden iptables
. Ich habe über eine Hilfsanwendung nachgedacht, die nichts anderes tut, als Verbindungen zu den beiden anderen Anwendungen weiterzuleiten, aber ich hoffe, es gibt einen einfacheren Weg
Antwort1
Ihre Frage impliziert, dass beide Programme abwechselnd auf derselben Maschine laufen würden, an denselben Port gebunden. Das ist keine gute Idee. TIME_WAIT
Wenn Sie das versuchen, werden Sie auf das (auch 2MSL-)Problem stoßen.Dieser Artikelbeschreibt das Problem. (Es ist Windows-zentriert, aber das meiste, worüber gesprochen wird, gilt für jeden TCP/IP-Stack.)
Die BSD-Socket-API bietet zwar eine Möglichkeit, diesen Schutz zu umgehen ( setsockopt(SO_REUSEADDR)
), dies ist jedoch keiner der Fälle, in denen dies gerechtfertigt ist.
Lösen Sie das Problem stattdessen auf die gleiche Weise, wie es die Leute von High Availability tun: Setzen Sie eineReverseproxyzwischen der Welt und Ihrem „echten“ Back-End-Server.
In der HTTP-Welt ist eine beliebte Lösung für dieses Problemnginx. Sie können es so konfigurieren, dass es den Clients statische Inhalte bereitstellt, während der Back-End-Server ausfällt. Wenn Ihr Protokoll wie HTTP, IMAP oder POP aussieht, können Sie nginx vielleicht so verwenden, wie es ist. Wenn nicht, können Sie einen benutzerdefinierten Proxyserver erstellen.
Damit dies funktioniert, benötigen Sie wahrscheinlich zwei TCP-Ports. Der Proxy bindet sich an die öffentliche Portnummer der öffentlichen IP. Ihr Back-End-Server bindet sich nur an einen sekundären Port der Localhost-Schnittstelle. Daher kann der Datenverkehr vom öffentlichen Netzwerk nur über den Proxy zum Back-End-Server gelangen.
Sie können beide an denselben Port binden, wenn beide Programme so geschrieben sind, dass sie dies zulassen. Wenn Ihre öffentliche IP beispielsweise ist 1.2.3.4
und Ihr öffentlicher Service-Port ist 2345
, können beide Programme an Port binden 2345
, wenn der Reverse-Proxy nur an IP bindet 1.2.3.4
und der „echte“ Server nur an bindet 127.0.0.1
. Wenn eines von beiden an INADDR_ANY
(0.0.0.0) bindet, benötigen Sie unterschiedliche Ports.
Dies löst das 2MSL-Problem, da Ihre Clients immer mit demselben Programm kommunizieren, dem Proxyserver. Der Netzwerkstapel wird nie verwirrt sein, was mit den in der 2MSL-Zeit aufgefangenen Streupaketen zu tun ist.
Eine Variante des Reverse-Proxy ist derLastenausgleicher, und es könnte auch hier funktionieren. Ein Load Balancer ist dafür ausgelegt, den Datenverkehr intelligent an verschiedene Rechner zu leiten. Diese Art von Proxy wäre sinnvoll, wenn Sie meinen, dass Ihre App eines Tages horizontal skaliert werden muss. Sie würden einen Load Balancer auswählen, der weiß, wie er den Datenverkehr an einen speziellen „Service Down“-Host sendet, wenn alle normalen Anwendungsserver ausgefallen sind.
Das Hauptproblem bei der Load Balancer-Lösungsvariante ist, dass ein generischer Load Balancer blind davon ausgehen könnte, dass alle Back-End-Dienste, für die er als Proxy fungiert, dieselbe Portnummer verwenden und sich nur in der IP unterscheiden. Möglicherweise können Sie jedoch einen flexibleren Load Balancer erhalten oder mehrere IPs für Ihren gemeinsam genutzten Server bekommen.