如何在不同端口后面的单个JBoss AS 6实例上运行不同的应用程序?

时间:2014-04-03 22:32:13

标签: java tomcat servlets jboss jboss6.x

我来自this SO但是我的情况不是Tomcat,而是JBoss EAP 6.所以假设我在JBoss AS 6上运行了两个web应用程序app1和app2:

  • app http://localhost:8080/app1
  • app http://localhost:8080/app2

但是我想配置Tomcat,以便它们在不同端口后面的根上下文中运行:

  • app http://localhost:8081
  • app http://localhost:8082

如何在JBoss EAP 6上实现?注意this answer对我来说不起作用,因为它针对JBoss 5。

3 个答案:

答案 0 :(得分:7)

编辑:这些说明适用于原始问题中要求的JBoss AS6。 AS7具有不同的配置文件语法。

您的问题分为两部分:

  1. 让JBoss监听多个端口
  2. 将请求发送至8081至app1,将8082发送至app2
  3. 让JBoss监听多个端口

    这个很容易。

    将这些行添加到$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml

    <!-- A HTTP/1.1 Connector on port 8081 -->
    <Connector protocol="HTTP/1.1" port="8081" address="${jboss.bind.address}" 
       redirectPort="${jboss.web.https.port}" />
    
    <!-- A HTTP/1.1 Connector on port 8082 -->
    <Connector protocol="HTTP/1.1" port="8082" address="${jboss.bind.address}" 
       redirectPort="${jboss.web.https.port}" />
    

    服务器启动时,请在日志中观察以下消息:

    11:56:23,639 INFO  [org.apache.coyote.http11.Http11Protocol] Starting Coyote HTTP/1.1 on http-127.0.0.1-8081
    11:56:23,640 INFO  [org.apache.coyote.http11.Http11Protocol] Starting Coyote HTTP/1.1 on http-127.0.0.1-8082
    

    注意:如果您想“正确”执行此操作,则应使用占位符而不是硬编码数字,并编辑$JBOSS_HOME/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml来定义它们。但是,除非您需要通过管理UI管理端口,否则这将是一种过度杀伤。

    将请求发送到端口8081到app1和端口8082到app2

    这要困难得多。 JBoss使用自己的Tomcat引擎,它不支持多个webapp根(appBase属性不起作用)。因此,无法为连接器配置两个不同的目录。可以添加虚拟主机并在每个应用程序中使用jboss-web.xml来配置它响应的vhost,但这意味着您必须在客户端URL中使用不同的名称。

    这里有两个选择。

    选项1:JBoss RewriteValve

    Host

    中将其添加到$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml配置元素(在其他阀门定义之前)
     <Valve className="org.jboss.web.rewrite.RewriteValve" />
    

    使用以下内容创建文件$JBOSS_HOME/server/default/conf/jboss.web/localhost/rewrite.properties

    RewriteCond %{SERVER_PORT}  =8081
    RewriteRule ^/(.*)$  /app1/$1 [L]
    
    RewriteCond %{SERVER_PORT}  =8082
    RewriteRule ^/(.*)$  /app2/$1 [L]
    

    注意:您可能需要创建$JBOSS_HOME/server/default/conf/jboss.web/localhost/目录,默认情况下它不存在。

    注意2:rewrite.properties的位置取决于Valveserver.xml标记的展示位置。最直观的展示位置是其他Valve元素。但是它也直接在Engine下有效。在这种情况下,rewrite.properties文件需要向上移动一个目录。

    选项2:ROOT上下文中的Servlet过滤器

    将servlet过滤器部署到$JBOSS_HOME/server/default/deploy/ROOT.war/,根据传入端口调度请求。您可以推出自己的自定义过滤器实现,也可以使用UrlRewriteFilter配置如下所示:

    <rule>
      <condition type="port">8081</condition>
      <from>/(.*)</from>
      <to context="app1">/$1</to>
    </rule>
    
    <rule>
      <condition type="port">8082</condition>
      <from>/(.*)</from>
      <to context="app2">/$1</to>
    </rule>
    

    另见:

    编辑:鉴于JBoss配置的复杂性,您也可以选择位于应用服务器前面的基于Apache的反向代理。

答案 1 :(得分:3)

JBoss AS7版本的配置在AS6的答案中讨论了多个http连接器和一个重写阀。

--- standalone/configuration/standalone.xml.orig    1970-01-01 00:00:00.000000000 -0100
+++ standalone/configuration/standalone.xml 1970-01-01 00:00:00.000000000 -0100
@@ -257,9 +257,17 @@
         </subsystem>
         <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
             <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
+            <connector name="http1" protocol="HTTP/1.1" scheme="http" socket-binding="http1"/>
+            <connector name="http2" protocol="HTTP/1.1" scheme="http" socket-binding="http2"/>
             <virtual-server name="default-host" enable-welcome-root="true">
                 <alias name="localhost"/>
                 <alias name="example.com"/>
+                <rewrite pattern="^/(.*)$" substitution="/app1/$1" flags="L">
+                    <condition test="%{SERVER_PORT}" pattern="=8081" flags=","/>
+                </rewrite>
+                <rewrite pattern="^/(.*)$" substitution="/app2/$1" flags="L">
+                    <condition test="%{SERVER_PORT}" pattern="=8082" flags=","/>
+                </rewrite>
             </virtual-server>
         </subsystem>
         <subsystem xmlns="urn:jboss:domain:webservices:1.1">
@@ -293,6 +301,8 @@
         <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"/>
         <socket-binding name="ajp" port="8009"/>
         <socket-binding name="http" port="8080"/>
+        <socket-binding name="http1" port="8081"/>
+        <socket-binding name="http2" port="8082"/>
         <socket-binding name="https" port="8443"/>
         <socket-binding name="osgi-http" interface="management" port="8090"/>
         <socket-binding name="remoting" port="4447"/>

另见:

答案 2 :(得分:0)

以下方法对我有效。看看。

首先转到服务器位置,然后使用新名称复制default文件夹。在我的场景中,将其命名为server_uat

将{strong> conf,lib和server 文件夹从default复制到server_uat文件夹。

直接转到jboss-service.xml(位于server_uat中)

取消注释ServiceBindingManager mbean并将ServerName更改为ports-01

您甚至可以使用ports-02ports-03。 JBoss已经在docs/examples/binding-manager.xml文件中完成了所需的配置。

在将ports-01添加到mbean代码段后进行更改。应该像下面这样大声笑。

 <mbean code="org.jboss.services.binding.ServiceBindingManager"
     name="jboss.system:service=ServiceBindingManager">
     <attribute name="ServerName">ports-01</attribute>
     <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>
     <attribute name="StoreFactoryClassName">
       org.jboss.services.binding.XMLServicesStoreFactory
     </attribute>
   </mbean>

使用命令提示符,直接转到bin文件夹,并使用以下命令运行server_uat服务器实例。

Windows:

run.bat -c server_uat

Linux:

./run.sh -c server_uat

仅供参考

ports-01 refers 8180

ports-02 refers 8280

ports-03 refers 8380