如何在不同端口后面的单个 JBoss AS 6 实例上运行不同的应用程序?
Posted
技术标签:
【中文标题】如何在不同端口后面的单个 JBoss AS 6 实例上运行不同的应用程序?【英文标题】:How to run different apps on single JBoss AS 6 instance behind different ports? 【发布时间】:2014-05-16 00:36:11 【问题描述】:我来自this SO,但是我的案例不在 Tomcat 上,而是在 JBoss EAP 6 上。所以假设我有两个 Web 应用程序 app1 和 app2 在 JBoss AS 6 上运行:
app1 在http://localhost:8080/app1
app2 在http://localhost:8080/app2
但是我想配置 Tomcat,以便它们在不同端口后面的根上下文中运行:
app1 在http://localhost:8081
app2 在http://localhost:8082
如何在 JBoss EAP 6 上实现它?注意 this answer 对我不起作用,因为它针对 JBoss 5。
【问题讨论】:
如何运行两个 JBoss 副本,从第二个开始并使用 port-offset=100 ? 这将不必要地增加内存占用,并且不是我们的选择 Tomcat server.xml 也存在于 AS6 中,只是位于不同的位置。语法在 5 和 6 之间没有变化。但在 7 中发生了变化。 请注意,如果您需要做的只是向 Web 应用程序表明它们正在使用安全连接,那么只需将secure=true
添加到 JBoss http 连接器即可。这将对应用程序“撒谎”并告诉他们这是一个安全连接,您仍然可以使用 nginx 代理请求。 docs.jboss.org/jbossweb/7.0.x/config/http.html
如果应用需要访问客户端信息,例如远程地址等。然后考虑在反向代理和Java服务器之间使用ajp协议。
【参考方案1】:
以下方法对我有用。看看吧。
首先转到服务器位置并使用新名称复制default
文件夹。在我的场景中将其命名为server_uat
。
将 conf、lib 和 server 文件夹从 default
复制到 server_uat
文件夹中。
直接到jboss-service.xml
(在server_uat
)
取消注释 ServiceBindingManager
mbean
并将 ServerName 更改为 ports-01
。
您甚至可以使用ports-02
或ports-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
【讨论】:
【参考方案2】:在 AS6 的答案中讨论的 JBoss AS7 版本的配置具有多个 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"/>
另见:
http://docs.jboss.org/jbossweb/7.0.x/config/http.html https://docs.jboss.org/jbossweb/7.0.x/rewrite.html【讨论】:
我已经从 JBoss EAP 切换到 JBoss web,它实际上是一个 tomcat 服务器。无论如何,我会接受你的第一个答案。但是,我对这个答案感到担忧。由于我已经将 nginx 作为前端代理,所以域名解析应该在 nginx 上完成,而不是在 jboss 上完成,对吧? 客户端 IP 的 DNS 解析? AFAIK 它不是出于性能原因执行的。至少在默认情况下,日志文件具有客户端 IP,而不是名称。您能否分享更多详细信息,您需要解决的具体问题是什么。例如。在 nginx 设置之后,您当前的 JBoss 有什么不适合的。 @greenthanx 接受答案。我也能得到赏金吗? 绝对是你的 ;-) 我希望你能多解释一下这里发生了什么。我不完全明白这是在做什么。【参考方案3】:编辑:这些说明适用于原始问题中要求的 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>
另见:
https://community.jboss.org/wiki/VirtualHostsWithJBossAS http://docs.jboss.org/jbossweb/3.0.x/rewrite.html How to use a servlet filter in Java to change an incoming servlet request url?编辑:鉴于 JBoss 配置的复杂性,您还可以选择位于应用服务器前面的基于 Apache 的反向代理。
【讨论】:
还有第三个选项,做基于IP的虚拟主机。在这种情况下,连接器需要绑定到两个不同的 IP 地址,并且需要 useIPVHosts="true" 从那里开始,一切都与普通虚拟主机相同,除了您还需要添加 和连接器的 IP 地址. 我的$JBOSS_HOME
下根本没有server
文件夹。以下是我$JBOSS_HOME
中的内容:appclient docs jboss-modules.jar standalone bin domain LICENSE.txt version.txt bundles JBossEULA.txt modules welcome-content
那个目录结构看起来像是来自AS7。你到底安装了什么? AS 6 还是 EAP 6?如果它是 EAP,那么它基于 JBoss AS 7 而不是 AS 6。access.redhat.com/site/articles/112673 我将由您将我提供的详细说明转换为新的配置文件格式。相同的想法,不同的配置文件位置和格式。
AS7 的配置在standalone/configuration/standalone.xml
以上是关于如何在不同端口后面的单个 JBoss AS 6 实例上运行不同的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
CVE-2017-12149 JBOOS AS 6.X 反序列化漏洞利用--自测
jboss-as-7.1.0.CR1b域集群和会话复制环境部署
JBoss 6.1.0 AS 过滤器在 web.xml 中的位置
在 JBOSS 6 EAP 中部署一个在 JBOSS AS 5 中工作的简单 WAR 应用程序的问题