Apache не может подключиться к новому Tomcat 9 ajp
Мой apache2 больше не может подключаться (с помощью ajp) к моему встроенному tomcat в загрузке Spring после обновления версии загрузки Spring с 2.1.4 до 2.3.2.
Он показывает следующую ошибку:
[proxy:error] [pid xxxx ] (111)Connection refused: AH00957: AJP: attempt to connect to 10.0.75.1:8500 (10.0.75.1) failed
[proxy_ajp:error] [pid xxxx ] [client xxx ] AH00896: failed to make connection to backend: 10.0.75.1, referer: http://myapp.develop/home/
Моя среда разработки настроена следующим образом:
приложение Angular (сервер узла, работающий на 4200)
бэкэнд с пружинной загрузкой (разъем ajp, установленный на tomcat на порт 8500)
фронтальный сервер apache2 (в контейнере докеров), настроенный для перенаправления запросов в оба приложения:
<VirtualHost *:80> ServerName myapp.develop ProxyPass "/home" "http://10.0.75.1:4200/home" ProxyPassReverse "/home" "http://10.0.75.1:4200/home" ProxyPass "/backend" "ajp://10.0.75.1:8500/backend" ProxyPassReverse "/backend" "ajp://10.0.75.1:8500/backend"
и я получаю доступ к своему веб-приложению по доменному имени на моем / etc / hosts: myapp.develop
это моя конфигурация весенней загрузки Tomcat
Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(8500);
connector.setSecure(false);
connector.setAllowTrace(false);
((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);
в app.properties:
tomcat.ajp.port=8500
tomcat.ajp.remoteauthentication=false
tomcat.ajp.enabled=true
и это журналы tomcat:
o.s.b.w.e.t.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 8500 (http)
o.a.c.h.Http11NioProtocol : Initializing ProtocolHandler ["http-nio-8080"]
o.a.c.a.AjpNioProtocol : Initializing ProtocolHandler ["ajp-nio-127.0.0.1-8500"]
o.a.c.c.StandardService : Starting service [Tomcat]
o.a.c.c.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.37]
Сомневаюсь, что это изменение:
- Начиная с версии 8.5.51, адрес прослушивания по умолчанию коннектора AJP был изменен на адрес обратной связи, а не на все адреса.
это то, что вызывает у меня эту проблему, но я не знаю, как ее решить.
Ответы
Я столкнулся с аналогичной проблемой при обновлении версии tomcat. Добавление нижеупомянутых свойств к коннектору ajp помогло в моем случае.
connector.setProperty("address","0.0.0.0");
connector.setProperty("allowedRequestAttributesPattern",".*");
((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
Детальное объяснение:
К вашему сомнению:
Начиная с версии 8.5.51, адрес прослушивания по умолчанию коннектора AJP был изменен на адрес обратной связи, а не на все адреса.
До этого обновления коннектор Tomcat AJP был готов принимать запросы с любого IP-адреса, поэтому явно указывать свойство «адрес» не требовалось. Но после этого обновления поведение по умолчанию таково, что коннектор AJP готов принимать запросы, сделанные только как localhost (loopback). Используйте свойство "адрес", указанное ниже, чтобы расширить диапазон прослушивания не только до адреса обратной связи.
connector.setProperty("address","0.0.0.0"); // OR connector.setProperty("address","::");
Используйте свойство ниже, чтобы включить все типы атрибутов запроса (если у вас нет информации заголовка, в этом случае включите определенные). Запросы с нераспознанными атрибутами запроса будут отклонены с ответом 403:
connector.setProperty("allowedRequestAttributesPattern",".*");
Используйте свойство secretRequired, чтобы определить, требуется ли обмен секретом с HTTP-сервером, чтобы разрешить запросы через ajp. Если да, то установите также свойство «секрет». В противном случае запросы не будут выполнены с ошибкой 403.
((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
Ссылка: Справочник по настройке Apache Tomcat 8
Использование протокола AJP требует дополнительных соображений безопасности, поскольку он позволяет более прямое управление внутренними структурами данных Tomcat, чем соединители HTTP. Особое внимание следует обратить на значения, используемые для атрибутов address , secret , secretRequired и allowedRequestAttributesPattern .
Я никогда не видел, чтобы коннектор настраивался в таком коде, скорее он был объявлен в server.xml
Однако ваш код
Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(8500);
connector.setSecure(false);
connector.setAllowTrace(false);
((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);
а позже вы заявляете, что знаете об этом критическом изменении
Начиная с версии 8.5.51, адрес прослушивания по умолчанию коннектора AJP был изменен на адрес обратной связи, а не на все адреса.
Объединение обоих: вы никогда не устанавливаете адрес прослушивания в своем коде, поэтому вы можете использовать значение по умолчанию. И поскольку вы пытаетесь перенаправить на адрес без обратной связи, у вас не будет возможности связаться с сервером таким образом.
Предложил анонимный редактор этого ответа connector.setAttribute("address", "0.0.0.0");
, но лично я бы предпочел сохранить его в server.xml: коннекторы обычно не настраиваются и не меняются во время выполнения, и когда ваши администраторы редактируют текстовый файл, намного удобнее в повседневной жизни. -дневные операции.