如何将 nginx 配置为 http 和 https 的粘性负载均衡器

如何将 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;
    }
}

答案1

嗯,我猜是因为您使用了两个upstream组,所以状态不会在两个组之间共享。目前我无法进一步测试这一点,但以下是我的一些想法:

  • 使用一upstream组,检查$scheme,杠杆地图$scheme使用变量来为(http 或 https)分配正确的端口,并在您的server指令中使用此变量,因此这变成server <server-1-ip>:$variable

  • 使用它“保留了工作进程之间共享的组的配置和运行时状态。多个组可能共享同一个区域。”

  • 除了使用 之外ip_hash,您还可以使用以下方法插入包含正确后端服务器的 cookie(该服务器将用于所有后续请求)

注意:这不是一个复制粘贴的万能答案,只是我的一些想法。阅读文档,你会找到解决方案。祝你好运,一切顺利!

相关内容