Mehrere Server von einem Host aus, Filtern nach Domänen und Subdomains und Port-Übersetzung -NGINX

832
DevelopedLogic

Ich bin völlig neu in NGINX, habe es noch nicht einmal angerührt, allerdings bin ich in einer kleinen Situation, in der Online-Suche darauf hindeutet, dass es verwendet werden muss.

Meine Situation ist folgende:

Ich habe 1 Server (Windows Server) und möchte zwei FTP-Server und zwei Webserver betreiben. Jetzt weiß ich, dass ich nicht zwei Anwendungen auf demselben Port hosten kann (z. B. Port 80 für beide Webserver usw.). Daher muss ich sie auf verschiedene Ports setzen.

Nehmen wir für diese Situation an, ich habe zwei Subdomains one.example.comund two.example.com. Beide Subdomains verweisen auf die IP-Adresse meines Servers 1.2.3.4. In jeder normalen Situation ist der Zugriff auf einen Webserver und einen FTP-Server über eine der beiden Unterdomänen über die verschiedenen Ports möglich, die ich zugewiesen habe. Das will ich nicht.

Ich möchte einen FTP-Server und einen Webserver in einer Subdomäne und an Port 21 und 80 und den anderen FTP-Server und Webserver in der anderen Subdomain und erneut an Port 21 und 80 haben.

Soweit ich das beurteilen kann, muss ich dafür sorgen, dass Sie nur auf bestimmte Dinge (Filter) auf bestimmte Subdomains zugreifen können und die Ports dieser Dinge (21 und 80) in andere Ports auf dem Server übersetzt werden (wie Sie können. es gibt zwei Anwendungen, die sich auf einem Port befinden).

Wenn ich kann, möchte ich NGINX auf dem Windows-Server ausführen, aber wenn nicht, würde ich es wirklich auf einem kleinen Gerät wie meinem Raspberry Pi ausführen müssen, selbst wenn mein Pi ein Gateway zwischen dem Internet und meinem Netzwerk sein muss.

BEARBEITEN: Es ist wichtig für mich an dieser Stelle anzumerken, dass ich beabsichtige, auf diesem Server mehr als nur FTP und HTTP auszuführen. Daher muss diese Portübersetzung und Domänenfilterung für jede Art von Socket-Anwendung funktionieren, nicht nur für FTP, HTTP usw. Wenn NGINX ist nicht die Lösung, jede andere funktionierende Lösung ist in Ordnung.

0
Sie können zwar vor Ihrem Server einen Reverse-Proxy für http verwenden, um bestimmte URLs an bestimmte IP-Adressen und Ports zu leiten, Sie können jedoch KEINESFALLS in Bezug auf FTP tun. FTP hat keine Host-Header wie HTTP. Appleoddity vor 6 Jahren 0
@Appleoddity Die Absicht hier ist, eine "dumme" Portänderung zu erhalten. Alle Informationen in der Subdomäne für Port 21 werden statisch an einen anderen Port des Servers gesendet, unabhängig davon, was gesendet und empfangen wird. DevelopedLogic vor 6 Jahren 0
Sprichst du Reverse-Proxies oder nur virtuelle Hosts? Journeyman Geek vor 6 Jahren 0
Da hier nichts virtualisiert ist, gehe ich davon aus, dass @JourneymanGeek als Stellvertreter fungiert DevelopedLogic vor 6 Jahren 0
nein nein Ein virtueller Host ist im Wesentlichen "Wenn der Host A ist, mach X, wenn der Host B ist, mach Y" Journeyman Geek vor 6 Jahren 0
Klingt richtig, unvollständig aus dem Kontext @JourneymanGeek DevelopedLogic vor 6 Jahren 0

1 Antwort auf die Frage

0
Journeyman Geek

ngnix ist unter Linux viel einfacher - zumindest in Bezug auf die Dokumentation. Ich habe jedoch das Gefühl, dass wir am Anfang beginnen müssen. ngnix funktioniert normalerweise sofort, obwohl Sie Dinge wie php separat einrichten müssen - es gibt kein Äquivalent für mod proxy.

In jedem modernen HTTP-Server gibt es einige Varianten von virtuellen Hosts. In ngnix können Sie diese entweder als einzelne Datei oder als separate Dateien einrichten lassen. Diese Art funktioniert auf FTP nicht - aber es gibt Problemumgehungen. ( Ngnix nennt es Serverblöcke, aber den gleichen Unterschied ).

Sie müssen nur separate Konten in ftp mit unterschiedlichen Benutzernamen, Kennwörtern und Rood-Verzeichnissen einrichten.

Virtualhosts funktioniert nur für http und https und ist im Wesentlichen eine Möglichkeit, den Datenverkehr in verschiedenen Domänen auf verschiedene Routen zu lenken. Auf diese Weise können Sie basierend auf dem Hostnamen mehrere Dienste in verschiedenen Stammverzeichnissen ausführen. Sie können beispielsweise zwei Instanzen von WordPress auf demselben Server mit meist separaten Dateien ausführen.

Ich bin faul - ich habe eine Konfigurationsdatei pro Domain. Wenn Sie dies unter Windows ausführen, schlagen Sie in der entsprechenden Dokumentation nach.

Sie sollten herausfinden, wo sich die Konfigurationsdateien für jede Site befinden - meine in / etc / ngnix / sites-available. Diese sind mit Sites-Aktivierten verknüpft. Dies kann auf der Plattform basieren

Sie werden dort immer eine Standardeinstellung haben, die vernünftig ist und funktionieren sollte. Es ist langweilig und Sie können es durchlesen, um die verschiedenen Optionen zu verstehen.

Sie können dies entweder bearbeiten (ich empfehle es nicht) oder eine Konfigurationsdatei pro Site in demselben Ordner erstellen. Dies ist ein Beispiel für das, das ich verwende. Dadurch werden die Standardeinstellungen überschrieben

server { listen 80; listen [::]:80;   root /var/www/html/new;  # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html index.php;  server_name new.example.com;  location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }  # pass the PHP scripts to FastCGI server via unix socks # location ~ \.php$ { include snippets/fastcgi-php.conf;  fastcgi_pass unix:/run/php/php7.0-fpm.sock; }  # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } 

Mehr oder weniger sage ich ihm also, Port 80, auf ipv4 und 6 zuzuhören, ihm den Hostnamen mitzuteilen und einige andere PHP-bezogene Sachen.

Wenn ich root wechsle und new.example.com durch new2.example.com tausche und den Root wechsle, werden alle Anforderungen an new2.example.com an den Inhalt im neuen Root gesendet. Sie können beispielsweise 2 Kopien von WordPress auf demselben Server mit verschiedenen Domänen auf diese Weise ausführen. Ich erstelle eine davon mit dem entsprechenden Servernamen und Root-Namen pro Domäne in Sites-enabled. Verknüpfe sie mit Sites, die aktiviert sind (funktioniert in Windows möglicherweise anders), und lade meine Nginix-Konfiguration erneut.

Angenommen, Sie versuchen zu proxy. Sie haben einen oder mehrere Server an verschiedenen Ports. ngnix sitzt vor direktem verkehr

server { listen 80; listen [::]:80; server_name matrix.example.com;    location /_matrix { proxy_pass http://localhost:8008; proxy_set_header X-Forwarded-For $remote_addr; }  } 

Betrachten Sie diese Konfigurationsdatei - ich bin nicht sicher, ob sie tatsächlich funktionieren wird (ich habe eine HTTPS-fähige Version davon), aber dafür sind die Dokumente gedacht . Er wird an Port 80 für die Domäne "matrix.example.com" mithören.

Das OP hat gefragt, wie mehrere Instanzen auf verschiedenen Ports ausgeführt werden sollen. Schlagen Sie dies als alternative Methode vor? Appleoddity vor 6 Jahren 0
Jep! Und versuchte zu erklären, was jedes Ding tut. Journeyman Geek vor 6 Jahren 0
@JourneymanGeek Dies ist genau das, was ich aus der Sicht des Webservers will, aber meine Absicht, FTP einzurichten, bestand darin, für jede andere Anwendung ein Ersatzteil zu sein. Zum Beispiel beabsichtige ich möglicherweise, mehrere Spieleserver, Telnet / SSH-Server usw. auszuführen, und daher möchte ich, dass nur bestimmte Serveranwendungen in bestimmten Subdomains und bestimmte Ports in diesen Subdomains aufgerufen werden können. Ich betrachte nicht nur HTTP-basierte Anwendungen. DevelopedLogic vor 6 Jahren 0
Das wird schnell knifflig. Der * Server * muss die Hostnamen kennen, damit dies funktioniert. https://serverfault.com/questions/255055/dynamic-port-forwarding-based-on-hostname-or-originating-ip ist das, worauf ich mich beziehe, aber srv-Datensätze funktionieren möglicherweise nicht in allen Fällen. HTTP ist * für * das, was Sie wollen, gebaut, damit es funktioniert. Andere Protokolle können oder nicht. Journeyman Geek vor 6 Jahren 0
@journeymanGeek SRV-Datensätze scheinen der Client, der eine Verbindung herstellt, zu hören. Was ich wirklich suche, ist eine Art Firewall-Filtersystem, aber ein bisschen wie NAT, das einen angeforderten Port in einer angeforderten Unterdomäne in eine Anwendung auf einem Computer übersetzt und Anforderungen blockiert, wenn auf den Port, auf den zugegriffen wird, nicht zugegriffen werden darf auf einer Subdomain. DevelopedLogic vor 6 Jahren 0
Ah, ich denke, der Punkt, den ich zu machen versuche, ist, dass das Protokoll / die Anwendung davon wissen muss. In den meisten Fällen gibt es keine "willkürliche" Möglichkeit, dies zu tun. Journeyman Geek vor 6 Jahren 0
@JourneymanGeek Es scheint, dass das, was ich tun muss, in diesem Fall unmöglich ist ... DevelopedLogic vor 6 Jahren 0