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

Как настроить nginx как липкий балансировщик нагрузки как для http, так и для https

Конфигурация у меня ниже. Однако, когда пользователь переключается с http на https, сеанс больше не сохраняется. Например. домашняя страница http, но страница оплаты - https.

Как мне решить эту проблему?

upstream backend  {
    ip_hash;
    server <server-1-ip>;
    server <server-2-ip>;
}

upstream backend_ssl {
    ip_hash;
    server <server-1-ip>:443;
    server <server-2-ip>:443;
}

server {
    location / {
        proxy_pass http://backend;
        proxy_set_header 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;
    }

}

server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/mycert.crt;
    ssl_certificate_key /etc/nginx/ssl/mykey.key;
    location / {
        proxy_pass https://backend_ssl;
        proxy_set_header 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;
    }
}

Думаю, потому что вы используете два upstream групп, состояние не разделяется между двумя группами. Прямо сейчас я не могу проверить это дальше, но вот несколько моих идей:

  • Используйте один upstream группа, осмотрите $scheme, кредитное плечо карта с переменной для назначения правильных портов $scheme (http или https) и используйте эту переменную в своем server директива, поэтому это становится server <server-1-ip>:$variable.

  • Использовать зона который «сохраняет конфигурацию группы и состояние выполнения, которые используются рабочими процессами. Несколько групп могут находиться в одной зоне».

  • Вместо того, чтобы использовать ip_hash, вы можете вставить файл cookie, содержащий правильный внутренний сервер (который будет использоваться для всех дальнейших запросов), используя липкий.

Примечание. Это не универсальный ответ типа «копипаст», а всего лишь несколько моих простых идей. Прочтите документацию, и вы найдете решение. Удачи и всего наилучшего!