Ich habe ein komplexes nginx
Setup, bei dem eine Front nginx
an den Ports 80 und 443 alle externen Zugriffe einschließlich TLS handhabt.
Für Dateien im /texts
Frontend-nginx wird die Anfrage an ein zweites Backend-nginx weitergeleitet, das in einem komplizierten Prozess im laufenden Betrieb vorhandene Textdateien ändert und dabei CPU und andere Ressourcen verbraucht.
Bei Dateien *.txt
, die nicht existieren (404), möchte ich das Backend überhaupt nicht belästigen, sondern dem Client stattdessen /texts/default.txt
direkt eine Standarddatei bereitstellen. Derzeit werden nicht existierende Dateien jedoch immer noch nur in der error_page 404
Zeile des Backends behandelt. Existierende Dateien werden problemlos bereitgestellt, der Proxy funktioniert.
Dies ist meine Konfiguration:
frontend-nginx.conf:
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name frontend.example.org;
root /srv/www;
location /texts/ {
location ~ \*.txt$ {
root /srv/www/backend;
####### the next line has absolutely no effect
try_files $uri /texts/default.txt;
}
proxy_pass http://localhost:90;
proxy_redirect http://localhost:90/ /;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_redirect off;
}
}
# https goes here, all the same except TLS
}
backend-nginx.conf:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 127.0.0.1:90;
root /srv/www/backend;
charset utf-8;
expires -1; # no-cache
location ~ /..*\.txt$ {
# longer cache time for text files
expires 10m;
# this actually works but only here in the backend
error_page 404 @404;
}
location @404 {
return 302 $scheme://frontend.example.org/texts/default.txt
}
}
}
Ich habe diese nutzlose Anweisung in der Frontend-Konfigurationsdatei, die für mich so aussieht, als ob sie 404-Weiterleitungen verarbeiten könnte, default.txt
aber wenn ich das tue
wget -v http://frontend.example.org/texts/notexist.txt
Ich erhalte eine Weiterleitung nur innerhalb des Backends (es findet also ein Proxying statt).
Antwort1
location /texts/ {
proxy_set_header ...;
proxy_pass ...;
location ~ \.txt$ {
root /path/to/root;
try_files $uri /texts/default.txt;
proxy_pass ...;
}
}
location = /texts/default.txt {
root /path/to/root;
}
Beachten Sie den korrekten regulären Ausdruck für die location
Anweisung. Die proxy_set_header
Anweisungen werden übernommen, aber die proxy_pass
Anweisung muss in der verschachtelten Anweisung wiederholt werden location
.
Die try_files
Anweisung überprüft, ob die Datei existiert, und ändert die URI, wenn sie nicht existiert.
Die Standarddatei verfügt über ein dediziertes Verzeichnis location
, sodass die Datei als statische Datei vom richtigen Stammverzeichnis aus bereitgestellt werden kann.
Der Pfad zur Datei wird durch Verketten des Wertes von root
mit der URI erstellt, sodass sich die Datei /texts/default.txt
unter befindet /path/to/root/texts/default.txt
.