我有下面的configuration。 但是,当用户从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组,所以两个组之间不共享状态。 现在我不能进一步testing,但是这里有一些我的想法:
使用一个upstream组,检查$scheme ,利用variables映射为$scheme分配正确的端口(http或https),并在server指令中使用这个variables,这样就变成server <server-1-ip>:$variable 。
使用“保留工作进程之间共享的组configuration和运行时状态的区域,多个组可以共享同一个区域”。
您可以使用ip_hash插入包含正确后端服务器(将用于所有其他请求)的cookie,而不是使用ip_hash 。
注意:这不是一个复制粘贴的一刀切的答案,而只是我的一些快速的想法。 阅读文档,你会find一个解决scheme。 祝你好运,一切顺利!