リバースプロキシとして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-backend
をspring:8081
に置き換える必要があるため)とDockerの名前解決(少なくともspring
の部分を置き換える必要があるため)からこの解決策を取得できるかどうかはわかりません実際のアドレスで)。
実際、これはlocation
のserver
部分に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 から取得されており、このソリューションの詳細情報もあります。