情况是这样的:
负载平衡器 (haproxy) 为 3 个 Web 服务器和一个数据库服务器提供服务,总共 5 个服务器,Web 服务器之间共享 memcache 会话。我可以确认PHPSESSIONID
Web 服务器之间共享了 memcache 会话,但是当我尝试登录时,它$_POST
不断重置,并且登录 cookie 从未设置,导致不断重定向到登录页面。
我已经设置了appsessionid
haproxy,并且它有效,但在我看来,这违背了使用负载平衡器的目的,因为大多数用户都会登录,所以很可能一台服务器会比其他服务器接收更多的流量。有人遇到过这种情况吗?有什么解决办法吗?还是我被迫使用粘性会话?
编辑1:
做了一些研究,发现我可以保存$_POST
,$_SESSION
但可能会存在一些安全问题。我的想法是在每个页面的关闭操作中将其从会话中清除。有什么想法吗?
编辑2:
以下是/etc/haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
daemon
user haproxy
group haproxy
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL).
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers LONG LIST OF CIPHERS
defaults
log global
balance leastconn
mode http
option httplog
option dontlognull
option redispatch
option http-server-close
option forwardfor
option abortonclose
maxconn 3000
retries 3
timeout queue 1m
timeout connect 10s
timeout client 5m
timeout server 5m
timeout http-request 5s
timeout http-keep-alive 10s
timeout check 10s
frontend www-http
bind xxx.xxx.xxx.xxx:80
reqadd X-Forwarded-Proto:\ http
redirect scheme https if !{ ssl_fc }
default_backend wordpress-backend
frontend www-https
bind xxx.xxx.xxx.xxx:443 ssl no-sslv3 crt /etc/ssl/private/default.pem crt /etc/ssl/private/
rspadd Strict-Transport-Security:\ max-age=15768000
reqadd X-Forwarded-Proto:\ https
default_backend wordpress-backend
backend wordpress-backend
option httpchk HEAD /haphealth
server wordpress-1 xxx.xxx.xxx.xxx:8081 maxconn 10 check
server wordpress-2 xxx.xxx.xxx.xxx:8081 maxconn 10 check
server wordpress-3 xxx.xxx.xxx.xxx:8081 maxconn 10 check
答案1
我知道这是一个老话题,但我想知道 Web 服务器上是否存在一些 303 重定向。在这种情况下,客户端将使用 GET 重试,POST 数据将丢失。请改用 307 重定向。
答案2
我在同一页面上返回安全(https)和不安全(http)数据的网站上使用它:
frontend WordPress
mode http
option httplog
bind <ip_address>:80 transparent
bind <ip_address>:443 transparent ssl crt <path_to_cert>
http-request set-header X-Forwarded-Proto https # <------ This is the line makes sure everything that's requested is HTTPS
redirect scheme https code 307 if !{ ssl_fc }
default_backend wp_backend
然后,我从“http://some_site.com' 到 'https://some_site.com“”。
一切如预期般顺利。