Назад | Перейти на главную страницу

Балансировщик нагрузки Apache2 с липким сеансом липкий только для GET, а не POST

Я установил 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 не может сопоставить этот запрос с другими запросами.
Если никто не предложит лучшего объяснения, я отвечу на этот вопрос самостоятельно.