Заголовок узла Nginx для восходящего потока

#nginx

#nginx

Вопрос:

Я использую nginx, и у меня проблема с настройкой обратного прокси.

Мой nginx.conf установлен по умолчанию (в него не вносились никакие изменения), а моя конфигурация, доступная на сайте, является:

 upstream backend_hosts {
    server server1.example.com
    server server2.example.com
}

server {
    listen 80;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://backend_hosts;
    }
}
  

и это не работает, он не передает заголовок узла. Когда я делаю что-то подобное, это работает:

 ...

proxy_set_header Host server1.exampple.com;

...
  

Я хотел бы сделать что-то вроде этого:

 proxy_set_header Host $current_upstream_server_name;
  

Комментарии:

1. Какое значение вы хотите использовать? server{1,2}.example.com ? Если да, пробовали ли вы $proxy_host вместо $host ?

2. Я хочу, чтобы он был установлен на тот, который выбран восходящим потоком, я пробовал $ proxy_host, и он также не работает.

3. Ага. Хорошо, не могли бы вы пояснить, как именно это «не работает»? Заголовок не установлен, пуст или что-то еще?

4. Ну, это работает только тогда, когда я пишу имя восходящего сервера напрямую, как я указал в своем посте, когда я установил заголовок в server1.example.com это работает, если я установлю для него значение $host или $ proxy_host, он вернет ошибку 404.

5. Хорошо, к сожалению, я не думаю, что есть чистое решение. Я попробовал вашу настройку, и для меня $host содержит исходное значение из запроса, в то время как $proxy_host установлено значение "backend_hosts" . Кроме того, я нашел аналогичный вопрос в ServerFault, который может (или не может) помочь: serverfault.com/questions/598202 /…

Ответ №1:

Мы также боролись с этой проблемой, и, хотя это не полный ответ, я считаю, что это может помочь будущим пользователям перейти на эту страницу.

Можно записать IP-адрес выбранного восходящего сервера, обратившись к переменной восходящего потока $upstream_http_name .

 http {
    upstream backend {
        server server1.example.com;
        server server2.example.com;
    }
    
    server {
        location / {
            proxy_set_header Host $upstream_http_name;
            proxy_pass http://backend;
        }
    }
}
  

Если, как в нашем приложении, получение IP приемлемо, то вышеуказанная конфигурация передаст эту информацию в заголовок узла прокси-запроса.

Полный список переменных, предоставляемых восходящим модулем, можно найти здесь

Комментарии:

1. По ссылке написано: $upstream_http_name сохраняет поля заголовка ответа сервера.

2. Да, это не работает. После проверки журналов значение upstream_http_name по какой-то причине всегда пустое.