Apache не может подключиться к новому Tomcat 9 ajp

Aug 20 2020

Мой 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 был изменен на адрес обратной связи, а не на все адреса.

это то, что вызывает у меня эту проблему, но я не знаю, как ее решить.

Ответы

5 Prerna Sep 17 2020 at 04:37

Я столкнулся с аналогичной проблемой при обновлении версии 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 .

2 OlafKock Aug 20 2020 at 21:58

Я никогда не видел, чтобы коннектор настраивался в таком коде, скорее он был объявлен в 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: коннекторы обычно не настраиваются и не меняются во время выполнения, и когда ваши администраторы редактируют текстовый файл, намного удобнее в повседневной жизни. -дневные операции.