spring-boot с Apache и AJP

Есть много документов, объясняющих, что вы должны использовать различные другие вещи (включая простое проксирование), но AJP является гибким и быстрым, и это действительно помогает мне интегрировать наш SAML2 SSO без каких-либо веб-приложений, которые должны беспокоиться об этом.

Сейчас я пытаюсь заставить приложение с весенней загрузкой работать так же, и это действительно ужасное время. Основным симптомом является «Bad Gateway» с такими сообщениями об ошибках, как:

[ошибка] ajp_get_reply::jk_ajp_common.c (2126): (boot_worker_1) Tomcat не работает или отказывается от соединения. Ответ клиенту не отправлен (пока)

[info] ajp_service::jk_ajp_common.c (2623): (boot_worker_1) отправка запроса на tomcat не удалась (исправимая) из-за ошибки протокола (попытка = 1)

[ошибка] ajp_connection_tcp_get_message::jk_ajp_common.c (1289): неправильный формат сообщения 0x4854 от 127.0.0.1:8092

Последнее казалось подсказкой, но я не смог ее найти.

Руководство по весенней загрузке, похоже, предполагает, что если у вас есть только одно соединение, вы можете настроить его в application.properties - это то, что я хотел бы сделать в идеале, но я не смог найти никаких примеров этого. Однако с точки зрения распространения это кажется идеальным — опубликовать банку, предоставить пользователю документированный файл свойств.

Поскольку это не сработало, я попытался сделать это программно следующим образом:

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    Connector ajpConnector = new Connector();
    ajpConnector.setProtocol("AJP/1.3");
    ajpConnector.setPort(8092);
    ajpConnector.setSecure(false);
    ajpConnector.setAllowTrace(false);
    ajpConnector.setScheme("http");
    tomcat.addAdditionalTomcatConnectors(ajpConnector);
    return tomcat;
}

(Я действительно не хотел бы настраивать SSL для соединения с локальным хостом, потому что это только усложняет ситуацию, и как только вы проводите время в незащищенных мирах zookeeper, kafka и т. ESB - это RFC1918 и в любом случае защищен брандмауэром).

Мои вопросы:

1) Реально ли это все сделать с файлом свойств и как?

2) С приведенной выше жестко закодированной конфигурацией я могу подключиться по телнету к порту 8092 и отправить запросы GET... Я не уверен, почему я могу это сделать, потому что эти GET являются http, и я настроил протокол на AJP/1.3, поэтому Я НЕ ДУМАЮ, что это должно сработать. Но в этом ли проблема Apache? Я не могу найти объяснения «неправильному формату сообщения 0x4854» или ошибке «-11».

--Крис


person wz2b    schedule 05.04.2015    source источник


Ответы (1)


у меня была такая же проблема, и я решил ее, добавив реализацию соединителя.

Например :

Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");

список доступных реализаций: https://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html#Common_Attributes (протокол)

или просто укажите протокол (AJP вместо HTTP):

Connector ajpConnector = new Connector("AJP/1.3");

Полный пример динамического чтения значений из файла свойств см. на странице https://blog.swdev.ed.ac.uk/2015/06/24/adding-embedded-tomcat-ajp-support-to-a.-spring-boot-application/

person Y.M.    schedule 04.05.2015
comment
appsdev.is.ed.ac.uk/blog/?p= 525 есть пример, основанный на свойствах. - person pdorgambide; 17.12.2016