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

Проблема с конфигурацией балансировщика Apache mod_proxy с запросом POST

Я пытаюсь настроить балансировщик нагрузки с Apache mod_proxy и Tomcat. У меня есть следующие модули (mod_proxy, mod_proxy_balancer, mod_proxy_http). У меня есть 2 экземпляра Tomcat, и я планирую направить запрос на один из серверов Tomcat.

Мое приложение на Tomcat работает нормально при прямом доступе. www.mydomain: 8080 / myapp www.mydomain: 9080 / myapp

Мой Tomcat server.xml имеет следующий Tomcat 1 Engine name = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat1"

Имя ядра Tomcat 2 = "Catalina" defaultHost = "localhost" jvmRoute = "tomcat2"

Вот что у меня в virtualhost.conf

<IfModule proxy_module>
        ProxyRequests on
        ProxyPreserveHost Off
        ProxyPass / balancer://mycluster/ stickysession=JSESSIONID
        ProxyPassReverse / balancer://mycluster/ stickysession=JSESSIONID
    ProxyPassReverseCookiePath /myapp /

        <Proxy balancer://mycluster >
                BalancerMember http://localhost:8080/myapp route=tomcat1
                BalancerMember http://localhost:9080/myapp route=tomcat2

                Require all granted
                ProxySet lbmethod=byrequests
        </Proxy>

    <Location /balancer>
        SetHandler balancer
        Require host www.mydomain.com
    </Location>
</IfModule>

С приведенной выше конфигурацией я могу получить доступ к первой странице сайта. Когда я захожу на www.mydomain.com, он загружает страницу входа (www.mydomain.com/login.do). Когда я нажимаю на другие ссылки, он открывает правильные страницы. Например: www.mydomain.com/password-reset.do Базовая отработка отказа также работает. Если я отключу один экземпляр Tomcat, он будет обслуживать страницу с другого сервера и наоборот.

Но когда я пытаюсь отправить любой запрос POST, например, попытаться войти в систему, URL-адрес меняется на www.mydomain / myapp / login.do и всегда показывает страницу входа.

Я не уверен, что приведенные выше записи conf полностью соответствуют тому, что я хочу. Может ли кто-нибудь указать мне, что не так. Также, пожалуйста, дайте мне знать, если мне здесь что-то не хватает в отношении успеха. Я также хотел бы, чтобы файлы изображений и другие файлы обслуживались непосредственно с веб-сервера. Пожалуйста, дайте мне знать, как я могу это сделать.

Спасибо

Обычно это происходит в двух случаях. Это не требует балансировщика - это все равно происходит с одним бэкендом.

  1. Место в HTML-коде приложения может содержать буквальный абсолютный URL-адрес, например http://example.com/myapp/post_here поэтому POST отправляется туда (что на самом деле попадает в бэкэнд с http://127.0.0.1:xxxx/myapp/myapp/post_here). Для этого существует широкий спектр решений.

  2. Другая возможность. POST обычно приводит к перенаправлению (302). Бэкэнд может перенаправить на абсолютный URL http://example.com/myapp/post_here которые бы не поймали. Ваш ProxyPassReverse в настоящее время ловит только http://127.0.0.1:xxxx/myapp/post_here. Можете добавить ProxyPassReverse / http://example.com/myapp ниже вашего как дополнительный, это разрешено.

Оба случая легко заметить, если вы настроите свой браузер на регистрацию сетевых запросов / ответов (опция разработчика как в Firefox, так и в Chrome).