编辑:这些说明适用于原始问题中要求的 JBoss AS6。 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}" />
在服务器启动时观察日志中的以下消息:
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 来配置它响应的虚拟主机,但这意味着您必须在客户端 URL-s 中使用不同的名称。
这里有两种选择。
选项 1:JBoss RewriteValve
将此添加到$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml 中的Host 配置元素(在其他阀门定义之前)
<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 的位置取决于Valve 标签在server.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 的反向代理。