null

Учим GlassFish использовать proxy-сервер

При развёртывании приложений на площадке заказчика достаточно часто возникает проблема, связанная с тем, что веб-приложение использует ресурсы из "внешнего" мира, а доступ во "внешний" мир осуществляется через прокси-сервер. Для разных вариантов окружения эта проблема решается по-разному, моя сегодняшняя заметка посвящена её решению применительно к ситуации, когда наше окружение построено на базе сервера приложений Sun Oracle GlassFish, а используемые "внешние ресурсы" доступны по протоколу http / https.

Зачем нужна такая "кэпская" заметка?

Т.к. эта задача является типовой, по ней есть большое количество информации в Сети, в т.ч., и на официальных ресурсах Oracle, так что, вообще говоря, тут всё должно решаться гуглением и предмета для заметки в блог быть не должно. Проблема в том, что большая часть ссылок на первых страницах поисковой выдачи ведут на, хоть и официальные, но неверные инструкции. Конечно, правильный howto тоже есть в Сети (например, на stackoverflow), но наличие официального неправильного мануала от Oracle несколько сбивает с толку :) В общем, наступив несколько раз на одни и те же грабли, я решил зафиксировать правильный порядок действий самому себе на заметку - в будущем пригодится.

Порядок действий

На самом деле, всё достаточно просто. Как обычно, в случае с GlassFish, у нас есть три возможных пути конфигурации сервера приложений - с помощью вебовской админки, с помощью утилиты asadmin, либо посредством ручной правки конфигурационных файлов. Соответственно, рассмотрим все эти способы (все примеры ниже даны для GlassFish 3.1.2.2, но они остаются актуальными и для GlassFish 4).

(A) Веб-консоль

Открываем админку нашего домена, вводим логин / пароль, на навигационной панели разворачиваем пункт "Configurations":

Выбираем из списка нужный нам экземпляр сервера приложений (по умолчанию это server-config), кликаем по пункту меню "JVM Settings", а на открывшейся странице - по вкладке "JVM Options":

Появится страница со списком параметров конфигурации виртуальной машины:

Нам нужно добавить сюда четыре новых параметра (хост и порт в этих параметрах нужно, естественно, заменить на "свои"):

1
2
3
4
-Dhttp.proxyHost=proxy.your.company.com
-Dhttp.proxyPort=3128
-Dhttps.proxyHost=proxy.your.company.com
-Dhttps.proxyPort=3128

Всё! Сохраняем конфигурацию, перезапускаем домен GlassFish и радуемся нормально работающему приложению.

(B) Утилита asadmin

Тут всё тоже просто - нужно в консоли сказать следующее:

1
2
3
4
5
jek@jek-laptop:~$ asadmin --host localhost --port 4848 create-jvm-options \
>-Dhttp.proxyHost=proxy.yourcompany.com:\
>-Dhttp.proxyPort=3128:\
>-Dhttps.proxyHost=proxy.yourcompany.com:\
>-Dhttps.proxyPort=3128

Хост и порт заменяем на соответствующие им параметры вышего домена, прокси-хост и прокси-порт - на параметры вашего прокси-сервера. Обратите внимание, что параметры JVM "отбиваются" друг от друга символом двоеточия.

После этого рестартуем домен - приложение должно заработать.

(C) Правка конфигурационных файлов вручную

Третий путь - не заморачиваться с административными утилитами GlassFish'а, а поправить всё руками в конфигурации домена. В этом случае последовательность действий будет такой:

  1. Останавливаем домен (на случай, если кто-то захочет поправить конфиги одновременно с нами).
  2. Открываем в любимом текстовом редакторе файл $DOMAIN_HOME/config/domain.xml.
  3. Находим в нём раздел с параметрами конфигурации JVM и добавляем конец этого раздела четыре новых параметра:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <java-config classpath-suffix="" debug-options="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9009" system-classpath="">
      <jvm-options>-XX:MaxPermSize=192m</jvm-options>
      <jvm-options>-XX:PermSize=64m</jvm-options>
      <jvm-options>-client</jvm-options>
      <jvm-options>-Djava.awt.headless=true</jvm-options>
      <jvm-options>-Djavax.management.builder.initial=com.sun.enterprise.v3.admin.AppServerMBeanServerBuilder</jvm-options>
      <jvm-options>-XX:+UnlockDiagnosticVMOptions</jvm-options>
      <jvm-options>-Djava.endorsed.dirs=${com.sun.aas.installRoot}/modules/endorsed${path.separator}${com.sun.aas.installRoot}/lib/endorsed</jvm-options>
      <jvm-options>-Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy</jvm-options>
      <jvm-options>-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf</jvm-options>
      <jvm-options>-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as</jvm-options>
      <jvm-options>-Xmx4096m</jvm-options>
      <jvm-options>-Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks</jvm-options>
      <jvm-options>-Djavax.net.ssl.trustStorePassword=changeit</jvm-options>
      <jvm-options>-Djava.ext.dirs=${com.sun.aas.javaRoot}/lib/ext${path.separator}${com.sun.aas.javaRoot}/jre/lib/ext${path.separator}${com.sun.aas.instanceRoot}/lib/ext</jvm-options>
      <jvm-options>-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver</jvm-options>
      <jvm-options>-DANTLR_USE_DIRECT_CLASS_LOADING=true</jvm-options>
      <jvm-options>-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory</jvm-options>
      <jvm-options>-Dosgi.shell.telnet.port=6666</jvm-options>
      <jvm-options>-Dosgi.shell.telnet.maxconn=1</jvm-options>
      <jvm-options>-Dosgi.shell.telnet.ip=127.0.0.1</jvm-options>
      <jvm-options>-Dgosh.args=--nointeractive</jvm-options>
      <jvm-options>-Dfelix.fileinstall.dir=${com.sun.aas.installRoot}/modules/autostart/</jvm-options>
      <jvm-options>-Dfelix.fileinstall.poll=5000</jvm-options>
      <jvm-options>-Dfelix.fileinstall.log.level=2</jvm-options>
      <jvm-options>-Dfelix.fileinstall.bundles.new.start=true</jvm-options>
      <jvm-options>-Dfelix.fileinstall.bundles.startTransient=true</jvm-options>
      <jvm-options>-Dfelix.fileinstall.disableConfigSave=false</jvm-options>
      <jvm-options>-XX:NewRatio=2</jvm-options>
      <jvm-options>-Djdk.tls.client.protocols=TLSv1</jvm-options>
      <jvm-options>-Dhttp.proxyHost=proxy.yourcompany.com</jvm-options>
      <jvm-options>-Dhttp.proxyPort=3128</jvm-options>
      <jvm-options>-Dhttps.proxyHost=proxy.yourcompany.com</jvm-options>
      <jvm-options>-Dhttps.proxyPort=3128</jvm-options>
    </java-config>
  4. Запускаем домен и проверяем работоспособность приложения.

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.