Nginx Proxy ein großer Portbereich zum entsprechenden Port auf einer anderen IP-Adresse

8

Ich möchte nginx verwenden, um einen gesamten Bereich (9000-9999) an denselben Port an einer anderen IP-Adresse zu übertragen. Kann Nginx automatisch an tausend Ports binden? Kann ich dies tun, ohne 4000 Zeilen Nginx-Konfiguration zu schreiben?

Collin Anderson
quelle

Antworten:

9

Sie können dies mit der integrierten Variablen server_port tun :

proxy_pass http://backend-host-name:$server_port;

Dadurch würde jeder Port, auf dem die Anforderung eingegangen ist, an denselben Back-End-Port weitergeleitet.

Sie benötigen also keine 1000 proxy_pass-Anweisungen. Möglicherweise haben Sie jedoch ein Problem mit der Listen- Direktive. Es werden keine Ports akzeptiert, daher benötigen Sie 1000 Zeilen des Formulars:

listen 9000;
listen 9001;
listen 9002;

Diese Liste kann einfach mit einer Tabelle erstellt werden. Sie müssen wahrscheinlich auch die Anzahl der von nginx zugelassenen Dateihandles anpassen, um diese Anzahl von Sockets zu verarbeiten. Nginx kann dies, die Grenzen können auf der Betriebssystemebene liegen. Sehen Sie hier und hier .

Ich werde jedoch sagen, dass dies ein problematisches Design zu sein scheint. Warum brauchen Sie 1000 Ports? Wäre es nicht sinnvoller, Hostnamen oder einen Teil der URL zur Unterscheidung von Anforderungen zu verwenden? Es wäre weitaus skalierbarer - es werden keine 2000 Sockets als Basis benötigt.

Rmalayter
quelle
Über den Port oder sogar die IP-Adresse liegt die Analyse der Abfrage in den Händen des Netzwerks. Art von Level 5 oder 6 Service anstelle von Level 7 Parsing. Wahrscheinlich schneller.
Arivero
7

Folgendes habe ich stattdessen getan:

server {
    server_name "~^port(?P<forwarded_port>9\d{3})\.example\.com$";
    location / { proxy_pass http://127.0.0.1:$forwarded_port; }
}

Auf diese Weise können Sie einfach eine Verbindung zu http://port9034.example.com herstellen .

Collin Anderson
quelle
0

Seit NGINX Version 1.15.10 listenakzeptiert die Direktive Portbereiche .

Aus der Dokumentation :

Portbereiche (1.15.10) werden angegeben, wobei der erste und der letzte Port durch einen Bindestrich getrennt sind:

listen 127.0.0.1:12345-12399;
listen 12345-12399;

Also mit

server {
    listen 9000-9999;

    proxy_pass http://upstream-host:$server_port;
}

sollte den Trick machen.

Es ist wichtig zu beachten, dass die Anzahl der Worker-Verbindungen entsprechend angepasst werden muss, da sonst NGINX einen Fehler ausgibt:

# nginx -s reload
nginx: [emerg] 512 worker_connections are not enough for 1000 listening sockets
lcnittl
quelle