Использование директивы карты nginx для динамической установки прокси вверх по течению

Я пытаюсь сделать свой Nginx немного более сухим, так как он действует как обратный прокси почти для 20 серверов. Вот что я пытаюсь сделать, все имена хостов и прочее изменены/примеры:

map $http_host $backend {
    baz.mydomain.com       hostname1:8080;
    foo.mydomain.com       192.168.1.10:8081;
    bar.mydomain.com       hostname2:1234;
    ham.mydomain.com       hostname2:5678;
}

server {
    listen                      443 ssl http2;
    server_name                 .mydomain.com;

    ssl_certificate             /usr/share/nginx/certs/mydomain.com.pem;
    ssl_certificate_key         /usr/share/nginx/certs/mydomain.com.key;

    location / {
        proxy_redirect          http:// https://;
        proxy_pass              http://$backend;
    }
}

Проблема в том, что несмотря ни на что, это всегда будет выдавать ошибку bad gateway. Я пробовал несколько вариантов и перемещал вещи, с подстановочным знаком server_name и без него, с $host вместо $http_host, но пока не могу заставить его работать. Я даже иду об этом правильно? Я действительно предпочел бы не иметь почти 20 отдельных записей виртуальных серверов в моей конфигурации.

В документации nginx не так много помощи по использованию такой карты, и не так много в Интернете, за исключением одного очень старого сообщения, в котором кратко упоминается что-то подобное здесь: https://serverfault.com/questions/342309/how-to-write-a-dry-modular-nginx-conf-reverse-proxy-with-named-locations


person Tal Bull    schedule 01.05.2018    source источник


Ответы (1)


Я разобрался. Проблема заключалась в том, что ему не нравилось иметь имена хостов в списке. Имена хостов необходимы, так как все эти адреса распределяются динамически. Это было решено с помощью директивы upstream следующим образом:

upstream bazhost {server hostname1:8080;}
upstream foohost {server 192.168.1.10:8081;}
upstream barhost {server hostname2:1234;}
upstream hamhost {server hostname2:5678;}

map $http_host $backend {
    baz.mydomain.com       bazhost;
    foo.mydomain.com       foohost;
    bar.mydomain.com       barhost;
    ham.mydomain.com       hamhost;
}

server {
    listen                      443 ssl http2;
    server_name                 .mydomain.com;

    ssl_certificate             /usr/share/nginx/certs/mydomain.com.pem;
    ssl_certificate_key         /usr/share/nginx/certs/mydomain.com.key;

    location / {
        proxy_redirect          http:// https://;
        proxy_pass              http://$backend;
    }
}
person Tal Bull    schedule 01.05.2018