NGINX ProxyPass 与正则表达式和解析器不起作用

问题描述 投票:0回答:1

我正在设置 NGINX 服务器,并使用正则表达式创建了一个块,并使用正则表达式捕获的部分添加了 ProxyPass 指令。

我使用 URL http://localhost:8089/first-context/custom-path/test 进行测试。我将 NGINX 的端口 80 公开为 8089。我的 .conf 文件如下:

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }

    location /first-context/test {
        try_files /main.html =404;
    }
    
    location ~ /(first-context|second-context)/custom-path/(.*)$ {
        # resolver 127.0.0.1; #8.8.8.8
        set $context $1;
        set $path $2;
        set $custom_upstream localhost;
        proxy_pass http://localhost:80/${context}/${path};
    }
}

如果没有解析器,我会收到不同的错误:

2024/12/19 05:09:00 [错误] 29#29: *1 没有定义解析器来解析本地主机,客户端:172.18.0.1,服务器:本地主机,请求:“GET /first-context/custom-path/测试 HTTP/1.1”,主机:“localhost:8089”

使用解析器指令会失败,并出现如下错误:

2024/12/19 05:07:18 [错误] 29#29:解析时发送()失败(111:连接被拒绝),解析器:127.0.0.1:53

我希望 NGINX 在打开 URL http://localhost:8089/first-context/custom-path/test 时返回 main.html。但我在控制台中收到 502 Bad Gateway,并出现上述错误。

任何人都可以解释为什么解析器不起作用以及如何修复它吗?

nginx proxypass resolver
1个回答
0
投票

因此 NGINX 解析您的

proxy_pass
中的上游地址的方式是通过 DNS。如果你说你的
server_name
localhost
,NGINX 将尝试通过 DNS 解析它,如果没有指定
resolver
,它最终会失败。

因此,您需要将解析器设置为常用的 DNS 服务器之一。我通常使用 Google 服务器(

8.8.8.8
8.8.4.4
)。当然,这假设您的计算机上没有运行 DNS 服务器,地址为
127.0.0.1

那么,就存在NGINX无法识别

URI
中变量的问题。简单来说,它将您的
proxy_pass
http://localhost:80/${context}/${path}
视为无效 URI,并且失败。这不是 NGINX 的错误,而只是对 NGINX 如何处理这些场景的误解。您可以设置代理标头,将 URI 更改为
X-Original-URI
+ 您传递的两个变量。

解决方案如下:

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location /first-context/test {
        try_files /main.html =404;
    }

    location ~ /(first-context|second-context)/custom-path/(.*)$ {
        set $context $1;
        set $path $2;
        proxy_pass http://127.0.0.1:80;
        proxy_set_header X-Original-URI /$context/$path;
    }
}

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.