
Итак, вот в чем дело:
Балансировщик нагрузки (haproxy) доставляет данные на 3 веб-сервера и сервер базы данных, всего 5 серверов с сеансами memcache, которые совместно используются веб-серверами. Я могу подтвердить, что они PHPSESSIONID
совместно используются веб-серверами, однако, когда я пытаюсь войти в систему, $_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
Я знаю, что это старая тема, но интересно, были ли какие-то перенаправления 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
Затем я обновил конфигурации WP для сайта с 'http://some_site.com' к 'https://some_site.com'.
Это сработало, как и ожидалось.