Переменные Nginx игнорируют регистр

Я настраиваю Nginx, используя обнаружение службы Docker. Мое имя службы 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 может разрешить имя службы и правильно направить мой запрос.

Я пытался использовать кавычки, одинарные и двойные, но, похоже, ни один из них не имеет никакого эффекта. Документы Nginx для set, похоже, не дают никаких подсказок.

Почему моя переменная преобразуется в нижний регистр?


person derek    schedule 27.08.2019    source источник
comment
какой базовый образ вы используете и версию nginx?   -  person Adiii    schedule 27.08.2019
comment
Базовый образ докера взят из nginx:1.15.9. Который использует Nginx версии 1.15.12.   -  person derek    schedule 27.08.2019
comment
Вы можете попробовать мое размещенное изображение, и оно определенно решит вашу проблему.   -  person Adiii    schedule 28.08.2019


Ответы (2)


Когда Nginx пытается разрешить имя, он фактически переводит имя в нижний регистр. Источник можно найти здесь.

Я предполагаю, что это решение было принято с осознанием того, что DNS-имена должны быть «нечувствительны к регистру». Но это приводит к непоследовательному поведению между явно объявленным resolver и resolver по умолчанию.

На данный момент кажется, что лучший вариант — избегать использования заглавных букв в именах сервисов. (т.е. webAdmin -> web_admin)

Спасибо Adiii за руководство!

person derek    schedule 29.08.2019

Он отлично работает со мной, используя 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

введите здесь описание изображения

person Adiii    schedule 27.08.2019
comment
Продолжая копать, я заметил, что могу добиться тех же результатов, что и вы, когда закомментирую свой преобразователь. no resolver defined to resolve webAdmin. Возможно, преобразователь выполняет принуждение? - person derek; 28.08.2019
comment
Да, может быть, я думал, что это комментарий. :D - person Adiii; 28.08.2019
comment
вам не нужно определять DNS-сервер Docker - person Adiii; 28.08.2019
comment
Не могли бы вы уточнить, что вам не нужно определять DNS-сервер Docker? У меня сложилось впечатление, что если я использовал переменную в операторе proxy_pass, то необходимо определить преобразователь. Я мог бы не использовать переменную, но это потребовало бы перезагрузки Nginx каждый раз, когда я добавлял или удалял службу. - person derek; 28.08.2019