Назад | Перейти на главную страницу

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

Я хотел бы использовать одно и то же определение восходящего потока с несколькими портами:

upstream production {
    server 10.240.0.26;
    server 10.240.0.27;
}
server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production:1234;
    }
}
server {
    listen 80;
    server_name other.host;
    location / {
        proxy_pass http://production:4321;
    }
}

Используя эту конфигурацию nginx -t бросает: upstream "production" may not have port 1234 и возвращается с кодом выхода 1.

Когда я пытаюсь определить proxy_pass URL (или его части) как переменную, например:

set $upstream_url "http://production:1234"
set $upstream_host production;
set $upstream_port 1234;
proxy_pass $upstream_url;
# or
proxy_pass http://production:$upstream_port;
# or
proxy_pass http://$upstream:$upstream_port;

Nginx пытается разрешить имя моего восходящего потока через преобразователь:

 *16 no resolver defined to resolve production, client: ...., server: some.host, request: "GET / HTTP/1.1", host: "some.host"

Для меня proxy_pass doc звучит так, как будто именно этого не должно происходить;

Имя сервера, его порт и переданный URI также можно указать с помощью переменных:

proxy_pass http: // $ host $ uri; или даже так:

proxy_pass $ request; В этом случае имя сервера ищется среди описанных групп серверов и, если оно не найдено, определяется с помощью распознавателя.

Протестировано с версиями nginx:

Я что-то упускаю? Есть ли способ обойти это?

Вы должны определить порт в каждом server вход в upstream. Если вы этого не сделаете, nginx установит для него значение 80. Так server 10.240.0.26; на самом деле означает server 10.240.0.26:80;.

Однако вы можете определить несколько восходящих блоков:

upstream production_1234 {
    server 10.240.0.26:1234;
    server 10.240.0.27:1234;
}
upstream production_4321 {
    server 10.240.0.26:4321;
    server 10.240.0.27:4321;
}
server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production_1234;
    }
}
server {
    listen 80;
    server_name other.host;
    location / {
        proxy_pass http://production_4321;
    }
}

Другой вариант - настроить локальный DNS для разрешения имени хоста production на несколько IP-адресов, и в этом случае nginx будет использовать их все.

http://nginx.org/r/proxy_pass: Если имя домена разрешается в несколько адресов, все они будут использоваться циклически.

server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production:1234;
    }
}

Когда вы используете восходящие потоки, порты определяются в восходящих блоках:

upstream production {
    server 10.240.0.26:8080;
    server 10.240.0.27:8081;
}

Другими словами, nginx разрешает proxy_pass аргумент либо вышестоящей группе, либо host:port пара. Когда вы используете переменную в качестве аргумента, она разрешает только host:port пара.