Конфигурация у меня ниже. Однако, когда пользователь переключается с 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, содержащий правильный внутренний сервер (который будет использоваться для всех дальнейших запросов), используя липкий.
Примечание. Это не универсальный ответ типа «копипаст», а всего лишь несколько моих простых идей. Прочтите документацию, и вы найдете решение. Удачи и всего наилучшего!