Некоторые аспекты настройки JBoss
Исходными данными для этой статьи является фирменная документация JBoss и сама статья собственно ни что иное как вольный пересказ этой документации. Она не претендует на полноту описаний, но может помочь новичку в JBoss быстро настроить некоторые из параметров.
Настройка параметров соединения с базой данных с использованием шифрованных паролей
Если мы посмотрим на файлы настройки data source в JBoss поставляемым по умолчанию, то заметим, что пароль пользователя под которым осуществляется соединение с базой данных хранится в открытом виде. На самом деле при грамотном администрировании это не является такой уж проблеммой или дырой в безопастности, но в определённых условиях может оказаться не приемлемым. И так, что же мы должны сделать чтобы "спрятать" пароль от взора постороннего? Для примера мы возьмём файл настройки для соединения с Oracle.
Для "изъятия" пароля в явном виде, необходимо в файле $JBOSS_HOME$/server/<used_config>/deploy/oracle-ds.xml убрать все явные упоминания имени пользователя и пароля, а вместо этого, добавить строчку:
<security-domain>EncryptDBPassword</security-domain>
Где EncryptDBPassword – имя домена, описанного в файле файле $JBOSS_HOME$/server/<used_config>/cong/login-config.xml.
Описание домена так же очень простое:
<application-policy name = "EncryptDBPassword">
<authentication>
<login-module code = "org.jboss.resource.security.SecureIdentityLoginModule"
flag = "required">
<module-option name = "username">user</module-option>
<module-option name = "password">шифрованный_пароль</module-option>
<module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=имя_date source_из_oracle-ds.xml</module-option>
</login-module>
</authentication>
</application-policy>
Единственный вопрос, который остался, это как зашифровать пароль, чтобы вставить его в login-config.xml. Шифрованый пароль получается следующей командой:
java -cp "libjboss-jmx.jar;libjboss-common.jar;serverdefaultlibjboss-jca.jar;serverdefaultlibjbosssx.jar" org.jboss.resource.security.SecureIdentityLoginModule <пароль>
команду надо запустить в корне каталога, в котором установлен JBoss. Вот собственно и всё что надо сделать.
Настройка работы через внешний web-сервер с балансировкой нагрузки web запросов.
Документация JBoss рекомендует в качестве load balancer использовать Web server Apache с модулем mod_jk. Хотя это и не единственный способ обеспечить балансировку, я не буду изобретать ничего нового и будем следовать этим рекомендациям.
Для настройки мы возьмём Apache версии 2.2.4, на самом деле вы можете взять любую версию Apache, единственное требование, это использовать "подходящий" модуль mod_jk.
И так, качаем mod_jk подходящий для нашего Apache и копируем его в каталог $APACHE_HOME$/modules.
Далее в файл $APACHE_HOME$/conf/httpd.conf надо добавить строку:
Include conf/mod-jk.conf
Создадим mod-jk.conf с примерно таким содержимым:
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"
# Mount your applications
JkMount /CONTEXT/* loadbalancer
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
#JkMountFile conf/uriworkermap.properties
# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
И наконец создадим файл workers.properties, в котором хранятся описания или хостов для балансировки.
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status
# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=<JBoss host1>
worker.node1.type=ajp13
worker.node1.lbfactor=1
worker.node1.cachesize=10
# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host= <JBoss host2>
worker.node2.type=ajp13
worker.node2.lbfactor=1
worker.node2.cachesize=10
# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
worker.list=loadbalancer
# Status worker for managing load balancer
worker.status.type=status
На этом настройка Apache закончена, можно перестартовать его и перейдти к настройкам JBoss. Для этого надо в файле $JBOSS_HOME$/server/<used_config>/deploy/jbossweb-tomcat55.sar/META-INF/jboss-service.xml установить параметр “UseJK” в true:
<attribute name="UseJK">true</attribute>
Кроме того, на каждом узле надо прописать имя node, соответствующее имени данного узла в файле workers.properties из настройки Apache.
<Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1">
Собственно всё, перестартуем JBoss. Теперь про обращении на хост с Apache по контексту CONTEXT, все запросы будут отсылаться на один из серверов JBoss.
Самый простой кластер.
И так мы выяснили как балансировать нагрузку web запросов. Теперь попробуем быстро организовать полноценный кластер в JBoss. В самом простом случае, достаточно запустить сервера с конфигурацией all. Делается это командой run.bat –c all. При условии, если каждый из серверов настроен в соответствии с этими инструкциями, они автоматически объединятся в кластер. Порядок запуска серверов не важен. Следует помнить, что в кластерной конфигурации развёртывание приложение производится копированием ear файла в папку farm а не в папку deploy. Кроме того, приложение разворачиваемое на сервере, должно быть готово для работы в условиях кластера. Для этого в файл WEB-INF/web.xml надо в случае отсутствия добавить
который должен идти сразу после корневого элемента <web-app>.
Кроме того в файле WEB-INF/jboss-web.xml надо настроить репликацию сессий.
<jboss-web>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>true</replication-field-batch-mode>
</replication-config>
</jboss-web>
После этого, приложение необходимо пересобрать и развернуть на сервере.
Полное описание настроек кластера можно посмотреть в JBoss Clustering guide.