Фон
Мы работаем с 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
Я не думаю, что это является причиной проблемы, но вызовет проблемы в дальнейшем при указании на производственную базу данных и т. д.