仅供参考-我怀疑这有一个非常明显/简单的答案(我是 nginx 新手)
我在用动态上游作为我的 Nginx 配置的一部分。这意味着在proxy_pass
指令中使用变量,指示 nginxresolver
在上游出现问题(未知主机/无法连接)时使用而不是崩溃/不启动。
但是,这似乎也改变了proxy_pass
对 URI 的处理。它似乎忽略了请求 URI,而不是用proxy_pass
指令中指定的 URI 替换请求 URI。我正在寻找一种方法来保留(或重现)允许我继续使用动态主机的原始行为。
我尝试在这里创建一个最小的示例配置:
server {
listen 80;
server_name my-server.com;
# My chosen DNS server (in this case, the Docker DNS)
resolver 127.0.0.11 valid=30s ipv6=off;
# This works
location / {
set $upstream frontend:8080;
proxy_pass http://$upstream;
}
# This does not work :-(
# The original URI (e.g. /api/users/tommy) is ignored, and
# all requests to api-server are directly to /api/
location /api/ {
set $upstream api-server:8002;
proxy_pass http://$upstream/api/;
}
}
一种解决方法是从指令中删除 URI proxy_pass
,并让上游服务器监听所需的确切 URI。这并不理想,因为网关服务器的核心优势是增加了一些灵活性,可以独立更改内容(如果需要,可以重写 URI)
例如,
# This kind of works, but upstream must listen on /api
location /api {
set $upstream api-server:8002;
proxy_pass http://$upstream;
}
答案1
这文档指出如果你在proxy_pass
指令中使用变量和您指定一个 URI 部分,它将“按原样”向上游传递。
您需要捕获需要向上游发送的 URI 部分。可以使用正则表达式块location
,例如:
location ~ ^/api(.*)$ {
set $upstream ...;
proxy_pass http://$upstream$1;
}
或者使用 来rewrite...break
改变当前 URI,例如:
location /api {
set $upstream ...;
rewrite ^/api(.*)$ $1 break;
proxy_pass http://$upstream;
}