Ich habe Nginx mit einer Ruby / Sinatra-App eingerichtet und alles ist in Ordnung. Jetzt versuche ich jedoch, eine zweite Anwendung auf demselben Server auszuführen, und habe etwas Seltsames bemerkt. Hier ist zuerst meine nginx.conf:
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
Beachten Sie, wie server_name
eingestellt ist, dass FAKE.COM
der Server auf alle Hosts reagiert, die diesen Server über andere Domänennamen erreichen. Wie kann ich diesen bestimmten Server dazu bringen, nur auf Anfragen zu antworten FAKE.COM
?
listen fake.com | something.com:80
Befehl filtert nichtserver_name
.Antworten:
Der erste Serverblock in der nginx-Konfiguration ist die Standardeinstellung für alle Anforderungen, die den Server treffen, für den es keinen bestimmten Serverblock gibt.
Angenommen, Ihre reale Domain ist REAL.COM. Wenn ein Benutzer dies eingibt, wird dies in Ihren Server aufgelöst. Da für dieses Setup kein Serverblock vorhanden ist, ist der Serverblock für FAKE.COM der erste Serverblock (in Ihrem Fall nur Serverblock) verarbeitet diese Anforderung.
Aus diesem Grund haben richtige Nginx-Konfigurationen einen bestimmten Serverblock für Standardeinstellungen, bevor andere für bestimmte Domänen verwendet werden.
etc
** BEARBEITEN **
Es scheint, dass einige Benutzer durch dieses Beispiel etwas verwirrt sind und denken, dass es auf eine einzelne conf-Datei usw. beschränkt ist.
Bitte beachten Sie, dass das Obige ein einfaches Beispiel für die Entwicklung des OP nach Bedarf ist.
Ich persönlich verwende damit separate vhost conf-Dateien (CentOS / RHEL):
/etc/nginx/conf.d/
enthält domain_1.conf, domain_2.conf ... domain_n.conf, die nach dem Serverblock in die Hauptdatei nginx.conf aufgenommen wird. Dies ist immer die erste und immer die Standardeinstellung, sofern sie nicht mit dem default_server überschrieben wird Richtlinie anderswo.Die alphabetische Reihenfolge der Dateinamen der conf-Dateien für die anderen Server spielt in diesem Fall keine Rolle.
Darüber hinaus bietet diese Anordnung viel Flexibilität, da mehrere Standardeinstellungen definiert werden können.
In meinem speziellen Fall überwacht Apache Port 8080 nur auf der internen Schnittstelle und überträgt PHP- und Perl-Skripte an Apache.
Ich führe jedoch zwei separate Anwendungen aus, die beide Links mit ": 8080" im angehängten Ausgabe-HTML zurückgeben, da sie feststellen, dass Apache nicht auf dem Standard-Port 80 ausgeführt wird, und versuchen, mir zu "helfen".
Dies führt zu dem Problem, dass die Links ungültig werden, da Apache nicht über die externe Schnittstelle erreichbar ist und die Links auf Port 80 zeigen sollten.
Ich behebe dies, indem ich einen Standardserver für Port 8080 erstelle, um solche Anforderungen umzuleiten.
Da nichts in den regulären Serverblöcken auf Port 8080 lauscht, verarbeitet der Standard-Serverblock zur Umleitung solche Anforderungen aufgrund seiner Position in nginx.conf transparent.
Ich habe tatsächlich vier solcher Serverblöcke und dies ist ein vereinfachter Anwendungsfall.
quelle
Sie sollten einen Standardserver für Catch-All haben. Sie können zurückkehren
404
oder besser gar nicht antworten (spart etwas Bandbreite), indem Sie444
eine nginxspezifische HTTP-Antwort zurückgeben, die einfach die Verbindung schließt und nichts zurückgibtquelle
server_name _;
ich in früheren Versionen für Nginx nicht, aber es hat funktioniert. Für die neueren Nginx-Versionen scheint es, dass Sie die benötigenserver_name _;
. Danke444
und imho eine viel sauberere Lösung als die Rückgabe eines Fehlercodes.Ich konnte mein Problem mit keiner der anderen Antworten lösen. Ich habe das Problem behoben, indem ich überprüft habe, ob der Host übereinstimmt, und einen 403 zurückgegeben habe, wenn dies nicht der Fall war. (Ich hatte eine zufällige Website, die auf den Inhalt meines Webservers zeigte. Ich schätze, den Suchrang zu entführen.)
quelle
Um Ihre Frage zu beantworten, wählt nginx den ersten Server aus, wenn keine Übereinstimmung vorliegt. Siehe Dokumentation :
Wenn Sie nun einen Standard-Catch-All-Server haben möchten, der beispielsweise mit 404 auf alle Anforderungen antwortet, gehen Sie wie folgt vor:
Beachten Sie, dass Sie ein Zertifikat / einen Schlüssel angeben müssen (der selbstsigniert sein kann), da sonst alle SSL-Verbindungen fehlschlagen, da nginx versucht, eine Verbindung mit diesem Standard-Server zu akzeptieren und kein Zertifikat / Schlüssel findet.
quelle
server_name _;
das nicht einmal gebraucht wird.Es gibt nur wenige Möglichkeiten, den Standardserver anzugeben.
Erster Weg - Geben Sie den Standardserver zuerst in der Liste an, wenn Sie Ihre Serverkonfigurationen in einer Konfigurationsdatei behalten, wie oben gezeigt.
Zweiter Weg (besser) Flexibler - Geben Sie
default_server
Parameter fürlisten
Anweisungen an, zum Beispiel:Weitere Informationen hier: Nginx doc / Listen
Diese Methode ist nützlicher, wenn Sie Serverkonfigurationen in separaten Dateien aufbewahren und diese Dateien nicht alphabetisch benennen möchten.
quelle
Kleiner Kommentar zur Antwort:
Wenn Sie mehrere virtuelle Hosts auf mehreren IPs in mehreren Konfigurationsdateien in sites-available / haben, wird die "Standard" -Domäne für IP aus der ersten Datei in alphabetischer Reihenfolge übernommen.
Und wie Pavel sagte, gibt es das Argument "default_server" für die Direktive "listen" http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
quelle