Я установил Apache 2.4.6 на Centos с mod_proxy
и mod_headers
как описано в https://wiki.apache.org/httpd/LoadBalanceWithoutStickyCookie
Моя цель - иметь липкие сеансы, даже если бэкэнд-сервер сам по себе не генерирует cookie сеанса. В большинстве случаев это работает, но иногда запросы POST отправляются на другой внутренний сервер, чем запросы GET.
Вот соответствующая часть моего файла конфигурации:
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set SSL-FRONTEND "yes"
## Proxy rules
ProxyRequests Off
ProxyPreserveHost On
# define a balancer
<Proxy balancer://mycluster>
BalancerMember http://backendserver1 route=route1 loadfactor=1 ttl=300
BalancerMember http://backendserver2 route=route2 loadfactor=1 ttl=300
Proxy
</Proxy>
# set a sticky cookie
Header add Set-Cookie "ROUTEID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
ProxyPass / balancer://mycluster/ stickysession=ROUTEID
ProxyPassReverse / balancer://mycluster/
Когда я перехожу на вкладку сети браузера и анализирую запросы, я вижу, что все GET имеют одинаковый файл cookie ROUTEID (например, sticky.route1
), но запрос POST (здесь: csp-report, потому что мы используем Политика безопасности контента с URL-адресом отчета), иногда переходите на другой внутренний сервер, и идентификатор ROUTEID здесь иногда отличается - например, sticky.route2
Я искал, но пока не нашел решения.
Кто-нибудь еще сталкивался с такой проблемой?
Не могли бы вы мне помочь, пожалуйста?
Спасибо и всего наилучшего,
Александр
Обновление 2019-01-16: Похоже, это на самом деле не проблема с apache или балансировкой нагрузки, но небольшая "проблема" с CSP реализация в браузерах (проверено: FireFox и Chrome).
Похоже, браузеры используют другую реализацию того, как они выполняют вызовы POST для report-url
что указано в Content-Security-Policy
заголовок: они просто не отправляют файлы cookie браузера для данного сайта в report-url
. Таким образом, apache не может сопоставить этот запрос с другими запросами.
Если никто не предложит лучшего объяснения, я отвечу на этот вопрос самостоятельно.