web-dev-qa-db-ja.com

Docker環境でSpringAPIリソースURIが間違っている

リバースプロキシとしてDockerおよびNginxと組み合わせて使用​​するSpringBootAPIに問題があります。

現在、REST Webサービスと一緒にWebサイトをセットアップしています。WebサーバーとREST Webサービス(Spring Boot)は2つの異なるDockerコンテナーで実行されています。HTTPS(暗号化)を提供するために、NGINXをリバースプロキシとして使用します(これはDockerコンテナとしても実行されています)。

現在、nginx.confで次の設定を使用して、SpringAPIへの外部アクセスを有効にしています。

upstream spring-backend {
    server spring:8081;
}

# ... some other configuration stuff

server {
    listen               7332;
    ssl                  on;

    #   ... ssl-config

    # all other traffic
    location / {
        # Specify the fields added/redefined to the request header passed to the proxied server.
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection $connection_upgrade;
        # Timeout for reading a response from the proxied server.
        proxy_read_timeout      3600; # keep open even without any transmission
        proxy_pass              http://spring-backend;
    }
}

これはうまく機能しますが、Springが作成したエンティティに対して作成するAPI URIが次のようになるという問題が発生しています:http://spring-backend/{entity}/{id}

これは、Webサイトとそれに関連するWebサービスを使用している別のコンピューターからはアクセスできないようです。代わりに、エントリをhttps://{the-url-of-the-webserive}:7332/{entity}/{id}にする必要があります。

ただし、NGINXが使用する名前解決(server-backendspring:8081に置き換える必要があるため)とDockerの名前解決(少なくともspringの部分を置き換える必要があるため)からこの解決策を取得できるかどうかはわかりません実際のアドレスで)。

1
Marco N.

実際、これはlocationserver部分にX-Forward-*ヘッダーを追加することで解決できます。

これは次のようになります。

location / {
    # Specify the fields added/redefined to the request header passed to the proxied server.
    proxy_set_header        Upgrade $http_upgrade;
    proxy_set_header        Connection $connection_upgrade;

    #--------------------------------- SOLUTION -------------------------------------------
    proxy_set_header        Host               $Host;
    proxy_set_header        X-Real-IP          $remote_addr;
    proxy_set_header        X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Host   $Host:443; #or $Host:7332 in my case
    proxy_set_header        X-Forwarded-Server $Host;
    proxy_set_header        X-Forwarded-Port   443; #or 7332 in my case
    proxy_set_header        X-Forwarded-Proto  https;
    #------------------------------- SOLUTION-END -----------------------------------------

    # Timeout for reading a response from the proxied server.
    proxy_read_timeout      3600; # keep open even without any transmission
    proxy_pass              http://spring-backend;
}

そのコードスニペットは plone.lucidsolutions.co.nz から取得されており、このソリューションの詳細情報もあります。

0
Marco N.