【问题标题】:Nginx variables ignore caseNginx 变量忽略大小写
【发布时间】:2019-12-31 17:38:20
【问题描述】:

我正在使用 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 返回 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 版本?
  • 基础 docker 镜像是从 nginx:1.15.9 拉取的。其中使用 Nginx 版本 1.15.12。
  • 你可以试试我贴的图,一定能解决你的问题

标签: docker nginx nginx-config service-discovery


【解决方案1】:

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

我认为这个决定是在知道 DNS 名称应该“不区分大小写”的情况下做出的。但它会导致显式声明的resolver 和默认的resolver 之间的行为不一致。

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

感谢 Adiii 的指导!

【讨论】:

    【解决方案2】:

    我使用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
    

    【讨论】:

    • 在进行更多挖掘时,我注意到当我注释掉我的解析器时,我可以获得与您相同的结果。 no resolver defined to resolve webAdmin。也许解析器正在强制执行?
    • 是的,也许,我认为它的评论。 :D
    • 你不需要定义Docker DNS服务器
    • 你能扩展一下不需要定义 Docker DNS 服务器吗?我的印象是,如果我在proxy_pass 语句中使用变量,它就是necessary to define a resolver。我可以不使用变量而侥幸成功,但这需要我在添加或删除服务时重新加载 Nginx。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2014-02-08
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多