Предположим, у меня есть docker-compose
установка с тремя службами:
- foo-app с конечной точкой
/foo
, которая просто возвращает строку "foo"
- bar-app с конечной точкой
/bar
, которая перенаправляет на конечную точку foo-app / foo
- обратный прокси-сервер (nginx, httpd или аналогичный), прослушивающий хост, который отображает следующее:
/foo
до http://foo-app/foo
/bar
до http://bar-app/bar
Если перейти к http://localhost/foo
, я получу ответ HTTP 200 «foo», сгенерированный вышестоящей foo-app
службой. Это работает как ожидалось.
Если я перейду к http://localhost/bar
, я получу ответ HTTP 302 с местоположением http://bar-app/bar
. Мой браузер затем пытается перенаправить на этот URL, но, очевидно, он не может достичь его, так как он находится внутри сети докера. Мне нужно переписать это как http://localhost/bar
.
У меня такой вопрос: как мне управлять перезаписью URL-адресов, которые перенаправляют с одного вышестоящего сервиса на другой? Это то, чем я должен управлять в своем веб-приложении? Или я должен справиться с этим на обратном прокси?
Я бы предпочел управлять этим на обратном прокси-сервере, если это возможно. Я не думаю, что мои веб-приложения должны знать, что они находятся за обратным прокси.
докер-compose.yml
version: '3'
services:
test-app-1:
image: revproxy/test-app-1:1.0-SNAPSHOT
ports:
- "7401:8080"
- "7321:8000"
test-app-2:
image: revproxy/test-app-2:1.0-SNAPSHOT
ports:
- "7402:8080"
- "7322:8000"
nginx:
image: revproxy/nginx:1.0-SNAPSHOT
ports:
- '7400:80'
nginx.conf
worker_processes 1;
events { worker_connections 1024; }
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $upstream_addr '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
server {
listen 80;
access_log /var/log/nginx/access.log compression;
location /app1/ {
proxy_pass http://test-app-1:8080;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host:7400;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect / /;
}
location /app2/ {
proxy_pass http://test-app-2:8080;
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host:7400;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect / /;
}
}
}
Веб-приложения настроены на контекстные корни /app1
и /app2
соответственно.