
Ich verwende Nginx als Reverse-Proxy für eine Backend-API. Ich möchte jedoch, dass Nginx eine statische Datei mit dem Namen „readme.html“ bereitstellt, wenn eine Anfrage an „/“ gestellt wird.
Ich habe ausführlich recherchiert. Die vielversprechendste Lösung schien diese zu sein:https://stackoverflow.com/a/15467555/2237433.
Ich versuche, diese Lösung auf meinen Fall anzuwenden. Hier ist mein Code. Hier ist meine Docker-Datei:
# syntax=docker/dockerfile:1
FROM nginx:1.22.0-alpine
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./readme.html /www/
EXPOSE 80
Wenn mein Nginx-Container läuft, kann ich eine Verbindung zu einer Shell herstellen und diese ausführen, cat /www/readme.html
um zu bestätigen, dass die Datei tatsächlich vorhanden ist.
Hier ist nun meine nginx.conf:
# a lot of stuff
http {
# a lot of stuff
proxy_cache_path /data/nginx/cache keys_zone=my-zone:10m;
server {
listen 80;
add_header X-Cache-Status $upstream_cache_status always;
location / {
root /www/;
try_files readme.html @backend;
}
location @backend {
proxy_pass http://api:8080;
proxy_cache my-zone;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
}
}
}
Mit dieser Konfiguration funktionieren alle meine Pfade wie erwartet, außer dass ich einen 404-Fehler erhalte, wenn ich eine Anfrage auf "/" ausführe. Der 404-Fehler kommt eigentlich vom Backend. Hier ist das Protokoll vom Backend nach der Anfrage:
[20/Jun/2022 01:51:06] "GET / HTTP/1.0" 404 -
Die "/"-Anfrage wurde also tatsächlich an das Backend weitergeleitet.
Ich habe eine Vielzahl von Optimierungen an dieser Konfiguration ausprobiert, aber ohne Erfolg. Vielen Dank für Ihre Hilfe!
Antwort1
Sie können die „Root“-Anforderungs-URI explizit umschreiben:
location = / {
root /www;
rewrite ^ /readme.html break;
}
location / {
proxy_pass http://api:8080;
...
}
readme.html
Oder Sie können als Indexdatei Folgendes verwenden :
location / {
root /www;
index readme.html;
try_files $uri $uri/ @backend;
}
Antwort2
Ich habe eine funktionierende Lösung gefunden. Es stellte sich heraus, dass der location /
Block so aussehen musste:
location / {
root /www;
try_files $uri/readme.html @backend;
}
Ich kann allerdings nicht sagen, dass ich wirklich verstehe, warum. Wenn mir also jemand den Grund dafür erklären könnte, wäre ich dankbar.