9 votos

nginx sirviendo ubicación alternativa en 404

Estoy tratando de configurar un nginx config de la siguiente manera: Al recibir una petición como /tile/SteveCountryVic/1/2/3.png :

  1. Intenta pasarlo a http://localhost:5005/1/2/3.png
  2. Si eso 404s, pasarlo a otro servidor como /tile/SteveCountryVic/1/2/3.png

Aquí está mi configuración que no está funcionando del todo:

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;
    }
    ...

En esta configuración, todas las peticiones parecen ser redirigidas al servidor proxy, pero las imágenes son finalmente servidas. Además, el registro de errores contiene estas líneas:

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"

Si en lugar de utilizar proxy_redirect Utilizo rewrite y proxy_pass :

        rewrite ^.*/(\d+)/(\d+)/(\d+).*$ /$1/$2/$3.png break;
        proxy_pass http://127.0.0.1:5005;

Entonces ahora sí que veo los mensajes 404 en el navegador (es decir, no se interceptan).

Mis preguntas:

  1. ¿Qué estoy haciendo mal?
  2. ¿Por qué nginx busca archivos en /etc/nginx/html/...?
  3. ¿Hay alguna forma de obtener aún más información de registro (concretamente, para comprender mejor proxy_redirect)?

11voto

Steve Bennett Puntos 1408

La versión alternativa, que utiliza rewrite y proxy_pass se comportó perfectamente - el problema era que el otro servidor devolvía 200's en lugar de 404's. Así que para completar, aquí está la configuración de trabajo:

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;

   }

3voto

Lo primero que no has puesto tu root - correctamente -> por eso recibe un 404 -> por eso todas las peticiones son redirigidas a su @dynamiccycletour (¿openstreetmap?)

Por cierto, ¿cuál es la diferencia entre /tile/ y /tile/SteveCountryVic/?

así que necesitamos un poco de limpieza aquí primero:

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;

   }

 }

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X