Использование директивы карты nginx для динамической установки прокси - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь сделать свой 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;
    }
}

Проблема в том, что, несмотря ни на что, это всегда приведет к ошибке шлюза. Я пробовал несколько вариантов и перемещал их, используя подстановочный знак 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

1 Ответ

0 голосов
/ 01 мая 2018

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

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;
    }
}
...