是否可以将多个contextPath映射到Jetty中的一个WAR文件?例如
${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>
答案 0 :(得分:3)
我是这样做的,我也为每个站点设置了不同的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文件在每个jetty.xml文件的connector部分中指定不同的ip或主机名。如果您只有一个ip,那么您将使用context xml中的上下文路径设置来区分这两个实例。
在jetty.xml中,请参阅第一个实例的 ip或host 和目录以包含context.xml :
<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或host 和目录以包含context.xml :
<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>
如果如上所示定义,您可以通过触摸上下文xml文件重新加载war文件并重新启动应用程序。
将单独的上下文文件放在上下文目录的单独子目录中,每个子目录指向同一个war文件,但具有不同的上下文路径和不同的虚拟主机。
/opt/Jetty/contexts/subdirectory_for_first_instance/context_first.xml
/opt/Jetty/contexts/subdirectory_for_second_instance/context_second.xml
在context_first.xml中 - 您可以指定一个始终链接到第一个应用程序的节点(firstapp)
<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>
答案 1 :(得分:0)
您只需复制war文件并重命名即可。
答案 2 :(得分:0)
我意识到这已经过时但是由于提供的答案并没有真正回答这个问题,为了将来参考,你可以通过向{WebappContext
添加id
属性来使用相同的.war来实现多个Configure
{1}}。
<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 pooling资源“pg_conn”,而没有引用WebappContext
的id的Arg(在这种情况下是“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>