Как я могу сопоставить несколько контекстов одному и тому же файлу войны в Причале? - PullRequest
8 голосов
/ 21 июня 2011

Можно ли отобразить несколько contextPaths в один файл WAR в Jetty? Например

${jetty.home}/webapp/bookstore.war

А потом я хотел бы иметь два разных контекста, указывающих на эту войну. Причина заключается в некоторых различиях конфигурации в зависимости от того, какой URL-адрес достигнут.

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
</Configure>

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/books</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
</Configure>

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Вот как я это сделал, и я также настроил разные SSL-сертификаты для каждого сайта (не показано).Я не претендую на понимание всего, что знаю, но это работает для меня в нескольких инсталляциях.Вам нужен файл "jetty.xml" и файл "contexts.xml" для каждого экземпляра.

Предположим, что Jetty установлен в /opt/Jetty...

Запустите два экземпляра серверассылка на две версии файла jetty.xml (это можно сделать в одном скрипте, как показано, или в двух отдельных скриптах запуска)

start.sh ...

cd /opt/Jetty 
java -jar start.jar etc/jetty.xml etc/jetty2.xml

Если выИмея сервер с несколькими ip, вы можете использовать файлы context.xml, чтобы указывать разные ip или имена хостов в разделе соединителя каждого файла jetty.xml.Если у вас есть только один ip, то вы будете использовать настройку пути контекста в контексте xml, чтобы различать два экземпляра.

в файле jetty.xml, см. ip или host , икаталог , который будет содержать context.xml для 1-го экземпляра:

<Call name="addConnector">
   <Arg>
       <New class="org.mortbay.jetty.nio.SelectChannelConnector">
         <Set name="host">HOST OR IP FOR FIRST INSTANCE</Set>
         <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set>
         <Set name="maxIdleTime">30000</Set>
         <Set name="Acceptors">2</Set>
         <Set name="statsOn">false</Set>
         <Set name="confidentialPort">443</Set>
         <Set name="lowResourcesConnections">5000</Set>
         <Set name="lowResourcesMaxIdleTime">5000</Set>
       </New>
   </Arg>
 </Call>
 <Call name="addLifeCycle">
   <Arg>
     <New class="org.mortbay.jetty.deployer.ContextDeployer">
       <Set name="contexts"><Ref id="Contexts"/></Set>
       <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_FIRST_instance</Set>
       <Set name="scanInterval">5</Set>
     </New>
   </Arg>
 </Call>

в файле jetty.xml, обратитесь к ip или хосту и каталог, который содержит context.xml для 2-го экземпляра:

<Call name="addConnector">
   <Arg>
       <New class="org.mortbay.jetty.nio.SelectChannelConnector">
         <Set name="host">HOST OR IP FOR SECOND INSTANCE</Set>
         <Set name="port"><SystemProperty name="jetty.port" default="80"/></Set>
         <Set name="maxIdleTime">30000</Set>
         <Set name="Acceptors">2</Set>
         <Set name="statsOn">false</Set>
         <Set name="confidentialPort">443</Set>
         <Set name="lowResourcesConnections">5000</Set>
         <Set name="lowResourcesMaxIdleTime">5000</Set>
       </New>
   </Arg>
 </Call>
 <Call name="addLifeCycle">
   <Arg>
     <New class="org.mortbay.jetty.deployer.ContextDeployer">
       <Set name="contexts"><Ref id="Contexts"/></Set>
       <Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts/directory_for_SECOND_instance</Set>
       <Set name="scanInterval">5</Set>
     </New>
   </Arg>
 </Call>

Если определено, как показано выше, вы можете перезагрузить файл war и перезапустить приложение, коснувшись файла context xml.

Поместите отдельные файлы контекста в отдельные подкаталоги каталога контекста, каждый из которых указывает на один и тот же файл war, но с разными путями контекста и разными виртуальными хостами.

/ opt / Jetty/contexts/subdirectory_for_first_instance/context_first.xml
/opt/Jetty/contexts/subdirectory_for_second_instance/context_second.xml

в context_first.xml - вы можете указать этот узел (например,)Ссылка на ваше первое приложение

<Set name="contextPath">/firstapp</Set>

в context_second.xml - вы можете указать узел (firstapp), который всегда будет ссылаться на ваше второе приложение

<Set name="contextPath">/secondapp</Set>

(выше необходимо(два разных пути к контексту), если вы хотите запустить их с одного и того же ip, я считаю)

Затем определите два виртуальных хоста (должны отобразить URL, который используется браузером) в отдельных файлах контекста:
В context_first.xml:

<Set name="virtualHosts">
  <Array type="String">
    <Item>www.my_first_app.com</Item>
  </Array>
</Set>

И в context_second.xml

<Set name="virtualHosts">
  <Array type="String">
    <Item>www.my_second_app.com</Item>
  </Array>
</Set>

Примечание: если у вас два имени ip или хоста, вы можете установить путь к контексту:оба приложения в "/"
, если у вас только один ip, путь к контексту будет определять, к какому приложению осуществляется доступ

Кроме того, и, что важно, вы можете отправлять параметры контекста в ваше приложение, чтобы он мог определить, какойэкземпляр, если необходимо.

Пример параметров контекста для отправки уникальных значений каждому экземпляру:

 <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
 <!-- Custom context configuration                                  -->
 <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
 <Set name="initParams">
   <New class="java.util.HashMap">
    <Put name="customer">Joes Fish Store</Put>
    <Put name="ShowPanelNames">N</Put>
    <Put name="FiscalYearStartMonth">10</Put>
    <Put name="LiveEmail">Y</Put>
   </New>
 </Set>
0 голосов
/ 29 апреля 2013

Я понимаю, что это старый, но поскольку предоставленные ответы на самом деле не отвечают на вопрос, для дальнейшего использования вы можете получить несколько WebappContext s, используя один и тот же .war, добавив атрибут id к Configure.

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
</Configure>

<Configure id="booksContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/books</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
</Configure>

Обратите внимание, что все ресурсы именования, определенные в контексте, должны быть либо назначены контексту, используя

<Arg>
    <Ref id="magazinesContext" />
</Arg>

Так что если у вас есть ресурс пула dbcp "pg_conn", без Argссылка на идентификатор WebappContext (в данном случае «magazinesContext» или «booksContext») ресурса будет определяться глобально, т. е. выигрывает последний загруженный WebAppContext.

Возьмем, к примеру, следующее определение WebappContext, где "pg_conn" определено глобально:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>jdbc/db</Arg>
        <Arg>
            <New class="org.apache.commons.dbcp.BasicDataSource">
                <Set name="driverClassName">org.postgresql.Driver</Set>
                <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set>
                <Set name="username">test</Set>
                <Set name="password">*****</Set>
            </New>
        </Arg>
    </New>
</Configure>

и это, где оно определено для экземпляра WebappContext:

<Configure id="magazinesContext" class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/magazines</Set>
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/bookstore.war</Set>
    <Set name="extractWAR">true</Set>
    <New id="pg_conn" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>
            <Ref id="magazinesContext" />
        </Arg>
        <Arg>jdbc/db</Arg>
        <Arg>
            <New class="org.apache.commons.dbcp.BasicDataSource">
                <Set name="driverClassName">org.postgresql.Driver</Set>
                <Set name="url">jdbc:postgresql://localhost:5432/test_db</Set>
                <Set name="username">test</Set>
                <Set name="password">*****</Set>
            </New>
        </Arg>
    </New>
</Configure>
0 голосов
/ 03 июля 2011

Вы можете просто скопировать файл войны и переименовать его.

...