nginx балансировщик нагрузки Заголовок хоста

Вопрос или проблема

Я настраиваю балансировщик нагрузки nginx, где текущая конфигурация выглядит так:

upstream solrnodes {
        least_conn;
        server node01.cluster.solr.example.com:8983;
        server node02.cluster.solr.example.com:8983;
        server node03.cluster.solr.example.com:8983;
}

server {
        listen 443 ssl;
        error_log /var/log/nginx/error.log debug;

        ssl_certificate /etc/letsencrypt/live/cluster.solr.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/cluster.solr.example.com/privkey.pem;

        server_name cluster.solr.example.com;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5:!3DES;
        ssl_prefer_server_ciphers on;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options DENY;
        add_header X-XSS-Protection "1; mode=block";

        location / {
                proxy_pass https://solrnodes;
                proxy_ssl_name $proxy_host;
                proxy_ssl_server_name on;
                proxy_set_header Host $proxy_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

Однако при тестировании журнал ошибок сообщает, что в запросе к upstream серверу заголовок Host по какой-то причине установлен на solrnodes:

"GET / HTTP/1.0
Host: solrnodes
X-Real-IP: 1.2.3.4
X-Forwarded-For: 1.2.3.4
X-Forwarded-Proto: https
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:132.0) Gecko/20100101 Firefox/132.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br, zstd
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Pragma: no-cache
Cache-Control: no-cache

Я хочу установить SNI в запросе таким же, как и адрес upstream.

Где ошибка в моей конфигурации?

Ответ или решение

Проблема с заголовком Host в конфигурации Nginx Load Balancer

Ваша конфигурация Nginx для балансировки нагрузки, как видно из представленного фрагмента, имеет некоторые нюансы, влияющие на заголовок Host, отправляемый на ваши upstream-серверы. Вы заметили, что в логах запросов заголовок Host устанавливается как solrnodes, что не соответствует вашим ожиданиям.

Важность заголовка Host

Заголовок Host имеет решающее значение для работы современных веб-приложений и API, поскольку многие серверы используют его для определения, какой конкретно виртуальный хост должен обрабатывать входящий запрос. Если заголовок установлен неверно, это может привести к неправильной маршрутизации или даже к ошибкам при обработке запросов.

Анализ конфигурации

Ваша текущая конфигурация выглядит следующим образом:

proxy_pass https://solrnodes;
proxy_ssl_name $proxy_host;
proxy_ssl_server_name on;
proxy_set_header Host $proxy_host;

Проблема заключается в значении переменной $proxy_host, которая, скорее всего, не определена в вашем контексте, что приводит к установке заголовка Host как solrnodes. Конкретно, при использовании proxy_pass, Nginx ожидает, что вы передадите правильное значение.

Решение проблемы

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

  1. Используйте значение, соответствующее именам ваших upstream-серверов. Например, вы можете явно задать заголовок:

    proxy_set_header Host $host;  # или явно укажите нужное имя

    Или замените $proxy_host на правильное значение:

    proxy_set_header Host node01.cluster.solr.example.com;  # Можно использовать переменную, если используется динамическая маршрутизация
  2. Изменяйте формат proxy_pass. Убедитесь, что при отправке запроса заголовок Host передает имя нужного сервера. Например:

    location / {
        proxy_pass https://$host;  # Тут `$host` заменяет на текущий хост запроса
    }
  3. Обратите внимание на SNI. Если вы хотите задать SNI (Server Name Indication) согласно запрашиваемому хосту, убедитесь, что proxy_ssl_name получает правильное значение:

    proxy_ssl_name $host;  # Это будет отправлять актуальное имя для SNI

Пример окончательной конфигурации может выглядеть так:

location / {
    proxy_pass https://solrnodes;
    proxy_ssl_name $host;
    proxy_ssl_server_name on;
    proxy_set_header Host $host;  # Устанавливаем заголовок Host
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Заключение

Правильное управление заголовком Host играет ключевую роль в работе вашего Nginx load balancer. Убедитесь, что вы используете либо переменную $host, либо конкретное имя вашего upstream-сервера. Это поможет избежать проблем с маршрутизацией запросов и обеспечит корректную работу всей системы. Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...