Ich versuche, eine Nginx-Konfiguration wie folgt einzurichten: Beim Empfang einer Anfrage wie /tile/SteveCountryVic/1/2/3.png
:
- Versuchen Sie, es weiterzugeben an
http://localhost:5005/1/2/3.png
- Wenn das 404s ist, leiten Sie es an einen anderen Server weiter als
/tile/SteveCountryVic/1/2/3.png
Hier ist meine Konfiguration, die nicht ganz funktioniert:
server {
listen 80;
server_name localhost; error_log /tmp/nginx.error.log notice;
access_log /tmp/nginx.access.log;
location /tile/SteveCountryVic/ {
rewrite_log on;
#rewrite ^.*/(\d+)/(\d+)/(\d+).*$ /$1/$2/$3.png break;
proxy_intercept_errors on;
error_page 404 = @dynamiccycletour;
#proxy_set_header Host $http_host;
#proxy_pass http://127.0.0.1:5005;
proxy_redirect /tile/SteveCountryVic/ http://localhost:5005/;
location @dynamiccycletour {
rewrite_log on;
#rewrite ^(\d+)/(\d+)/(\d+).*$ /tile/SteveCountryVic/$1/$2/$3.png break;
proxy_pass http://115.x.x.x:20008;
}
location /tile/ {
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:20008;
proxy_cache my-cache;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
}
...
In dieser Konfiguration scheinen alle Anfragen an den Proxy-Server umgeleitet zu werden, aber letztendlich werden Bilder bereitgestellt. Darüber hinaus enthält das Fehlerprotokoll diese Zeilen:
2013/09/10 09:44:11 [error] 564#0: *138 open() "/etc/nginx/html/tile/SteveCountryVic/13/7399/5027.png" failed (2: No such file or directory), client: 118.x.x.x, server: localhost, request: "GET /tile/SteveCountryVic/13/7399/5027.png?updated=15 HTTP/1.1", host: "mydomain.org"
proxy_redirect
Wenn ich statt rewrite
und verwende proxy_pass
:
rewrite ^.*/(\d+)/(\d+)/(\d+).*$ /$1/$2/$3.png break;
proxy_pass http://127.0.0.1:5005;
Dann sehe ich jetzt tatsächlich die 404-Meldungen im Browser (d. h., sie werden nicht abgefangen).
Meine Fragen:
- Was mache ich falsch?
- Warum um alles in der Welt sucht nginx nach Dateien in /etc/nginx/html/...?
- Gibt es eine Möglichkeit, noch mehr Protokollierungsinformationen zu erhalten (insbesondere, um Proxy-Redirect besser zu verstehen)?
Antwort1
Die alternative Version, die verwendet wurde, rewrite
verhielt proxy_pass
sich einwandfrei – das Problem war, dass der andere Server 200er statt 404er zurückgab. Der Vollständigkeit halber ist hier also die funktionierende Konfiguration:
server {
listen 80;
server_name localhost;
error_log /tmp/nginx.error.log notice;
access_log /tmp/nginx.access.log;
location /tile/SteveCountryVic/ {
rewrite_log on;
rewrite ^.*/(\d+)/(\d+)/(\d+.*)$ /$1/$2/$3 break;
proxy_intercept_errors on;
error_page 404 = @dynamiccycletour;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5005;
}
location @dynamiccycletour {
rewrite_log on;
rewrite ^/(\d+)/(\d+)/(\d+.*)$ /tile/SteveCountryVic/$1/$2/$3 break;
proxy_pass http://115.x.x.x:20008;
}
Antwort2
als erstes haben Sie Ihre root
- Direktive nicht richtig eingestellt -> deshalb erhalten Sie eine 404 -> deshalb werden alle Anfragen an Ihre @dynamiccycletour (Openstreetmap?) umgeleitet
übrigens, was ist der Unterschied zwischen /tile/ und /tile/SteveCountryVic/?
also müssen wir hier zuerst ein wenig aufräumen:
server {
....
# define where to find files
# be sure to have it like /path/to/tile
root /path/to/tiles/;
location /tile/SteveCountryVic/ {
# if file not found -> remote server
try_files $uri @dynamiccycletour
rewrite_log on;
# this should cover /1/2/3.png. no?
rewrite /tile/SteveCountryVic/(.*).png$ /$1.png break;
# i'm not sure this will match due the the rewrite
proxy_redirect /tile/SteveCountryVic/ http://localhost:5005/;
location @dynamiccycletour {
rewrite_log on;
# this should cover /1/2/3.png. no?
rewrite /tile/SteveCountryVic/(.*).png$ /$1.png break;
proxy_pass http://115.x.x.x:20008;
}
}