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

Java 如何在不同端口后面的单个JBoss 6实例上运行不同的应用程序?,java,tomcat,servlets,jboss,jboss6.x,Java,Tomcat,Servlets,Jboss,Jboss6.x,我来自日本,但我的案例不是Tomcat,而是JBoss EAP 6。因此,假设我有两个web应用程序app1和app2在JBoss AS 6上运行: http://localhost:8080/app1 app2 onhttp://localhost:8080/app2 但是,我想配置Tomcat,以便它们在根上下文中运行在单独端口后面: http://localhost:8081 app2 onhttp://localhost:8082 如何在JBoss EAP 6上实现?注意:对于我

我来自日本,但我的案例不是Tomcat,而是JBoss EAP 6。因此,假设我有两个web应用程序app1和app2在JBoss AS 6上运行:

  • http://localhost:8080/app1
  • app2 on
    http://localhost:8080/app2
但是,我想配置Tomcat,以便它们在根上下文中运行在单独端口后面:

  • http://localhost:8081
  • app2 on
    http://localhost:8082

如何在JBoss EAP 6上实现?注意:对于我来说不起作用,因为它是针对JBoss5的。

编辑:这些说明是针对JBossAS6的,正如原始问题中所要求的那样。AS7具有不同的配置文件语法

您的问题有两部分:

  • 让JBoss在多个端口上侦听
  • 将请求发送至8081至app1和8082至app2
  • 让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}" />
    
     <Valve className="org.jboss.web.rewrite.RewriteValve" />
    
    注意:如果您想“正确”地执行此操作,您应该使用占位符而不是硬编码的数字,并编辑
    $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-s中使用不同的名称

    你有两个选择

    选项1:JBoss阀门 将其添加到
    $JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml中的
    Host
    配置元素(在其他阀门定义之前)

    <!-- 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}" />
    
     <Valve className="org.jboss.web.rewrite.RewriteValve" />
    
    注意:您可能需要创建
    $JBOSS\u HOME/server/default/conf/JBOSS.web/localhost/
    目录,默认情况下它不存在

    注2:
    rewrite.properties
    的位置取决于
    server.xml
    Valve
    标记的位置。最直观的放置方式是使用其他
    阀门
    元件。但是,它也直接在
    引擎下有效。在这种情况下,
    rewrite.properties
    文件需要向上移动一个目录

    选项2:根上下文中的Servlet过滤器 将servlet过滤器部署到
    $JBOSS\u HOME/server/default/Deploy/ROOT.war/
    ,该过滤器根据传入端口发送请求。您可以推出自己的自定义筛选器实现,也可以使用如下配置:

    <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>
    
    
    8081
    /(.*)
    /$1
    8082
    /(.*)
    /$1
    
    另见:


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

    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"/>
    
    ---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 @@
    +            
    +            
    
    

    • 下面的方法适合我。看一看

      首先转到服务器位置,并用新名称复制
      默认
      文件夹。在我的场景中将其命名为,
      server\u uat

      conf、lib和server文件夹从
      default
      复制到
      server\u uat
      文件夹中

      直接转到
      jboss service.xml
      (位于
      server\u uat

      取消注释
      ServiceBindingManager
      mbean
      ,并将服务器名更改为
      ports-01

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

      port-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>
      
      Linux:

      run.bat -c server_uat
      
      ./run.sh -c server_uat
      
      供参考

      ports-01 refers 8180
      
      ports-02 refers 8280
      
      ports-03 refers 8380
      

      从第二个JBoss拷贝开始运行两个端口偏移量为100的JBoss拷贝怎么样?这将不必要地增加内存占用,而且不是我们的选项。AS6中也有McAT server.xml,它只是在不同的位置。语法在5和6之间没有更改。但在7中进行了更改。请注意,如果您只需要向web应用程序指示它们正在使用安全连接,那么只需将
      secure=true
      添加到JBoss http连接器即可。这将“欺骗”应用程序,并告诉他们这是一个安全连接,您仍然可以使用nginx代理请求。如果应用程序需要访问客户端信息,例如远程地址等,那么考虑在反向代理和java服务器之间使用AJP协议。还有第三种选择,即基于IP的虚拟主机。在这种情况下,连接器需要绑定到两个不同的IP地址,并且需要使用ipvhosts=“true”,从那时起,一切都与普通虚拟主机相同,只是您还需要添加连接器的IP地址。在我的
      $JBOSS_HOME
      下根本没有
      服务器
      文件夹。以下是我的
      $JBOSS_HOME
      appclient docs JBOSS-modules.jar standalone bin domain LICENSE.txt version.txt bundles JBossEULA.txt modules欢迎内容,该目录结构看起来像来自AS7。你到底安装了什么?AS 6还是EAP 6?如果是EAP,那么我