Nginx: Tausende von Servernamen


12

Wie kann ich Nginx so konfigurieren, dass es auf Tausende verschiedener Servernamen beschränkt ist, ohne Tausende externer Konfigurationsdateien zu erstellen oder eine sehr lange Zeile mit Servernamen zu schreiben?

In der Tat möchte ich, dass Nginx nur für server1.com, server2.com usw. ein Reverse-Proxy ist.

Die beste Lösung für mich wäre, eine einzige externe Konfigurationsdatei mit meinen eingeschränkten Servernamen zu haben: server1.com, server2.com usw.

Ist es möglich ?


Ok, danke für deine Antworten, es funktioniert ohne reg. Ausdrücke. Nur eine große Liste mit Servernamen, wie von kolbijack erklärt. Danke.


Sie sollten die Antwort von Kolbijack akzeptieren, wenn es die ist, die geholfen hat.
Oneiroi

Antworten:


19

Sie können die Direktive server_name ganz alleine in eine Datei einfügen und sie dann einfach aus Ihrem Serverblock einfügen:

# example.com.conf
server {
  include /path/to/server_names;
  ...
}

# /path/to/server_names
server_name
  example.com
  domain.com
  foo.com
;

Die Datei server_names benötigt nur den Servernamen oben und; unten eine gültige Richtlinie zu sein.


Achten Sie dabei auf Latenz / Suchverzögerungen / RAM-Auslastung. Ich habe einige Tests mit großen Listen (ca. 5.000 ServerAliasAnweisungen und bis zu 16 Millionen Deny fromAnweisungen) in Apache durchgeführt. 5.000 Domains erzeugen eine messbare, aber kleine Verzögerung. Als ich die Anzahl erhöhte, stellte ich fest, dass sich die Verzögerung bei etwa 50.000 bemerkbar machte. Mit Apache (und wahrscheinlich auch mit Nginx) wird die Liste im RAM gespeichert, was bedeutet, dass ich mit dem größten Satz, den ich ausprobiert habe, nur einen untergeordneten Prozess in meinem verfügbaren RAM starten konnte .
Ladadadada

1
@ Ladadadada LOL. Ich habe gerade nachgesehen. Nginx verwendet 30 MB RAM für 100 000 Domains in der server_nameDirektive und antwortetRequest rate: 36900.6 req/s (0.0 ms/req)
VBart

1
60 MB für 1 000 000 undRequest rate: 34716.8 req/s (0.0 ms/req)
VBart

Das ist erheblich besser als von Apache verwaltet, zumindest mit dem Prefork MPM. Praktisch zu wissen.
Ladadadada

7

Die server_nameDeklaration in Ihrem server {}Block kann ein regulärer Ausdruck sein. Dies sollte es Ihnen ermöglichen, Servernamen innerhalb eines festgelegten Musters abzugleichen.

Weitere Informationen hierzu finden Sie hier: http://nginx.org/en/docs/http/server_names.html#regex_names


Vielen Dank, aber ich kann meine benutzerdefinierte Domänenliste nicht in einem einzigen regulären Ausdruck deklarieren. Servername [zeus.domain.com |poseidon.domain.com | etc ...]; Es wäre zu lang.
Fred

1
@fred Kannst du einen Beispieldatensatz geben? Wenn nicht eine Domain wie die andere ist, wäre ich ziemlich sicher, dass ein Regex-Muster Ihr Problem lösen würde.
Oneiroi

@Oneiroi: Beispiel Anwendungsfall = Benutzergenerierte Subdomains. Stellen Sie sich ein Software-as-a-Service-Produkt vor, bei dem jeder Benutzer seine eigene Subdomain erhält und Sie Nginx verwenden möchten, um sie an verschiedene Server weiterzuleiten. In diesem Fall ist keine Domain wie die andere.
m.stenta

@ m.stenta ah, fairer Punkt. Wenn es in den Subdomains keine Gemeinsamkeiten gibt, wird Regex nicht funktionieren. Oder Sie müssen die Erstellung von Regex einbinden, der von der Domäne selbst abgeleitet ist und den Zweck imho zunichte macht.
Oneiroi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.