Wildfly — различия между версиями
(→Журналирование) |
(→Установка лимитов потребляемой памяти) |
||
(не показано 7 промежуточных версий 2 участников) | |||
Строка 76: | Строка 76: | ||
Примеры инструкций: | Примеры инструкций: | ||
* https://docs.microsoft.com/ru-ru/java/azure/java-sdk-add-certificate-ca-store?view=azure-java-stable | * https://docs.microsoft.com/ru-ru/java/azure/java-sdk-add-certificate-ca-store?view=azure-java-stable | ||
+ | * https://www.ibm.com/docs/en/cognos-tm1/10.2.2?topic=ictocyoiatwas-add-certificates-jre-keystore | ||
+ | * https://connect2id.com/blog/importing-ca-root-cert-into-jvm-trust-store | ||
* https://www.ibm.com/support/knowledgecenter/en/SSFUEU_6.2.1/com.ibm.swg.ba.cognos.administrators_guide.6.2.1.doc/t_shi_import_the_root_certificate_for_java.html | * https://www.ibm.com/support/knowledgecenter/en/SSFUEU_6.2.1/com.ibm.swg.ba.cognos.administrators_guide.6.2.1.doc/t_shi_import_the_root_certificate_for_java.html | ||
+ | |||
Как минимум в CN сертификата должен быть адрес, по которому происходит обращение к серверу (DNS или IP). Если этого будет недостаточно, тогда добавить в SAN сертификата. | Как минимум в CN сертификата должен быть адрес, по которому происходит обращение к серверу (DNS или IP). Если этого будет недостаточно, тогда добавить в SAN сертификата. | ||
Строка 90: | Строка 93: | ||
-deststoretype JKS</syntaxhighlight> при импорте указываем <password>, при экспорте указываем пароль к контейнеру. | -deststoretype JKS</syntaxhighlight> при импорте указываем <password>, при экспорте указываем пароль к контейнеру. | ||
# Скопировать <container-name>.jks например в /opt/wildfly/standalone/configuration/ (для Linux), либо в C:\wildfly\standalone\configuration\ (для Windows). | # Скопировать <container-name>.jks например в /opt/wildfly/standalone/configuration/ (для Linux), либо в C:\wildfly\standalone\configuration\ (для Windows). | ||
− | # Имя файла-контейнера (относительный путь от директории <code>configuration</code>) и пароли указать в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows), в объекте keystore (если АЛИАС не был задан, по умолчанию устанавливается значение "1"):<syntaxhighlight lang="xml"> | + | # Имя файла-контейнера (относительный путь от директории <code>configuration</code>) и пароли указать в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows), для WildFly 25 и выше, :<syntaxhighlight lang="xml"> |
+ | <tls> | ||
+ | <key-stores> | ||
+ | <key-store name="applicationKS"> | ||
+ | <credential-reference clear-text="ПАРОЛЬ К КОНТЕЙНЕРУ"/> | ||
+ | <implementation type="JKS"/> | ||
+ | <file path="ИМЯ ФАЙЛА-КОНТЕЙНЕРА.jks" relative-to="jboss.server.config.dir"/> | ||
+ | </key-store> | ||
+ | </key-stores> | ||
+ | <key-managers> | ||
+ | <key-manager name="applicationKM" key-store="applicationKS" generate-self-signed-certificate-host="localhost"> | ||
+ | <credential-reference clear-text="ПАРОЛЬ К ПРИВАТНОМУ КЛЮЧУ"/> | ||
+ | </key-manager> | ||
+ | </key-managers> | ||
+ | <server-ssl-contexts> | ||
+ | <server-ssl-context name="applicationSSC" key-manager="applicationKM"/> | ||
+ | </server-ssl-contexts> | ||
+ | </tls> | ||
+ | </syntaxhighlight>До версии 25, в объекте keystore (если АЛИАС не был задан, по умолчанию устанавливается значение "1"):<syntaxhighlight lang="xml"> | ||
<security-realm name="ApplicationRealm"> | <security-realm name="ApplicationRealm"> | ||
<server-identities> | <server-identities> | ||
Строка 149: | Строка 170: | ||
https://www.openssl.org/docs/manmaster/man1/ciphers.html | https://www.openssl.org/docs/manmaster/man1/ciphers.html | ||
− | ===Включение | + | ===Включение дополнительных заголовков=== |
− | Для включения | + | Для включения дополнительных HTTP заголовков необходимо в файл |
− | * в раздел ''<nowiki><subsystem xmlns="urn:jboss:domain:undertow:X.X"> | + | * Linux: |
− | + | *: /opt/wildfly/standalone/configuration/standalone.xml | |
− | + | * Windows: | |
− | </ | + | *: C:\wildfly\standalone\configuration\standalone.xml |
+ | # добавить фильтры в раздел ''<nowiki><subsystem xmlns="urn:jboss:domain:undertow:X.X"></nowiki>'' добавив блок (при его отсутствии) <code><filters></filters></code> следующего содержания:<syntaxhighlight lang="xml"> | ||
+ | <filters> | ||
+ | <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/> | ||
+ | <response-header name="x-frame-options" header-name="X-Frame-Options" header-value="DENY"/> | ||
+ | <response-header name="x-content-type-options" header-name="X-Content-Type-Options" header-value="nosniff"/> | ||
+ | <response-header name="Content-Security-Policy" header-name="Content-Security-Policy" header-value="default-src 'self'"/> | ||
+ | </filters></syntaxhighlight> | ||
+ | # добавить ссылки на эти фильтры в раздел ''<nowiki><subsystem xmlns="urn:jboss:domain:undertow:X.X"> в <server name="default-server"> в <host name="default-host" alias="localhost"></nowiki>'' включив следующие строки:<syntaxhighlight lang="xml"> | ||
+ | <filter-ref name="transport-security"/> | ||
+ | <filter-ref name="x-frame-options"/> | ||
+ | <filter-ref name="x-content-type-options"/> | ||
+ | <filter-ref name="Content-Security-Policy"/> | ||
+ | </syntaxhighlight> | ||
Пример: | Пример: | ||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
− | <subsystem xmlns="urn:jboss:domain:undertow: | + | <subsystem xmlns="urn:jboss:domain:undertow:11.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other"> |
<buffer-cache name="default"/> | <buffer-cache name="default"/> | ||
<server name="default-server"> | <server name="default-server"> | ||
Строка 164: | Строка 198: | ||
<host name="default-host" alias="localhost"> | <host name="default-host" alias="localhost"> | ||
<http-invoker security-realm="ApplicationRealm"/> | <http-invoker security-realm="ApplicationRealm"/> | ||
− | <filter-ref name="transport-security"/> | + | <filter-ref name="transport-security"/> |
+ | <filter-ref name="x-frame-options"/> | ||
+ | <filter-ref name="x-content-type-options"/> | ||
+ | <filter-ref name="Content-Security-Policy"/> | ||
</host> | </host> | ||
</server> | </server> | ||
Строка 173: | Строка 210: | ||
<filters> | <filters> | ||
<response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/> | <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/> | ||
+ | <response-header name="x-frame-options" header-name="X-Frame-Options" header-value="DENY"/> | ||
+ | <response-header name="x-content-type-options" header-name="X-Content-Type-Options" header-value="nosniff"/> | ||
+ | <response-header name="Content-Security-Policy" header-name="Content-Security-Policy" header-value="default-src 'self'"/> | ||
</filters> | </filters> | ||
</subsystem></syntaxhighlight> | </subsystem></syntaxhighlight> | ||
Строка 220: | Строка 260: | ||
== Валидация подключения == | == Валидация подключения == | ||
=== PostgreSQL === | === PostgreSQL === | ||
− | < | + | <syntaxhighlight lang="xml"> |
<validation> | <validation> | ||
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker> | <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker> | ||
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter> | <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter> | ||
</validation> | </validation> | ||
− | </ | + | </syntaxhighlight> |
=== Oracle === | === Oracle === | ||
− | < | + | <syntaxhighlight lang="xml"> |
<validation> | <validation> | ||
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> | <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> | ||
Строка 234: | Строка 274: | ||
<background-validation-millis>10000</background-validation-millis> | <background-validation-millis>10000</background-validation-millis> | ||
</validation> | </validation> | ||
− | </ | + | </syntaxhighlight> |
=== MS SQL === | === MS SQL === | ||
− | < | + | <syntaxhighlight lang="xml"> |
<validation> | <validation> | ||
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker> | <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker> | ||
</validation> | </validation> | ||
− | </ | + | </syntaxhighlight> |
+ | |||
+ | == Установка лимитов потребляемой памяти == | ||
+ | |||
+ | Лимиты доступа к памяти необходимо выбирать исходя из нагрузки и ресурсов сервера. | ||
+ | |||
+ | Пример: | ||
+ | |||
+ | <syntaxhighlight lang="shell"> | ||
+ | JAVA_OPTS=-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | = Контроль = | ||
+ | |||
+ | == Потребление ресурсов == | ||
+ | |||
+ | <syntaxhighlight lang="shell"> | ||
+ | /opt/jboss/wildfly/bin/jboss-cli.sh --connect | ||
+ | /core-service=platform-mbean/type=memory:read-resource(recursive=true,proxies=true,include-runtime=true,include-defaults=true) | ||
+ | </syntaxhighlight> | ||
+ | Вывод: | ||
+ | <syntaxhighlight lang="json"> | ||
+ | { | ||
+ | "outcome" => "success", | ||
+ | "result" => { | ||
+ | "heap-memory-usage" => { | ||
+ | "init" => 641728512L, | ||
+ | "used" => 1746929168L, | ||
+ | "committed" => 4097835008L, | ||
+ | "max" => 10257170432L | ||
+ | }, | ||
+ | "non-heap-memory-usage" => { | ||
+ | "init" => 7667712L, | ||
+ | "used" => 331419120L, | ||
+ | "committed" => 357740544L, | ||
+ | "max" => -1L | ||
+ | }, | ||
+ | "object-name" => "java.lang:type=Memory", | ||
+ | "object-pending-finalization-count" => 0, | ||
+ | "verbose" => false | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Вывод параметров конфигурации в журнал при старте == | ||
+ | |||
+ | <syntaxhighlight lang="shell"> | ||
+ | JAVA_OPTS=-XshowSettings:all | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Журналирование == | ||
+ | |||
+ | === Доступ к данным журнала === | ||
− | |||
− | |||
Журнал работы сервера PayControl записываются общий лог функционирования Wildfly. | Журнал работы сервера PayControl записываются общий лог функционирования Wildfly. | ||
Строка 253: | Строка 343: | ||
Для просмотра журнала за другие дни, нужно добавить к имени файла требуемую дату в формате server.log.YYYY-MM-DD | Для просмотра журнала за другие дни, нужно добавить к имени файла требуемую дату в формате server.log.YYYY-MM-DD | ||
− | ==Включение журналирования SOAP-вызовов== | + | === Включение журналирования SOAP-вызовов === |
+ | |||
Для включения расширенного логирования необходимо: | Для включения расширенного логирования необходимо: | ||
# Остановить службу wildfly. | # Остановить службу wildfly. | ||
Строка 267: | Строка 358: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
# Запустить службу wildfly. | # Запустить службу wildfly. | ||
− | ==Направление логов Wildfly в Kafka== | + | |
+ | === Направление логов Wildfly в Kafka === | ||
+ | |||
Исходник https://developer.jboss.org/docs/DOC-56423. Основное отличие - добавление <code><module name="com.fasterxml.jackson.core.jackson-databind"/></code> в зависимости модуля ''org.apache.kafka.clients''. | Исходник https://developer.jboss.org/docs/DOC-56423. Основное отличие - добавление <code><module name="com.fasterxml.jackson.core.jackson-databind"/></code> в зависимости модуля ''org.apache.kafka.clients''. | ||
− | ===Модули=== | + | |
+ | ==== Модули ==== | ||
+ | |||
Файлы модулей можно загрузить с https://mvnrepository.com/ | Файлы модулей можно загрузить с https://mvnrepository.com/ | ||
− | ====org.apache.kafka.clients==== | + | |
+ | ===== org.apache.kafka.clients ===== | ||
+ | |||
Создать файл <code>/opt/wildfly/modules/system/layers/base/org/apache/kafka/clients/main/module.xml</code> с содержанием | Создать файл <code>/opt/wildfly/modules/system/layers/base/org/apache/kafka/clients/main/module.xml</code> с содержанием | ||
− | < | + | <syntaxhighlight lang="xml"> |
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
<module name="org.apache.kafka.clients" xmlns="urn:jboss:module:1.8"> | <module name="org.apache.kafka.clients" xmlns="urn:jboss:module:1.8"> | ||
Строка 287: | Строка 384: | ||
</dependencies> | </dependencies> | ||
</module> | </module> | ||
− | </ | + | </syntaxhighlight> |
и добавить в директорию указанные в блоке <code>resources</code> файлы. | и добавить в директорию указанные в блоке <code>resources</code> файлы. | ||
− | ====org.apache.kafka.log4jappender==== | + | |
+ | ===== org.apache.kafka.log4jappender ===== | ||
+ | |||
Создать файл <code>/opt/wildfly/modules/system/layers/base/org/apache/kafka/log4jappender/main/module.xml</code> с содержанием | Создать файл <code>/opt/wildfly/modules/system/layers/base/org/apache/kafka/log4jappender/main/module.xml</code> с содержанием | ||
− | < | + | <syntaxhighlight lang="xml"> |
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
<module name="org.apache.kafka.log4jappender" xmlns="urn:jboss:module:1.8"> | <module name="org.apache.kafka.log4jappender" xmlns="urn:jboss:module:1.8"> | ||
Строка 304: | Строка 403: | ||
</dependencies> | </dependencies> | ||
</module> | </module> | ||
− | </ | + | </syntaxhighlight> |
и добавить в директорию указанные в блоке <code>resources</code> файлы. | и добавить в директорию указанные в блоке <code>resources</code> файлы. | ||
− | ====org.apache.log4j==== | + | |
+ | ===== org.apache.log4j ===== | ||
+ | |||
Добавить модуль log4jappender в качестве зависимости в существующий org.apache.log4j модуль: | Добавить модуль log4jappender в качестве зависимости в существующий org.apache.log4j модуль: | ||
− | < | + | <syntaxhighlight lang="xml"> |
<module name="org.apache.log4j" xmlns="urn:jboss:module:1.6"> | <module name="org.apache.log4j" xmlns="urn:jboss:module:1.6"> | ||
Строка 322: | Строка 423: | ||
</module> | </module> | ||
− | </ | + | </syntaxhighlight> |
− | ====org.jboss.as.standalone==== | + | |
+ | ===== org.jboss.as.standalone ===== | ||
+ | |||
Указать в имеющемся модуле org.jboss.as.standalone в качестве зависимости модуль org.apache.kafka.clients. | Указать в имеющемся модуле org.jboss.as.standalone в качестве зависимости модуль org.apache.kafka.clients. | ||
− | < | + | <syntaxhighlight lang="xml"> |
<module name="org.jboss.as.standalone" xmlns="urn:jboss:module:1.6"> | <module name="org.jboss.as.standalone" xmlns="urn:jboss:module:1.6"> | ||
Строка 339: | Строка 442: | ||
</module> | </module> | ||
− | </ | + | </syntaxhighlight> |
− | ===Хэндлеры=== | + | |
+ | ==== Хэндлеры ==== | ||
+ | |||
Необходимо добавить перечисленные ниже хэндлеры в файл standalone.xml в блок <code><subsystem xmlns="urn:jboss:domain:logging:8.0"></code> | Необходимо добавить перечисленные ниже хэндлеры в файл standalone.xml в блок <code><subsystem xmlns="urn:jboss:domain:logging:8.0"></code> | ||
− | ====kafka==== | + | |
− | < | + | ===== kafka ===== |
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
<custom-handler name="kafka" class="org.apache.kafka.log4jappender.KafkaLog4jAppender" module="org.apache.log4j"> | <custom-handler name="kafka" class="org.apache.kafka.log4jappender.KafkaLog4jAppender" module="org.apache.log4j"> | ||
<level name="INFO"/> | <level name="INFO"/> | ||
Строка 354: | Строка 461: | ||
</properties> | </properties> | ||
</custom-handler> | </custom-handler> | ||
− | </ | + | </syntaxhighlight> |
− | ====async-kafka-wrapper==== | + | |
− | < | + | ===== async-kafka-wrapper ===== |
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
<async-handler name="async-kafka-wrapper"> | <async-handler name="async-kafka-wrapper"> | ||
<level name="ALL"/> | <level name="ALL"/> | ||
Строка 365: | Строка 474: | ||
</subhandlers> | </subhandlers> | ||
</async-handler> | </async-handler> | ||
− | </ | + | </syntaxhighlight> |
− | ====Включение хэндлера==== | + | |
+ | ===== Включение хэндлера ===== | ||
+ | |||
В блок <code><handlers></code> добавить <code><handler name="async-kafka-wrapper"/></code> | В блок <code><handlers></code> добавить <code><handler name="async-kafka-wrapper"/></code> | ||
− | =Проблемы и способы их устранения= | + | = Проблемы и способы их устранения = |
− | ==Очень медленный старт через standalone.sh (каждый этап скрипта запуска - с большими задержками). Система отправляет сигнал на остановку сервиса== | + | |
+ | == Очень медленный старт через standalone.sh (каждый этап скрипта запуска - с большими задержками). Система отправляет сигнал на остановку сервиса == | ||
+ | |||
Вероятная проблема - неверные настройки DNS сервера.<br> | Вероятная проблема - неверные настройки DNS сервера.<br> | ||
'''Решение''':Необходимо скорректировать настройки DNS.<br> | '''Решение''':Необходимо скорректировать настройки DNS.<br> | ||
Строка 379: | Строка 492: | ||
''Проблема проявилась на тестовом Windows-сервере'' [[Участник:A.bursakov|A.bursakov]] ([[Обсуждение участника:A.bursakov|обсуждение]]) 19:56, 1 августа 2018 (MSK) | ''Проблема проявилась на тестовом Windows-сервере'' [[Участник:A.bursakov|A.bursakov]] ([[Обсуждение участника:A.bursakov|обсуждение]]) 19:56, 1 августа 2018 (MSK) | ||
− | ==Частое появление WARNING в логе== | + | == Частое появление WARNING в логе == |
+ | |||
Предупреждения в логе вида: | Предупреждения в логе вида: | ||
<pre> | <pre> | ||
Строка 416: | Строка 530: | ||
... | ... | ||
</properties> | </properties> | ||
+ | |||
+ | == Wildfly не стартует как служба и нет логов == | ||
+ | Возможные проблемы: | ||
+ | * Некорректные права на директории/файлы в /opt/wildfly.<syntaxhighlight lang="shell">chown -RHv wildfly:wildfly /opt/wildfly</syntaxhighlight> | ||
+ | * Проблемы с определением необходимой Java. Для восстановления необходимо выполнить <syntaxhighlight lang="shell">sudo update-alternatives --config java</syntaxhighlight> | ||
[[Категория:Серверная часть]] | [[Категория:Серверная часть]] | ||
[[Категория:Возможные проблемы]] | [[Категория:Возможные проблемы]] | ||
[[Категория:Отладка]] | [[Категория:Отладка]] |
Текущая версия на 20:18, 10 мая 2023
Содержание
- 1 Настройка
- 2 Контроль
- 3 Проблемы и способы их устранения
- 3.1 Очень медленный старт через standalone.sh (каждый этап скрипта запуска - с большими задержками). Система отправляет сигнал на остановку сервиса
- 3.2 Не происходит «биндинг» IP-адреса адаптера
- 3.3 Частое появление WARNING в логе
- 3.4 INFO: Disabling contextual LOB creation as createClob() method threw error
- 3.5 Wildfly не стартует как служба и нет логов
Настройка
Из командной строки
Подключение к консоли:
sudo /opt/wildfly/bin/jboss-cli.sh --connect
Выполнение команд в неинтерактивном режиме:
sudo /opt/wildfly/bin/jboss-cli.sh --connect --commands=ls\ deployment
Настройка PayControl
Удаление настроек по умолчанию:
data-source remove --name=ExampleDS
/subsystem=ee/service=default-bindings:remove()
reload
/subsystem=datasources/jdbc-driver=h2:remove
/subsystem=undertow/server=default-server/host=default-host/location=\/:remove()
/subsystem=undertow/configuration=handler:remove()
Добавление драйвера (postgresql) и источников данных:
module add --name=org.postgresql --resources=/opt/paycontrol/postgresql-42.2.5.jar --dependencies=javax.api,javax.transaction.api,javax.servlet.api
/subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgresql",driver-class-name=org.postgresql.Driver)
data-source add --jndi-name=java:jboss/datasources/PayControlDS --name=PayControlDS --connection-url=jdbc:postgresql://localhost:5432/pcs --driver-name=postgres --user-name=pcuser --password=XXXXXXXX
data-source add --jndi-name=java:jboss/datasources/PayControlISDS --name=PayControlISDS --connection-url=jdbc:postgresql://localhost:5432/pcis --driver-name=postgres --user-name=pcuser --password=XXXXXXXX
Установка wsdl-host
/subsystem=webservices:write-attribute\(name=wsdl-host,value=docker.loc\)
Добавление источников данных (разные СУБД)
Datasource | Connection URL |
---|---|
IBM DB2 | jdbc:db2://SERVER_NAME:PORT/DATABASE_NAME |
MariaDB | jdbc:mariadb://SERVER_NAME:PORT/DATABASE_NAME |
Microsoft SQL Server | jdbc:sqlserver://SERVER_NAME:PORT;DatabaseName=DATABASE_NAME |
MySQL | jdbc:mysql://SERVER_NAME:PORT/DATABASE_NAME |
Oracle | jdbc:oracle:thin:@SERVER_NAME:PORT:ORACLE_SID |
PostgreSQL | jdbc:postgresql://SERVER_NAME:PORT/DATABASE_NAME |
Sybase | jdbc:sybase:Tds:SERVER_NAME:PORT/DATABASE_NAME |
Удаление настроек по умолчанию
При конфигурировании Wildfly можно (при переводе системы в промышленную эксплуатацию - рекомендуется) удалить пример источника данных и страницу-приветствие. Для этого в файле standalone.xml необходимо убрать (либо закомментировать) следующие объекты:
<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
<connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
<driver>h2</driver>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</datasource>
<driver name="h2" module="com.h2database.h2">
<xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
</driver>
<default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/ExampleDS" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>
<location name="/" handler="welcome-content"/>
<handlers>
<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
</handlers>
Добавление сертификатов корпоративных УЦ
java keytool – с его помощью установить корневой сертификат в keystore. Если есть промежуточные, то их тоже.
java keystore password по умолчанию – “changeit”.
Примеры инструкций:
- https://docs.microsoft.com/ru-ru/java/azure/java-sdk-add-certificate-ca-store?view=azure-java-stable
- https://www.ibm.com/docs/en/cognos-tm1/10.2.2?topic=ictocyoiatwas-add-certificates-jre-keystore
- https://connect2id.com/blog/importing-ca-root-cert-into-jvm-trust-store
- https://www.ibm.com/support/knowledgecenter/en/SSFUEU_6.2.1/com.ibm.swg.ba.cognos.administrators_guide.6.2.1.doc/t_shi_import_the_root_certificate_for_java.html
Как минимум в CN сертификата должен быть адрес, по которому происходит обращение к серверу (DNS или IP). Если этого будет недостаточно, тогда добавить в SAN сертификата.
Включение и конфигурирование HTTPS
Добавление сертификата
Для добавления/обновления сертификата необходимо выполнить следующие действия:
- Составить цепочку сертификатов.
Из файлов сертификатов в формате PEM (Base64) составить цепочку путём соединения в новом файле с расширением crt, например fullchain.crt. Для этого в новый файл с помощью текстового редактора нужно добавить сертификат корневого УЦ, промежуточных, и собственно сертификат сервера. - Создать контейнер формата pkcs12:при экспорте следует задать пароль <password> для приватного ключа.
openssl pkcs12 -export -in fullchain.crt -inkey private_key.key -out keycontainer.p12
- Создать JKS-контейнер из PKCS12:при импорте указываем <password>, при экспорте указываем пароль к контейнеру.
keytool -importkeystore -srckeystore keycontainer.p12 \ -srcstoretype PKCS12 \ -destkeystore <container-name>.jks \ -deststoretype JKS
- Скопировать <container-name>.jks например в /opt/wildfly/standalone/configuration/ (для Linux), либо в C:\wildfly\standalone\configuration\ (для Windows).
- Имя файла-контейнера (относительный путь от директории
configuration
) и пароли указать в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows), для WildFly 25 и выше, :До версии 25, в объекте keystore (если АЛИАС не был задан, по умолчанию устанавливается значение "1"):<tls> <key-stores> <key-store name="applicationKS"> <credential-reference clear-text="ПАРОЛЬ К КОНТЕЙНЕРУ"/> <implementation type="JKS"/> <file path="ИМЯ ФАЙЛА-КОНТЕЙНЕРА.jks" relative-to="jboss.server.config.dir"/> </key-store> </key-stores> <key-managers> <key-manager name="applicationKM" key-store="applicationKS" generate-self-signed-certificate-host="localhost"> <credential-reference clear-text="ПАРОЛЬ К ПРИВАТНОМУ КЛЮЧУ"/> </key-manager> </key-managers> <server-ssl-contexts> <server-ssl-context name="applicationSSC" key-manager="applicationKM"/> </server-ssl-contexts> </tls>
<security-realm name="ApplicationRealm"> <server-identities> <ssl> <keystore path="ИМЯ ФАЙЛА-КОНТЕЙНЕРА.jks" relative-to="jboss.server.config.dir" keystore-password="ПАРОЛЬ К КОНТЕЙНЕРУ" alias="АЛИАС" key-password="ПАРОЛЬ К ПРИВАТНОМУ КЛЮЧУ" generate-self-signed-certificate-host="localhost"/> </ssl> </server-identities>
- Перезапустить сервис WildFly.
- Проверить подключение:Verify Result должен быть 0.
openssl s_client -connect <server-name>:8443
Отключение HTTP порта (8080)
Предупреждение! Приведённый ниже порядок действий применим для приложений, не публикующих WSDL-схему. Для приложений с WSDL потребуется дополнительная донастройка. |
Для того, чтобы на сервере PCIS External отключить доступ к REST-интерфейсу по порту 8080 необходимо в файле /opt/wildfly/standalone/configuration/standalone.xml (для Linux), либо в C:\wildfly\standalone\configuration\standalone.xml (для Windows) (перед этим лучше сделать его резервную копию) в блоке <server name="default-server">
удалить строку
<http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
В блоке <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
удалить строку:
<socket-binding name="http" port="${jboss.http.port:8080}"/>
Изменить параметр <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/>
следующим образом (изменить значение connector-ref
с default
на https
):
<http-connector name="http-remoting-connector" connector-ref="https" security-realm="ApplicationRealm"/>
Переключение публикации схемы на HTTPS
Для того, чтобы, располагающаяся в WSDL, ссылка на схему была также корректна, необходимо в <subsystem xmlns="urn:jboss:domain:webservices:2.0">
добавить (заменив значения wsdl-host и, при необходимости, wsdl-port и wsdl-secure-port на необходимые) следующее:
<wsdl-host>yoursite.com</wsdl-host>
<wsdl-port>8080</wsdl-port>
<wsdl-secure-port>8443</wsdl-secure-port>
<wsdl-uri-scheme>https</wsdl-uri-scheme>
Пример результата:
<subsystem xmlns="urn:jboss:domain:webservices:2.0">
<wsdl-host>paycontrol.org</wsdl-host>
<wsdl-port>8080</wsdl-port>
<wsdl-secure-port>8443</wsdl-secure-port>
<wsdl-uri-scheme>https</wsdl-uri-scheme>
<endpoint-config name="Standard-Endpoint-Config"/>
<endpoint-config name="Recording-Endpoint-Config">
<pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
<handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
</pre-handler-chain>
</endpoint-config>
<client-config name="Standard-Client-Config"/>
</subsystem>
Указание определённых стандартов защиты и алгоритмов
Для выбора стандарта защиты HTTPS, только, например, TLS 1.2, нужно в объект https-listener объекта <subsystem xmlns="urn:jboss:domain:undertow:X.X"> добавить, enabled-protocols="TLSv1.2".
Для выбора определённых криптографических алгоритмов, необходимо их указать в объекте https-listener объекта <subsystem xmlns="urn:jboss:domain:undertow:X.X">. Например, для запрета режимов работы без использования алгоритмов Диффи-Хеллмана, нужно добавить enabled-cipher-suites="ALL:!kRSA".
Пример:
<subsystem xmlns="urn:jboss:domain:undertow:1.2">
<server name="default-server">
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" enabled-cipher-suites="ALL:!kRSA" enabled-protocols="TLSv1.2"/>
</server>
</subsystem>
https://www.openssl.org/docs/manmaster/man1/ciphers.html
Включение дополнительных заголовков
Для включения дополнительных HTTP заголовков необходимо в файл
- Linux:
- /opt/wildfly/standalone/configuration/standalone.xml
- Windows:
- C:\wildfly\standalone\configuration\standalone.xml
- добавить фильтры в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> добавив блок (при его отсутствии)
<filters></filters>
следующего содержания:<filters> <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/> <response-header name="x-frame-options" header-name="X-Frame-Options" header-value="DENY"/> <response-header name="x-content-type-options" header-name="X-Content-Type-Options" header-value="nosniff"/> <response-header name="Content-Security-Policy" header-name="Content-Security-Policy" header-value="default-src 'self'"/> </filters>
- добавить ссылки на эти фильтры в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> в <server name="default-server"> в <host name="default-host" alias="localhost"> включив следующие строки:
<filter-ref name="transport-security"/> <filter-ref name="x-frame-options"/> <filter-ref name="x-content-type-options"/> <filter-ref name="Content-Security-Policy"/>
Пример:
<subsystem xmlns="urn:jboss:domain:undertow:11.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" enabled-cipher-suites="ALL:!kRSA" enabled-protocols="TLSv1.2"/>
<host name="default-host" alias="localhost">
<http-invoker security-realm="ApplicationRealm"/>
<filter-ref name="transport-security"/>
<filter-ref name="x-frame-options"/>
<filter-ref name="x-content-type-options"/>
<filter-ref name="Content-Security-Policy"/>
</host>
</server>
<servlet-container name="default">
<jsp-config/>
<websockets/>
</servlet-container>
<filters>
<response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/>
<response-header name="x-frame-options" header-name="X-Frame-Options" header-value="DENY"/>
<response-header name="x-content-type-options" header-name="X-Content-Type-Options" header-value="nosniff"/>
<response-header name="Content-Security-Policy" header-name="Content-Security-Policy" header-value="default-src 'self'"/>
</filters>
</subsystem>
Изменение номера порта
Предупреждение! ОС Linux не позволяет сервисам работающим не от имени root использовать порты с номерами ниже 1024. Для использования портов ниже 1024 необходимо выполнять трансляцию, например с помощью netfilter (iptables/firewalld). |
Для изменения номера порта необходимо в файле /opt/wildfly/standalone/configuration/standalone.xml (Linux) или в C:\wildfly\standalone\configuration\standalone.xml (Windows), в блоке
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
в нужном (для http, либо https) параметре
<socket-binding name="http" port="${jboss.http.port:8080}"/>
<socket-binding name="https" port="${jboss.https.port:8443}"/>
изменить номер используемого порта.
После изменения номера порта, службу WildFly необходимо перезапустить.
При использовании «сервером» стандартных портов (80 для HTTP или 443 для HTTPS), при установке параметров настроек «клиента» для подключения к «серверу», номер порта в адресе дополнительно указывать не рекомендуется во избежании проблем, т.к. в этих случаях, согласно RFC2616 используется порт по умолчанию. При дополнительном указании в адресе порта по умолчанию бывали случаи возникновения проблем подключения.
Приведённые ниже примеры описаны для протокола HTTP. При использовании HTTPS, необходимо также скорректировать название используемого протокола в адресе подключения.
Изменение порта PCS
При изменении порта для подключения к PCS, необходимо:
- установить новый порт для обращения к PC в настройках прикладной системы;
- изменить номер порта в настройках PCIS External.
Для изменения номера порта для обращения к PCS, в настройках PCIS External в файле /opt/wildfly/bin/standalone.conf (Linux) или C:\opt\wildfly\bin\standalone.conf.bat (Windows), в строке
JAVA_OPTS="$JAVA_OPTS -Dpcservice.endpoint=http://localhost:8080/ws/PayControlServiceV3?wsdl -Duser.language=ru -Dpaycontrol.locale=ru"
в параметре -Dpcservice.endpoint=http://<HOSTNAME>:<PORT>/ws/PayControlServiceV3?wsdl установить новое значение <PORT>.
Изменение порта PCIS Internal
Для изменения порта для подключения к PCIS Internal необходимо в БД PCS выполнить следующий запрос:
update pc_system set pc_is_internal_url='http://<HOSTNASME>:<PORT>/wsis/PayControlInteractionService?wsdl' where systemid='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
где
- <HOSTNASME> - имя хоста PCIS Internal;
- <PORT> новое значение порта;
- XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - UUID идентификатор прикладной системы.
Допускается выполнять запрос к БД PCS на обновление адреса PCIS Internal без указания systemid, в случае, если подключена только одна прикладная система, или необходимо обновить адрес PCIS Internal для всех прикладных систем.
После изменения номера порта, службу wildfly необходимо перезапустить.
Изменение порта PCIS External
Предупреждение! При изменении порта PCIS External мобильное приложение потеряет возможность подключения к серверу PayControl до тех пор, пока пользователю мобильного приложения не будет перевыпущен ключ с новым адресом подключения к серверу. |
Предупреждение! Изменение порта, на котором сервер PCIS External ожидает подключения не всегда ведёт к изменению порта назначения, который используется мобильным приложением для доступа к серверу PayControl. Такая ситуация, например, может возникнуть, если перед сервером PCIS External со стороны сети Интернет установлено оборудование/ПО, выполняющее трансляцию сетевых портов. |
При изменении порта PCIS External необходимо в БД PCS выполнить следующий запрос:
update pc_system set pc_is_external_url='http://<HOSTNASME>:<PORT>/PayControl-interaction-rest/' where systemid='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX';
где
- <HOSTNASME> - имя хоста PCIS External, используемое мобильными устройствами для доступа к серверу PayControl;
- <PORT> новое значение порта;
- XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - UUID идентификатор прикладной системы.
Допускается выполнять запрос к БД PCS на обновление адреса PCIS External без указания systemid, в случае, если подключена только одна прикладная система, или необходимо обновить адрес PCIS External для всех прикладных систем.
После изменения номера порта, службу wildfly необходимо перезапустить.
Валидация подключения
PostgreSQL
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"></valid-connection-checker>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"></exception-sorter>
</validation>
Oracle
<validation>
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
<validate-on-match>false</validate-on-match>
<background-validation>true</background-validation>
<background-validation-millis>10000</background-validation-millis>
</validation>
MS SQL
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"></valid-connection-checker>
</validation>
Установка лимитов потребляемой памяти
Лимиты доступа к памяти необходимо выбирать исходя из нагрузки и ресурсов сервера.
Пример:
JAVA_OPTS=-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m
Контроль
Потребление ресурсов
/opt/jboss/wildfly/bin/jboss-cli.sh --connect
/core-service=platform-mbean/type=memory:read-resource(recursive=true,proxies=true,include-runtime=true,include-defaults=true)
Вывод:
{
"outcome" => "success",
"result" => {
"heap-memory-usage" => {
"init" => 641728512L,
"used" => 1746929168L,
"committed" => 4097835008L,
"max" => 10257170432L
},
"non-heap-memory-usage" => {
"init" => 7667712L,
"used" => 331419120L,
"committed" => 357740544L,
"max" => -1L
},
"object-name" => "java.lang:type=Memory",
"object-pending-finalization-count" => 0,
"verbose" => false
}
}
Вывод параметров конфигурации в журнал при старте
JAVA_OPTS=-XshowSettings:all
Журналирование
Доступ к данным журнала
Журнал работы сервера PayControl записываются общий лог функционирования Wildfly.
Файлы журналов за текущий день доступны по следующему пути:
- Linux:
- /opt/wildfly/standalone/log/server.log
- Windows:
- C:\wildfly\standalone\log\server.log
Для просмотра журнала за другие дни, нужно добавить к имени файла требуемую дату в формате server.log.YYYY-MM-DD
Включение журналирования SOAP-вызовов
Для включения расширенного логирования необходимо:
- Остановить службу wildfly.
- Добавить после блока <extensions> ... </extensions> в файл
- Linux:
- /opt/wildfly/standalone/configuration/standalone.xml
- Windows:
- C:\wildfly\standalone\configuration\standalone.xml
- следующий блок:
<system-properties> <property name="org.apache.cxf.logging.enabled" value="pretty"/> </system-properties>
- Linux:
- Запустить службу wildfly.
Направление логов Wildfly в Kafka
Исходник https://developer.jboss.org/docs/DOC-56423. Основное отличие - добавление <module name="com.fasterxml.jackson.core.jackson-databind"/>
в зависимости модуля org.apache.kafka.clients.
Модули
Файлы модулей можно загрузить с https://mvnrepository.com/
org.apache.kafka.clients
Создать файл /opt/wildfly/modules/system/layers/base/org/apache/kafka/clients/main/module.xml
с содержанием
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.apache.kafka.clients" xmlns="urn:jboss:module:1.8">
<resources>
<resource-root path="kafka-clients-2.6.0.jar"/>
<resource-root path="snappy-java-1.1.8.2.jar"/>
<resource-root path="lz4-java-1.7.1.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="org.slf4j"/>
<module name="com.fasterxml.jackson.core.jackson-databind"/>
</dependencies>
</module>
и добавить в директорию указанные в блоке resources
файлы.
org.apache.kafka.log4jappender
Создать файл /opt/wildfly/modules/system/layers/base/org/apache/kafka/log4jappender/main/module.xml
с содержанием
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.apache.kafka.log4jappender" xmlns="urn:jboss:module:1.8">
<resources>
<resource-root path="kafka-log4j-appender-2.6.0.jar"/>
<resource-root path="slf4j-log4j12-1.7.30.jar"/>
</resources>
<dependencies>
<module name="org.slf4j"/>
<module name="org.apache.kafka.clients" />
<module name="org.jboss.log4j.logmanager" />
</dependencies>
</module>
и добавить в директорию указанные в блоке resources
файлы.
org.apache.log4j
Добавить модуль log4jappender в качестве зависимости в существующий org.apache.log4j модуль:
<module name="org.apache.log4j" xmlns="urn:jboss:module:1.6">
...
<dependencies>
...
<module name="org.apache.kafka.log4jappender" export="true"/>
</dependencies>
</module>
org.jboss.as.standalone
Указать в имеющемся модуле org.jboss.as.standalone в качестве зависимости модуль org.apache.kafka.clients.
<module name="org.jboss.as.standalone" xmlns="urn:jboss:module:1.6">
...
<dependencies>
...
<module name="org.apache.kafka.clients" />
</dependencies>
</module>
Хэндлеры
Необходимо добавить перечисленные ниже хэндлеры в файл standalone.xml в блок <subsystem xmlns="urn:jboss:domain:logging:8.0">
kafka
<custom-handler name="kafka" class="org.apache.kafka.log4jappender.KafkaLog4jAppender" module="org.apache.log4j">
<level name="INFO"/>
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<properties>
<property name="brokerList" value="localhost:9092"/>
<property name="topic" value="out-topic"/>
</properties>
</custom-handler>
async-kafka-wrapper
<async-handler name="async-kafka-wrapper">
<level name="ALL"/>
<queue-length value="1024"/>
<overflow-action value="block"/>
<subhandlers>
<handler name="kafka"/>
</subhandlers>
</async-handler>
Включение хэндлера
В блок <handlers>
добавить <handler name="async-kafka-wrapper"/>
Проблемы и способы их устранения
Очень медленный старт через standalone.sh (каждый этап скрипта запуска - с большими задержками). Система отправляет сигнал на остановку сервиса
Вероятная проблема - неверные настройки DNS сервера.
Решение:Необходимо скорректировать настройки DNS.
Проблема обнаружилась 2018-07-27 при развёртывании у заказчика. A.bursakov (обсуждение) 19:56, 1 августа 2018 (MSK)
Не происходит «биндинг» IP-адреса адаптера
Вероятная проблема - отсутствие PTR-записи на DNS-сервере, или неправильная работа службы DNS.
Решение: Добавить в файл opt/wildfly/bin/standalone.conf (Linux) или C:\opt\wildfly\bin\standalone.conf.bat (Windows), в переменную JAVA_OPTS параметр -Djboss.bind.address=0.0.0.0
Проблема проявилась на тестовом Windows-сервере A.bursakov (обсуждение) 19:56, 1 августа 2018 (MSK)
Частое появление WARNING в логе
Предупреждения в логе вида:
WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-1) Interceptor for {http://ws.safetech.ru/PayControlV3/}PayControlServiceV3 has thrown exception, unwinding now: org.apache.cxf.binding.soap.SoapFault: Error writing to XMLStreamWriter. Caused by: com.ctc.wstx.exc.WstxIOException: UT010029: Stream is closed Caused by: java.io.IOException: UT010029: Stream is closed
WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-1) Interceptor for {http://ws.safetech.ru/PayControlV3/}PayControlServiceV3 has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Could not send Message. Caused by: java.io.IOException: Broken pipe
Могут быть вызваны системой мониторинга, которая для проверки того, что сервер доступен, устанавливает соединение и обрывает его получив лишь только header.
Для отключения предупреждений о непредвиденном закрытии соединения необходимо в файл /opt/wildfly/standalone/configuration/standalone.xml в блок
<profile>
<subsystem xmlns="urn:jboss:domain:logging:X.X">
...
</subsystem>
</profile>
добавить:
<!-- to prevent warnings on unsuspicious connection close -->
<logger category="org.apache.cxf.phase.PhaseInterceptorChain">
<level name="ERROR"/>
</logger>
INFO: Disabling contextual LOB creation as createClob() method threw error
Иногда смущает появление в журнале события, из-за присутствия в его составе слова "error":
INFO [org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl] (ServerService Thread Pool -- 64) HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Для отключения этого сообщения необходимо установить hibernate.temp.use_jdbc_metadata_defaults=false
в файл persistence.xml, располагающийся внутри модуля сервера следующим образом:
<properties> ... <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/> ... </properties>
Wildfly не стартует как служба и нет логов
Возможные проблемы:
- Некорректные права на директории/файлы в /opt/wildfly.
chown -RHv wildfly:wildfly /opt/wildfly
- Проблемы с определением необходимой Java. Для восстановления необходимо выполнить
sudo update-alternatives --config java