假设我有一个docker-compose
设置,其中包含三个服务:
/foo
仅返回字符串“ foo” /bar
重定向到foo-app的/ foo端点/foo
至http://foo-app/foo
/bar
至http://bar-app/bar
如果我转到http://localhost/foo
,则收到的响应是上游foo-app
服务生成的HTTP 200“ foo”。这可以按预期工作。
如果我转到http://localhost/bar
,则收到的响应是HTTP 302,位置为http://bar-app/bar
。然后,我的浏览器尝试重定向到该URL,但是显然它无法访问,因为它在docker网络内部。我需要将其改写为http://localhost/bar
。
我的问题是:如何管理从一个上游服务重定向到另一上游服务的URL重写?这是我应该在我的Web应用程序中管理的东西吗?还是应该在反向代理处处理?
如果可能的话,我希望在反向代理服务器上进行管理。我认为我的Web应用程序不必知道它们背后是反向代理。
docker-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 / /;
}
}
}
Web应用程序被配置为分别具有/app1
和/app2
的上下文根。