我想了解为什么会发生这种情况。当我使用不带正则表达式的 proxy_pass 时,一切都运行正常,DNS 得到解析,等等。
location /images/ {
proxy_pass http://sfs-filer:8888;
proxy_set_header Host $host;
}
但是,一旦我添加正则表达式,它就会开始抛出错误。
[错误] 29#29:*442 没有定义解析器来解析 sfs-filer,客户端:172.18.0.1,服务器:,请求:“GET /9395123a-39bd-4951-acd9-e759fae2e7f4.webp HTTP/1.1”,主机:“localhost”
location ~ ([a-zA-Z0-9-]+\.(jpg|jpeg|png|gif|webp|bmp|avif))$ {
proxy_pass http://sfs-filer:8888/$1;
proxy_set_header Host $host;
}
请注意,在 proxy_pass 中我根本没有更改域,它保持 1 比 1,如第一个示例所示。这怎么可能呢?为什么解析器依赖于正则表达式?
是的,我可以添加resolver 127.0.0.11 valid=10s;
,而且会起作用。但它的本质对我来说绝对是个谜。
当你的
proxy_pass
指令参数包含变量时,nginx 不会像往常一样在启动时解析你的上游 IP,而是尝试在请求处理期间进行解析,因此需要定义一个解析器。你的问题与如何使用 nginx ?问题几乎相同,答案可以proxy_pass
$remote_addr
在第二个答案引用的博客文章中找到:代理传递和解析器:我也有自己的答案,展示了如何在不使用指令的情况下解决问题
resolver
。唯一的区别是您使用的是正则表达式位置,并且需要命名捕获才能使用相同的技术,因为任何编号的捕获都会在指令执行期间被覆盖rewrite
:还有其他方法可以避免该
resolver
指令。例如,以下配置不需要它:(此处
sfs-filer
后端服务器IP地址会在nginx启动时解析)使用 IP 地址而不是域名来定义后端服务器也不需要定义解析器。例如,以下指令
需要一个解析器,而
指令则不会要求这样做。