Nginx 变量忽略大小写

Nginx variables ignore case

我正在使用 Docker 的服务发现设置 Nginx。我的服务名称是 webAdmin.

当前 Nginx 配置的相关部分读取

resolver 127.0.0.11 valid=10s;  # Docker DNS server
if (!-f $request_filename) {
    set $upstream_admin_server webAdmin:8000;
    proxy_pass http://$upstream_admin_server;
    break;
}

当访问适当的服务器时,Nginx returns 一个 404。日志显示 Nginx 正在尝试解析我的服务名称的小写版本。

2019/08/26 21:53:46 [error] 3756#3756: *1569 webadmin could not be resolved (3: Host not found), client: 10.0.0.29, server: admin.mysite.com, request: "GET /favicon.ico HTTP/1.1", host: "admin.mysite.com"

当我避免使用变量时,配置读取

resolver 127.0.0.11 valid=10s;  # Docker DNS server
if (!-f $request_filename) {
    proxy_pass http://webAdmin:8000;
    break;
}

Nginx 然后能够解析服务名称并正确路由我的请求。

我尝试使用单引号和双引号,但似乎都没有任何效果。 set 的 Nginx 文档似乎没有提供任何线索。

为什么我的变量被转换为小写?

我使用 nginx:alpine 时效果很好。我使用以下配置测试它并更改 LocalhOst.

的值
server {
    listen       80;
    server_name  localhost;
location / {
       set $upstream_admin_server LocalhOst:80;
       proxy_set_header   X-Forwarded-For $remote_addr;
       proxy_set_header   Host $http_host;
       proxy_pass         http://$upstream_admin_server/index.html;

 }
location /index.html {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

您可以在命令下测试它。

docker run --rm --name my-custom-nginx-container -p 80:80 -v $PWD/nginx.conf:/etc/nginx/conf.d/default.conf -it nginx:alpine

当 Nginx 尝试解析名称时,它实际上强制名称为小写。 Source can be found here.

我假设这个决定是在知道 DNS 名称应该是 "case insensitive" 的情况下做出的。但它会导致显式声明的 resolver 和默认的 resolver 之间的行为不一致。

目前看来最好的选择是避免在服务名称中使用大写。 (即 webAdmin -> web_admin

感谢Adiii指导!