Развертывание Moqui в AWS на экземпляре Elastic Beanstalk Tomcat - PullRequest
0 голосов
/ 16 мая 2019

Фон

Мы работаем с Moqui 2.0 со встроенным сервером Jetty на Elastic Beanstalk с использованием среды Java уже около года.В целях безопасности у нас было приложение, работающее в частной подсети вместе с базой данных Postgres и доступ к нему через VPN.Из-за этого мы никогда не удосужились включить доступ HTTPS.

Теперь мы хотим развернуть Moqui в общедоступной подсети, чтобы к нему можно было обращаться без VPN, и, следовательно, нам нужен доступ HTTPS.

Sidenote: Имейте в виду, я уже прочитал варианты развертывания здесь !.

HTTPS в автономном Moqui

Мой первый вопрос: можете ли вы запустить Moqui через HTTPS?использовать только встроенный сервер?Я посмотрел на класс MoquiStart, и main, кажется, поддерживает только инициализацию HTTP на порту 8080 по умолчанию.Есть закомментированный целый раздел, который также содержит код для инициализации HTTPS и HTTP / 2 с комментарием:

// Possible code to handle HTTPS, HTTP/2 (h2, h2c):

Итак, я предполагаю, что HTTPS не поддерживается Moqui как отдельное приложение?

Moqui на сервере веб-приложений

Принимая во внимание вышеизложенное предположение, что Moqui не настраивает Jetty для обслуживания HTTPS-запросов, запуск Moqui в общедоступной подсети с использованием среды Java, как это было до сих пор, очевидно, становится неприемлемым,Что оставляет нас с двумя вариантами.Контейнеризация, такая как Docker (что выходит за рамки моих навыков) или работа на сервере приложений, таком как Tomcat (который также выходит за рамки моих навыков, но я могу, по крайней мере, концептуально обернуть голову).Что привело меня к этому потоку StackOverflow по проблеме !.

Я не знаком с архитектурой J2EE, но я предполагаю, что после запуска в Tomcat Catalina обходит инициализацию порта Jetty в MoquiStart как-то ?[Был бы признателен за краткое объяснение моего собственного понимания]

Несмотря на это, вышеупомянутая ветка подтвердила, что я был на правильном пути для решения HTTPS.

Проблема

ПроблемаМоки не работаетЯ знаю, что Tomcat работает нормально, потому что когда я создаю среду, я использую Образец Приложения и могу получить доступ к этому через HTTP.Как только я разверну файл ROOT.war (который я нахожу в ../apache-tomcat-8.5.6/webapps), я не смогу получить доступ к Moqui через HTTP или HTTPS.(Моя группа безопасности полностью открыта). Он пытается подключиться и, в конце концов, отключается.

Я проверил журналы EB, и вероятный виновник зарегистрирован в файле catalina.YYYY-MM-DD.log.

14-May-2019 21:21:07.101 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/var/lib/tomcat8/webapps/ROOT]
14-May-2019 21:21:23.946 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
14-May-2019 21:21:23.956 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
14-May-2019 21:21:23.965 WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [AsyncAppender-AsyncLog] but has failed to stop it. This is very likely to create a memory leak.

Трассировка стека выглядит следующим образом:

sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403)
org.apache.logging.log4j.core.appender.AsyncAppender$AsyncThread.run(AsyncAppender.java:282)

Непосредственные нисходящие ошибки:

14-May-2019 21:21:23.989 SEVERE [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [com.hazelcast.internal.util.ThreadLocalRandom$1] (value [com.hazelcast.internal.util.ThreadLocalRandom$1@4379b697]) and a value of type [com.hazelcast.internal.util.ThreadLocalRandom] (value [com.hazelcast.internal.util.ThreadLocalRandom@37d77b2b]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
14-May-2019 21:21:24.006 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/var/lib/tomcat8/webapps/ROOT] has finished in [16,904] ms

Соответствующие части MoquiActualConf:

   ...
    <default-property name="webapp_http_host" value="[OUR_IP_HERE]"/>
    <default-property name="webapp_http_port" value="80"/>
    <default-property name="webapp_https_port" value="443"/>
    <default-property name="webapp_https_enabled" value="true"/>
    <default-property name="entity_ds_db_conf" value="h2"/>
    <default-property name="entity_ds_host" value="localhost"/>
    <default-property name="entity_ds_port" value=""/>
    <default-property name="entity_ds_database" value="moqui"/>
    <default-property name="entity_ds_url" value="jdbc:h2:${moqui_runtime}/db/h2/${entity_ds_database};lock_timeout=30000"/>
    <default-property name="entity_ds_schema" value=""/>
    <default-property name="entity_ds_user" value="sa"/>
    <default-property name="entity_ds_password" value="sa"/>
    ...
        <webapp name="webroot" http-port="80" http-host="[OUR_IP_HERE]" https-port="443" https-host="[OUR_IP_HERE]" https-enabled="true" require-session-token="true" websocket-timeout="600000">
            <root-screen host=".*" location="component://webroot/screen/webroot.xml"/>
            <error-screen error="unauthorized" screen-path="error/Unauthorized"/>
            <error-screen error="forbidden" screen-path="error/Forbidden"/>
            <error-screen error="not-found" screen-path="error/NotFound"/>
            <error-screen error="too-many" screen-path="error/TooMany"/>
            <error-screen error="internal-error" screen-path="error/InternalError"/>
            <listener class="org.moqui.impl.webapp.MoquiSessionListener"/>
            <servlet name="MoquiServlet" class="org.moqui.impl.webapp.MoquiServlet" load-on-startup="1">
                <url-pattern><![CDATA[/*]]></url-pattern>
            </servlet>
            <servlet name="MoquiFopServlet" class="org.moqui.impl.webapp.MoquiFopServlet" load-on-startup="1">
                <url-pattern><![CDATA[/fop/*]]></url-pattern>
            </servlet>
            <session-config timeout="60"/>
            <endpoint path="/notws" class="org.moqui.impl.webapp.NotificationEndpoint" timeout="3600000" enabled="true"/>
    ...

Я уже три дня копаюсь в кишках Tomcat экземпляра EC2 и ничего не придумаю, поэтому буду очень признателен за некоторую помощь.

PS: По какой-то причине, по какой-то причине, MoquiActualConfбудучи переопределенным MoquiProductionConf, а не MoquiTestConf, как указано в Procfile.

web: java -Xmx1024M -cp . MoquiStart port=8080 conf=conf/MoquiTestConf.xml

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

Ответы [ 2 ]

1 голос
/ 15 июля 2019

Мне удается сделать экземпляр Moqui в AWS EB доступным через HTTPS, настроив балансировщик нагрузки ec2.Чтобы указать на очевидное, пристань Moqui прослушивает порт 5000, ec2 Nginx прослушивает порт 80 (и направляет его на порт 5000), балансировщик нагрузки ec2 прослушивает порты 80 и 443 (и направляет его на порт 80 ecgin Nginx 80).Если вы не хотите использовать балансировщик нагрузки, вы можете настроить ec2 Nginx для прослушивания HTTPS и переслать его на порт Jetty 5000 Moqui, как это делает Nginx HTTP.Наименее предпочтительный способ - передача параметров некоторых https пристаней через переменные окружения, в MoquiStart могут потребоваться небольшие изменения.Это было много лет назад, и я не помню деталей, но Jetty была в состоянии обслуживать HTTPS таким образом.

0 голосов
/ 16 мая 2019

Атрибуты http * в элементе webapp предназначены для настройки записи URL, а не для настройки веб-сервера, внешнего по отношению к Moqui. Moqui работает внутри контейнера сервлетов Java, такого как Tomcat или Jetty, даже при использовании встроенного подхода Jetty, а конфигурация контейнера сервлетов - это то, где настраиваются интерфейсы HTTP.

Как правило, лучший подход для завершения HTTPS - использовать обратный прокси на основе httpd или nginx. Даже образы ElasticBeanstalk делают это по умолчанию (с httpd), и если вы настраиваете свой сертификат HTTPS через AWS EB, это обрабатывает httpd. Тот же подход используется с nginx-proxy в примерах Docker Compose.

...