web-dev-qa-db-ja.com

Nginxリバースプロキシのリダイレクトが多すぎます

渡されたURIに応じて2つの異なるKibanaホストにリダイレクトするリバースプロキシとして機能するようにnginxを構成したいと思います。 /は標準にリダイレクトし、/october/は10月専用のKibanaにリダイレクトします。構成の最初の部分(/)は正常に機能しますが、Too many redirectionsにアクセスしようとすると/octoberエラーが発生しました。 2番目の部分(location /october/)をコメントアウトし、最初の部分でlocalhost10.10.0.3に置き換えようとすると、10月のプラットフォームにリダイレクトされます。したがって、問題はこのnginx構成にあります。

server {
    listen                  80;
    server_name             my.domain.io;
    return                  301 https://$server_name;
}

server {
    listen                  443 ;
    ssl                     on;
    ssl_certificate         /etc/letsencrypt/live/my.domain.io/cert.pem;  
    ssl_certificate_key     /etc/letsencrypt/live/my.domain.io/privkey.pem;  
    server_name             my.domain.io; 
    access_log              /var/log/nginx/kibana.access.log;
    error_log               /var/log/nginx/kibana.error.log;

    location / {
            auth_basic              "Restricted";
            auth_basic_user_file    /etc/nginx/conf.d/kibana.htpasswd;


            location / {
                    proxy_pass              http://localhost:5601;
                    proxy_http_version      1.1;
                    proxy_set_header        Upgrade $http_upgrade;
                    proxy_set_header        Connection 'upgrade';
                    proxy_set_header        Host $Host;
                    proxy_cache_bypass      $http_upgrade;
            }

            location /october/ {
                    proxy_pass              http://10.10.0.3:5601;
                    proxy_http_version      1.1;
                    proxy_set_header        Upgrade $http_upgrade;
                    proxy_set_header        Connection 'upgrade';
                    proxy_set_header        Host $Host;
                    proxy_cache_bypass      $http_upgrade;
            }
    }
}
1
Kuaaaly

以前の回答のおかげで、私は解決策を見つけましたが、それが「どのように」そして「なぜ」機能するのか正確にはわかりません...

これが私の新しい設定です:

server {
    listen                  80;
    server_name             my.domain.io;
    return                  301 https://$server_name;
}

server {
    listen                  443 ;
    ssl                     on;
    ssl_certificate         /etc/letsencrypt/live/my.domain.io/cert.pem;
    ssl_certificate_key     /etc/letsencrypt/live/my.domain.io/privkey.pem;
    server_name             my.domain.io;
    access_log              /var/log/nginx/kibana.access.log;
    error_log               /var/log/nginx/kibana.error.log;

    auth_basic              "Restricted";
    auth_basic_user_file    /etc/nginx/conf.d/kibana.htpasswd;

    location / {
            proxy_pass              http://localhost:5601;
            proxy_http_version      1.1;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection 'upgrade';
            proxy_set_header        Host $Host;
            proxy_cache_bypass      $http_upgrade;
    }

    location = /october {
            return 302 /october/;
    }

    location /october/ {
            proxy_pass              http://10.10.0.3:5601/;
            proxy_http_version      1.1;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection 'upgrade';
            proxy_set_header        Host $Host;
            proxy_cache_bypass      $http_upgrade;
    }
}

proxy_redirectディレクティブは必要ありません。秘訣は、/の場所の最後に/octoberを追加し、/october/october/whit302コードにリダイレクトすることでした。 kibana.ymlファイルでserver.basePath"/october"に設定する必要があることを忘れないでください。

この投稿は私を助けました: nginx proxy_passでパスを削除する方法

これが役に立てば幸い...

2
Kuaaaly

locationsが正しくネストされていないと思います。次を試してください:

server {
    listen                  443 ;
    ssl                     on;
    ssl_certificate         /etc/letsencrypt/live/my.domain.io/cert.pem;  
    ssl_certificate_key     /etc/letsencrypt/live/my.domain.io/privkey.pem;  
    server_name             my.domain.io; 
    access_log              /var/log/nginx/kibana.access.log;
    error_log               /var/log/nginx/kibana.error.log;

    auth_basic              "Restricted";
    auth_basic_user_file    /etc/nginx/conf.d/kibana.htpasswd;

    location / {
            proxy_pass              http://localhost:5601;
            proxy_http_version      1.1;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection 'upgrade';
            proxy_set_header        Host $Host;
            proxy_cache_bypass      $http_upgrade;
    }

    location ~ ^/october.*$ {
            proxy_pass              http://10.10.0.3:5601;
            proxy_http_version      1.1;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection 'upgrade';
            proxy_set_header        Host $Host;
            proxy_cache_bypass      $http_upgrade;
    }

}
2
NarūnasK

指定された構成では、_/october/some/path_へのリクエストはそのまま2番目のKibanaホストに渡されます。2番目のKibanaホストは、プレフィックスが_/october_のリクエストを予期するように構成されていない可能性があります。

Kibanaはわかりませんが、すばやく検索すると、_server.basePath_構成値を持つ 5.1の構成ドキュメント が表示されます。これを「/ 10月」に設定してみてください。

さらに、ドキュメントではこの値はKibanaによって生成されたURLにのみ影響を与えるため、_proxy_redirect_ディレクティブをnginx構成に追加し、_proxy_pass_ nginxディレクティブを変更して_/_を追加する必要がありますバックエンドURL:

_server {
    listen                  80;
    server_name             my.domain.io;
    return                  301 https://$server_name;
}

server {
    listen                  443 ;
    ssl                     on;
    ssl_certificate         /etc/letsencrypt/live/my.domain.io/cert.pem;  
    ssl_certificate_key     /etc/letsencrypt/live/my.domain.io/privkey.pem;  
    server_name             my.domain.io; 
    access_log              /var/log/nginx/kibana.access.log;
    error_log               /var/log/nginx/kibana.error.log;

    location / {
            auth_basic              "Restricted";
            auth_basic_user_file    /etc/nginx/conf.d/kibana.htpasswd;


            location / {
                    proxy_pass              http://localhost:5601;
                    proxy_http_version      1.1;
                    proxy_set_header        Upgrade $http_upgrade;
                    proxy_set_header        Connection 'upgrade';
                    proxy_set_header        Host $Host;
                    proxy_cache_bypass      $http_upgrade;
            }

            location /october/ {
                    proxy_pass              http://10.10.0.3:5601/;
                    proxy_redirect          /   /october/;
                    proxy_http_version      1.1;
                    proxy_set_header        Upgrade $http_upgrade;
                    proxy_set_header        Connection 'upgrade';
                    proxy_set_header        Host $Host;
                    proxy_cache_bypass      $http_upgrade;
            }
    }
}
_

_proxy_redirect_は、 "Location"および "Refresh"ヘッダーで返されたURLを書き換えます。追加のスラッシュにより、プロキシモジュールは、nginxの "location"ディレクティブに一致するパスを削除します。これらは効果的に互いに補完し合います。

0
Dom Sekotill