404에서 대체 위치를 제공하는 nginx

404에서 대체 위치를 제공하는 nginx

다음과 같이 nginx 구성을 설정하려고 합니다. 다음과 같은 요청을 받을 때 /tile/SteveCountryVic/1/2/3.png:

  1. 그것을 통과시키려고 시도한다.http://localhost:5005/1/2/3.png
  2. 404인 경우 다음과 같이 다른 서버에 전달하세요./tile/SteveCountryVic/1/2/3.png

제대로 작동하지 않는 구성은 다음과 같습니다.

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

이 구성에서는 모든 요청이 프록시 서버로 리디렉션되는 것처럼 보이지만 최종적으로 이미지가 제공됩니다. 또한 오류 로그에는 다음 줄이 포함되어 있습니다.

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"

을 사용하는 대신 and를 proxy_redirect사용합니다 .rewriteproxy_pass

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

그러면 이제 실제로 브라우저에 404 메시지가 표시됩니다(즉, 가로채지 않습니다).

내 질문:

  1. 내가 도대체 ​​뭘 잘못하고있는 겁니까?
  2. 도대체 nginx가 /etc/nginx/html/...에서 파일을 찾는 이유는 무엇입니까?
  3. 더 많은 로깅 정보를 얻을 수 있는 방법이 있습니까(특히, Proxy_redirect를 더 잘 이해하기 위해)?

답변1

대체 버전은 완벽하게 작동 rewrite하고 proxy_pass사용되었습니다. 문제는 다른 서버가 404 대신 200을 반환한다는 것입니다. 완전성을 위해 작업 구성은 다음과 같습니다.

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;

   }

답변2

먼저 - 지시어를 올바르게 설정하지 않은 것입니다 root. -> 이것이 404를 얻는 이유입니다. -> 모든 요청이 @dynamiccycletour(openstreetmap?)로 리디렉션되는 이유입니다.

그런데 /tile/과 /tile/SteveCountryVic/의 차이점은 무엇입니까?

먼저 여기서 약간의 정리가 필요합니다.

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;


   }

 }

관련 정보