При использовании nginx в качестве обратного прокси для группы серверов в блоке upstream, есть ли переменная, которая соответствует неразрешенному имени сервера? Например, рассмотрим следующую конфигурацию:
http {
upstream foo {
server foo1.example.com:8080;
server foo1.example.com:8081;
server foo2.example.com:8080;
server foo2.example.com:8081;
}
server {
server_name foo.example.com;
location / {
proxy_pass http://foo;
}
}
}
Пусть foo.example.com
, foo1.example.com
и foo2.example.com
будут определенными именами, которые разрешаются в 192.0.2.1, 192.0.2.2 и 192.0.2.3 соответственно.
Предположим, что запрос приходит на foo.example.com
и nginx решает выбрать foo2.example.com
порт 8080 в качестве сервера upstream, и запрос выполняется успешно. Тогда, насколько мне известно, это будут значения некоторых соответствующих переменных:
$host = foo.example.com
$proxy_host = foo
$upstream_addr = 192.0.2.3:8080
(*)
Однако ни один из них не соответствует значению, указанному в конфигурации для вышестоящего сервера. Поэтому, более конкретно, мой вопрос: какая переменная, если таковая имеется, будет иметь значение foo2.example.com:8080
в этом случае?
Чтобы избежать проблемы XY, я пытаюсь сделать следующее:
- регистрировать сервер верхнего уровня по имени хоста, а не по IP-адресу, поскольку разрешенный IP-адрес может быть временным или не поддерживать обратный просмотр 1:1
- на
map
вышестоящий сервер для другой части информации, которая более полезна, также для целей регистрации - для настройки проверки имени хоста (например, через
proxy_ssl_name
) для исходящего SSL, когда серверы не используют один и тот же сертификат (это может стать поводом для отдельного вопроса, но это не единственный вариант использования)
(*) = Переменная, $upstream_addr
по-видимому, недоступна на всех этапах запроса, например, добавление proxy_set_header Upstream-Addr $upstream_addr;
в блок местоположения, по-видимому, не имеет никакого эффекта, что означает, что переменная пуста
решение1
Прокси могут быть сложными. Nginx — proxy_set_header
это то, что вам нужно.Документация по Nginx
proxy_set_header Host $host;
Смотри сюдадля примераболее подробной конфигурации для прокси