web-dev-qa-db-ja.com

nginxが404の代替ロケーションを提供

私は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"

proxy_redirectを使用する代わりに、rewriteおよびproxy_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をよりよく理解するため)はありますか?
4
Steve Bennett

rewriteproxy_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;

   }
4
Steve Bennett

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;


   }

 }