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指导!
我正在使用 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指导!