Статьи

Пролить свет на плагины и прокси-серверы GlassFish


Вдохновленная статьей Линкольна Бакстера III о
запуске JBoss на 80-м порту , я решил более подробно рассмотреть, что возможно и необходимо для GlassFish для использования проксирования и балансировки нагрузки. 

Давайте посмотрим на основы впереди. Прежде всего, мы должны разделить два вида проблем здесь. Тот, на который ссылается Линкольн, в котором говорится об общих ограничениях безопасности Unix / Linux, которые не позволяют обычным пользователям связываться с привилегированными портами (в данном случае это порт 80). Второй касается балансировки нагрузки и отработки отказа, которые необходимы в кластерных средах. И то, и другое можно решить с помощью некоторого подхода к прокси, и в зависимости от ваших потребностей у вас будет несколько вариантов решения.

Привязка GlassFish к порту 80 (HTTP)

Бывают случаи, когда удобно разрешать пользователям без полномочий root запускать службы, привязываясь к «привилегированным портам». Есть несколько подходов к этой проблеме.

Использование брандмауэра (iptables) для перенаправления пакетов

Этот метод настраивает брандмауэр для отправки всего трафика порта 80 на порт 8080 (обычный порт приложения GF). Вы можете сделать то же самое для любых других необходимых вам портов, которые меньше 1024.

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080 
iptables -t nat -A PREROUTING -p udp -m udp --dport 80 -j REDIRECT --to-ports 8080 

Использование authbind

Authbind — системная утилита с открытым исходным кодом. Программное обеспечение authbind позволяет программе, которая обычно требует привилегий суперпользователя для доступа к привилегированным сетевым службам, работать как непривилегированный пользователь. authbind позволяет системному администратору разрешить определенным пользователям и группам доступ к привязке к портам TCP и UDP ниже 1024. Authbind распространяется с дистрибутивами Debian и Ubuntu Linux. Для всех остальных дистрибутивов вам придется установить его вручную. Выполнив следующее с установленным authbind

touch /etc/authbind/byport/80 
chown glassfish:glassfish /etc/authbind/byport/80 
chmod 755 /etc/authbind/byport/80 

Вы позволите пользователю «glassfish» подключиться к порту 80 на вашем компьютере.

Использование Jsvc

Apache Commons Jsvc позволяет приложению (например, GlassFish) выполнять некоторые привилегированные операции от имени пользователя root (например, связываться с портом <1024), а затем переключать учетную запись непривилегированному пользователю. Существует два способа использования jsvc: через класс, который реализует интерфейс Daemon, или через вызов класса, который имеет необходимые методы. Использование этого для GlassFish будет означать реализацию класса Jsvc GlassFishDaemon, который реализует необходимые методы (init, start, stop, destroy) и запускает его через

  ./jsvc -cp mygflauncher.jar GlassFishDaemon 

Apache mod_proxy с ProxyPass

Первым шагом здесь является запуск работающего Apache, который сам по себе уже связан с портом 80. Обычно это делается через среды chroot или команду sudo. Для более подробного пошагового руководства посмотрите
пост Линкольна . Эта конфигурация позволяет отображать удаленные серверы в пространство локального (Apache) сервера; Локальный сервер не действует как прокси в обычном смысле, но выглядит как зеркало удаленного сервера. Локальный сервер часто называют обратным прокси-сервером или шлюзом. Все, что вам нужно, это следующая директива, при условии, что ваш Apache работает на порту 80:

ProxyPass / http://localhost:8080/

Для более подробной информации обратитесь к
документации Apache .

Apache mod_proxy с RewriteRules

Если вы смотрите на более сложные сценарии, вы, вероятно, готовы перенаправить только один контекст. Это возможно с помощью
директивы
RewriteRule . Это настоящая рабочая лошадка для переписывания. Директива может встречаться более одного раза, причем каждый экземпляр определяет одно правило перезаписи. Порядок, в котором определяются эти правила, важен — это порядок, в котором они будут применяться во время выполнения.

ProxyPreserveHost on
RewriteEngine on

RewriteRule ^/exampleapp$ /exampleapp/ [R,L]
RewriteRule ^/exampleapp/(.*) http://localhost:8080/exampleapp/$1 [P,L]

Перепишите правило номер один, добавив в конце концов отсутствующую косую черту, а правило номер два прокси-серверы перенаправляют ваши запросы на сервер Glassfish. Директива ProxyPreserveHost обеспечивает правильную работу перенаправлений.

Методы балансировки нагрузки и восстановления после сбоя

Для масштабирования больших объемов нагрузки обычно используется несколько экземпляров сервера в корпоративных средах. Обычно балансировщик нагрузки используется перед этими кластерами экземпляров. Существует несколько разных подходов к балансировке нагрузки и отказоустойчивости. Вот несколько программных способов, которые я видел в дикой природе.

Oracle GlassFish LoadBalancer

Даже если это первый вариант, с которым вы сталкиваетесь при поиске решений для балансировки нагрузки, вы должны помнить, что это является частью коммерческого сервера Oracle GlassFish и поэтому не является бесплатным. Даже если бы было возможно использовать его с битами OSS!

Плагин Loadbalancer поставляется в виде ZIP-пакета, который устанавливается после установки и настройки сервера GlassFish и требуемого веб-сервера. Плагин устанавливается с помощью графического Конфигуратора балансировки нагрузки GlassFish, который помогает настроить веб-сервер и сервер GlassFish для совместной работы. В большинстве случаев конфигуратор GlassFish Loadbalancer автоматически настраивает сервер GlassFish и ваш веб-сервер, и ручного вмешательства не требуется. Однако, в зависимости от конфигурации вашего веб-сервера, после установки подключаемого модуля Loadbalancer могут потребоваться некоторые этапы настройки вручную. Это также относится и к Apache 2.2.x. Вам просто нужно выполнить некоторые шаги до и после установки, которые подробно описаны в
документации по серверу Oracle GlassFish., Если вы заинтересованы во внутренней работе плагина, вы можете взглянуть на
страницу GlassFish LoadBalancer, которая суммирует все детали. Я предполагаю, что они не сильно изменились для последней версии.

Apache mod_jk

Помимо официального плагина GlassFish LoadBalancer, который является частью сервера Oracle GlassFish, рекомендуемое решение для балансировки нагрузки для GlassFish с открытым исходным кодом — использование Apache mod_jk. Apache Tomcat Connector mod_jk можно использовать для соединения веб-контейнера с HTTP-сервером Apache. Конфигурация немного сложнее, и вы найдете тонны информации о конфигурации в целом. Первый важный шаг — установить mod_jk на ваш сервер Apache. Подробное пошаговое руководство смотрите на
официальная документация . Минимальная конфигурация выглядит следующим образом. Добавьте следующие строки в ваш httpd.conf:

LoadModule jk_module /home/oracle/glassfish3/apache/modules/mod_jk.so
JkWorkersFile /home/oracle/glassfish3/apache/conf/glassfish-workers.properties

# where to put the log files for the jk module
JkLogFile /home/oracle/glassfish3/apache/logs/mod_jk.log

# the log level [debug|info|error]
JkLogLevel info

# log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

# options to indicate to send SSL KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# set the request log format
JkRequestLogFormat "%w %V %T"

# send requests that contain the following to glassfish
JkMount /one-instance/* glassfish-worker1

# send requests to the cluster
JkMount /* loadbalancer

JkWorkersFile содержит всю необходимую информацию о ваших экземплярах и балансировке нагрузки.

# define the workers
worker.list=glassfish-worker1,glassfish-worker2,loadbalancer

# set properties for the workers
worker.glassfish-worker1.type=ajp13
worker.glassfish-worker1.host=localhost # your GlassFish instance1 host
worker.glassfish-worker1.port=24849 # your GlassFish instance1 port
worker.glassfish-worker2.type=ajp13
worker.glassfish-worker2.host=localhost  # your GlassFish instance2 host
worker.glassfish-worker2.port=24848  # your GlassFish instance2 port
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=glassfish-worker1,glassfish-worker2

Подробное руководство по настройке Apache mod_jk со GlassFish 3.1 можно найти в
официальной документации  или в
отличной статье от волшебников связующего ПО.

Наконец, что не менее важно, вы должны включить JK Listener с каждым из ваших http-слушателей через консоль администратора GlassFish, и вы должны добавить системное свойство jvmRoute, используя команду asadmin или добавив его через консоль администратора GlassFish:

asadmin create-jvm-options "-DjvmRoute=worker1"

Apache mod_proxy_balancer

Apache mod_proxy имеет расширение балансировщика, называемое
proxy_balancer_module . Этот модуль легко настраивается и может быть адаптирован для многих сценариев. Вы можете настроить алгоритмы балансировки нагрузки и липкости и многое другое. Как минимум ваша конфигурация выглядит так:

ProxyPass / balancer://mycluster
<Proxy balancer://mycluster>
BalancerMember http://localhost:8080 route=route1
BalancerMember http://localhost:8080 route=route2
ProxySet stickysession=JSESSIONID
</Proxy>

Чтобы убедиться, что сеанс придерживается, вам нужно установить опцию JVM, добавьте следующую опцию JVM в ваши экземпляры Glassfish, чтобы они знали, что они работают в настройке кластера Apache:

asadmin create-jvm-options "-DjvmRoute=route1"

Обратите внимание, что jvmRoute должен совпадать с параметром маршрута, упомянутым в записях BalancerMember (route1 / route2).

Какой путь?

Если вы путешествуете по разным дорогам, вы должны выбрать правильный. В общем, это нелегко, поскольку у каждого решения есть свои сильные и слабые стороны. Вообще говоря, вы можете положиться на простую пересылку или проксирование в большинстве случаев. Начиная с стадии разработки или тестирования. Я знаю, что для большинства производственных площадок трафик не выдержал бы без кластера. С кластеризацией приходит балансировка нагрузки в игру. Если вы можете использовать самые простые схемы циклического перебора, доступные с более простыми решениями, у вас все еще достаточно простая настройка. Если вы вынуждены контролировать свою нагрузку и вам необходимо настроить ее под разные аппаратные размеры, вам лучше воспользоваться предложением балансировки нагрузки, содержащимся на сервере Oracle GlassFish. Даже если я знаю много сайтов, на которых работают простые mod_proxy_balancer или mod_jk, они подходят без проблем.

Я рад прочитать о вашем опыте!

 

От http://blog.eisele.net/2012/01/throwing-light-on-glassfish-webserver.html