У меня проблема с моим Spring Boot API, который я использую в сочетании с Docker и Nginx в качестве обратного прокси.
В настоящий момент я создаю веб-сайт вместе с веб-сервисом REST. Веб-сервер и веб-сервис REST (Spring Boot) работают в двух разных контейнерах Docker. Чтобы обеспечить HTTPS (шифрование), я использую NGINX в качестве обратного прокси (который также работает как Docker-Container).
Теперь я использую следующую настройку в своем nginx.conf
чтобы разрешить внешний доступ к моему Spring API.
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}
.
Очевидно, к нему нельзя получить доступ с другого компьютера, использующего веб-сайт и связанный с ним веб-сервис. Вместо этого мне нужно, чтобы записи были https://{the-url-of-the-webserive}:7332/{entity}/{id}
.
Однако я не уверен, можно ли получить это разрешение из разрешения имен, которое использует NGINX (поскольку оно должно заменить server-backend
с участием spring:8081
) и Docker (должен заменить как минимум spring
расстаются с фактическим адресом).
На самом деле это можно решить, добавив X-Forward-*
заголовки в location
часть server
.
Это должно выглядеть следующим образом:
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 где вы также можете найти дополнительную информацию об этом решении.