Wildfly
Содержание
- 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
Настройка
Из командной строки
Подключение к консоли:
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/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), в объекте keystore (если АЛИАС не был задан, по умолчанию устанавливается значение "1"):<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
Включение заголовка HSTS
Для включения заголовка HSTS необходимо
- в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> в <server name="default-server"> в <host name="default-host" alias="localhost"> добавить параметр <filter-ref name="transport-security"/>.
- в раздел <subsystem xmlns="urn:jboss:domain:undertow:X.X"> добавить:
<filters> <response-header name="transport-security" header-name="Strict-Transport-Security" header-value="max-age=31536000"/> </filters>
Пример:
<subsystem xmlns="urn:jboss:domain:undertow:6.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"/>
</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"/>
</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 необходимо перезапустить.
Журналирование
Доступ к данным журнала
Журнал работы сервера 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.
Проблемы и способы их устранения
Очень медленный старт через 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>