【问题标题】:Apache - Two VirtualHosts to different workersApache - 两个不同工作人员的虚拟主机
【发布时间】:2016-01-01 12:40:53
【问题描述】:

我有一个在 4 个后端 JBoss 服务器上运行的应用程序。这些服务器位于 Apache Web 服务器后面。目前,我用 my.app1.com (只是一个例子)调用我的应用程序,请求转到后端服务器之一。

我想做的是用另一个域调用我的应用程序,比如 my.app2.com。这是我想要实现的棘手部分 - 当我使用 my.app1.com 调用应用程序时,我希望请求转到两个第一后端服务器(或由两个worker),当我使用 my.app2.com 调用它时,我希望请求转到其他两个后端服务器(或由其他两个 worker 提供服务)。

我认为我可以通过创建两个不同的 VirtualHost 部分来实现这一点,在每个部分中,我将通过使用 VirtualHost 中的属性 JkWorkersFile path/to/workers.properties 来调用不同的 workers.properties 文件。但是重新加载配置后,发现VirtualHost内部无法使用JkWorkersFile。并举一个我所做的例子:

我的VirtualHost 部分如下所示:

<VirtualHost *:80>                                                                 
    ServerName my.app1.com
    <....Other configuration here....>
    JkWorkersFile path/to/workers1.properties
</VirtualHost>

<VirtualHost *:80>                                                                 
    ServerName my.app2.com
    <....Other configuration here....>
    JkWorkersFile path/to/workers2.properties
</VirtualHost>

我的workers1.properties 文件如下所示:

worker.instance1.reference=worker.template
worker.instance1.host=localhost 
worker.instance1=10109 
worker.instance1.domain=group1

worker.instance2.reference=worker.template
worker.instance2.host=localhost 
worker.instance2=10109 
worker.instance2.domain=group1

我的workers2.properties 文件如下所示:

 worker.instance3.reference=worker.template
    worker.instance3.host=localhost 
    worker.instance3=10109 
    worker.instance3.domain=group2

    worker.instance4.reference=worker.template
    worker.instance4.host=localhost 
    worker.instance4=10109 
    worker.instance4.domain=group2

但正如我上面所写,在 VirtualHost 中使用 JkWorkersFile 不起作用。

我在其他一些论坛上读到,可以使用 JkMount(因为它可以多次使用)并将其作为参数/值提供工人的名称。但这似乎也不起作用。

关于如何实现我想要做的事情的任何建议?

【问题讨论】:

    标签: apache virtualhost mod-jk


    【解决方案1】:

    我想出了如何做到这一点。如果有人遇到相同的请求,请在此处发布答案。

    需要的是创建第二个负载均衡器工作器并为其分配您想要的后端实例。在workers.properties(不需要多个worker.properties文件)以及其他配置中,我对两个负载均衡器工作者有以下内容(注意,负载均衡器工作者是不同的东西,后端工作者是不同的东西,我开始意识到):

    worker.list=loadbalancer1,loadbalance2,status
    

    (以下4种由你决定使用什么方法)

    worker.loadbalancer1.method=B
    worker.loadbalancer1.lock=P
    worker.loadbalancer2.method=B
    worker.loadbalancer2.lock=P
    
    .....here goes the list of back-end workers as stated above....
    

    这是最关键的部分:

    worker.loadbalancer1.type=lb
    worker.loadbalancer1.balance_workers=LIST1_OF_BACKEND_WORKERS_YOU_WANT_TO_ASSIGN
    worker.loadbalancer1.sticky_session=True
    worker.loadbalancer1.retries=1
    
    worker.loadbalancer2.type=lb
    worker.loadbalancer2.balance_workers=LIST2_OF_BACKEND_WORKERS_YOU_WANT_TO_ASSIGN
    worker.loadbalancer2.sticky_session=True
    worker.loadbalancer2.retries=1
    
    worker.status.type=status
    

    然后在 conf.d 下我有一个名为 uriworkermap.properties 的文件,其中有以下内容,它告诉两个负载均衡器工作人员中的每一个将请求发送到后端(即分配给他们的实例):

    /*=loadbalancer1;
    /*=loadbalancer2;
    

    然后我配置了两个VirtualHosts,每个都监听不同的域名(如上图):

    <VirtualHost *:80>                                                                 
        ServerName my.app1.com
        <....Other configuration here....>
        JkMount /* loadbalancer1
    </VirtualHost>
    
    <VirtualHost *:80>                                                                 
        ServerName my.app2.com
        <....Other configuration here....>
        JkMount /* loadbalancer2
    </VirtualHost>
    

    简单来说,JkMount /* loadbalancer{N} 行告诉每个 VirtualHost 将所有请求发送到指定的负载均衡器,然后将请求转发给分配给它的后端工作人员。

    就是这样!重新加载您的 Apache,您基本上可以使用两个域名访问您的应用程序,并且每个域名都有自己的后端工作人员。

    【讨论】:

    • 这是一个好问题的好答案。您应该单击接受(复选标记)按钮将其标记为已回答。
    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 2012-11-04
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2015-04-10
    相关资源
    最近更新 更多