我尝试使用Nginx作为一些后端的反向代理,这可能无关紧要,但后端都托管在一个Docker网络中,并且该网络是使用docker-compose
创建的。
所有后端都具有需要公开的相同端点,因此为了减少重复的配置行,我尝试使用map
。
map $http_host $backend {
host-a.example.com host-a;
host-b.example.com host-b;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name _;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
location / {
# there is no DNS resolution if we set proxy_pass targets dynamically,
# use the docker internal DNS server
resolver 127.0.0.11;
proxy_pass "http://$backend:8080/";
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
添加了resolver
行,否则Nginx将给予错误:no resolver defined to resolve *hostname*
然而,在这种配置下,我发现请求被发送到了错误的路径,例如,如果我向https://host-a.example.com/books
或https://host-a.example.com/books/123/front-cover.jpg
发送请求,返回的页面总是站点的根(即https://host-a.example.com/
),似乎由于某种原因,proxy_pass不包括请求到后端服务器的路径。
有没有办法让map
也可以使用这个方法,或者我需要为我想代理请求的每个后端创建一个单独的server
块。
1条答案
按热度按时间ctzwtxfj1#
从
proxy_pass
文档中:在proxy_pass中使用变量时
在这种情况下,如果在指令中指定了URI,则它将按原样传递给服务器,替换原始请求URI。
您应该删除尾随的
/
(文档将其称为 * optional URI *):或者提供请求的完整URL(作为内置变量提供,非常方便):