如何在一个 Tomcat + Apache 上部署多个 Grails 应用程序?

Posted

技术标签:

【中文标题】如何在一个 Tomcat + Apache 上部署多个 Grails 应用程序?【英文标题】:How to deploy multiple Grails apps on one Tomcat + Apache? 【发布时间】:2011-08-10 17:38:04 【问题描述】:

我已经阅读了有关 *** 的几个问题并在 Google 上搜索了几个小时,但对于在一个 tomcat 5.5(使用 Apache)上部署多个 Grails 应用程序的问题,我找不到完整而明确的答案。也许有人可以将我推向正确的方向,或者我们可以在这里总结一个解决方案。

Deploying multiple grails applications with Apache/Tomcat + Virtual Hosts 的问题看起来很有希望,但没有奏效。也许我需要在 Tomcat 或 Apache 中进行额外的更改?

情况:

在 Tomcat 的 webapps 目录 中,我有两个 war 文件 app1.war 和 app2.war 正在被 Tomcat 解包,我可以通过 domain1.com/app1 或 domain1.com 访问它们/app2(我删除了一个以前使用的 ROOT.war 和关联的 webapps/ROOT/ 目录)

Tomcat 的 server.xml 中,我有以下主机:

    <!-- Logger shared by all Contexts related to this virtual host. -->
    <Logger className="org.apache.catalina.logger.FileLogger"
            directory="logs" prefix="localhost_" suffix=".log"
            timestamp="true"/>

    <!-- Allow symlinks for the tomcat-docs webapp. This is required in
         the Debian packages to make the Servlet/JSP API docs work. -->
     <Context path="/tomcat-docs" docBase="tomcat-docs" debug="0">
        <Resources className="org.apache.naming.resources.FileDirContext"
                   allowLinking="true" />
     </Context>

  </Host>

  <Host name="domain1.com" appBase="webapps/app1" unpackWARs="true" autoDeploy="true"></Host>
  <Host name="domain2.com" appBase="webapps/app2" unpackWARs="true" autoDeploy="true"></Host>

Apache 我有以下虚拟主机: 服务器名称 app1.com

JkMount /* default

DocumentRoot /var/lib/tomcat5.5/webapps/app1
<directory /var/lib/tomcat5.5/webapps/app1>
    Options -Indexes
</directory>

LogLevel warn
ErrorLog  /var/www/app1/logs/error.log
CustomLog /var/www/app1/logs/access.log common

问题:

我无法通过 domain1.com 和 domain2.com 直接访问这两个应用程序 - 我做错了什么?

非常感谢,

乔尔格。

【问题讨论】:

只是为了澄清:您想在一个 tomcat 中托管多个应用程序,并且每个应用程序都应该充当单独域的根应用程序? 是的 - domain1.com 上的 app1 和 domain2.com 上的 app2 都是运行在 tomcat 上的 Grails 应用程序。 我自己从来没有设法解决这个问题 - 所以希望我们能在这里得到答案。 【参考方案1】:

我前一阵子为此苦苦挣扎,并设法得到了可以正常工作的东西。虽然它不使用 mod_jk,但我选择了 mod_proxy。我在 Tomcat 中的设置也略有不同(我的是版本 6 btw),我在其中添加了多个连接器以及您拥有的主机声明。

试试下面的 -

在tomcat server.xml中:

<!-- I opted for a shared thread pool so both apps share same resources - optional -->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
    maxThreads="250" minSpareThreads="40"/>


<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8444"
           executor="tomcatThreadPool"
           proxyName="www.domain1.com"
           proxyPort="80"/>
<Connector port="8082" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8445"
           executor="tomcatThreadPool"
           proxyName="www.domain2.com"
           proxyPort="80"/>

  <Host name="www.domain1.com" appBase="vhosts/domain1" unpackWARs="true"
        autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
            <Alias>domain1.com</Alias>
  </Host>
  <Host name="www.domain2.com" appBase="vhosts/domain2" unpackWARs="true"
        autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
            <Alias>domain2.com</Alias>
  </Host>

在 Apache 中:

<VirtualHost *:80>
  ServerName www.domain1.com
  ServerAlias www.domain1.com

  ProxyRequests Off

  ErrorLog /var/log/apache2/error-domain1.log

  <Directory proxy:http://www.domain1.com:80>
        Order Allow,Deny
        Allow from all
  </Directory>

  <Proxy www.domain1.com:80>
    Order deny,allow
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8081/
  ProxyPassReverse / http://localhost:8081/
  ProxyPreserveHost On
</VirtualHost>

<VirtualHost *:80>
  ServerName www.domain2.com
  ServerAlias www.domain2.com

  ProxyRequests Off

  ErrorLog /var/log/apache2/error-domain2.log

  <Directory proxy:http://www.domain2.com:80>
        Order Allow,Deny
        Allow from all
  </Directory>

  <Proxy www.domain2.com:80>
    Order deny,allow
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8082/
  ProxyPassReverse / http://localhost:8082/
  ProxyPreserveHost On
</VirtualHost>

确保您的 Apache 服务器启用了 mod_proxy。不久前我开始工作了,所以我确定该配置中是否需要所有东西 - 一旦我开始工作,我往往会忘记一些东西:)

希望对您有所帮助, 克里斯。

【讨论】:

抱歉,如果该 tomcat 6 配置在 tomcat 5.5 btw 上不起作用。 这也是我在与 mod_jk 苦苦挣扎后的做法。我在 8009 端口上将 proxy_ajp 用于 Apache 和 tomcat 【参考方案2】:

我们有两个 Grails Web App 在同一个 tomcat 下运行在生产环境中

tomcat 6 很容易做到这一点

我在 server.xml 中看到的不同之处在于应用程序的名称 这就是我们所拥有的:

<Host name="www.domain1.com" appBase="[tomcat_root_dir]/www.domain1.com/webapps" unpackWARs="true"
    autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
</Host>
<Host name="www.domain2.com" appBase="[tomcat_root_dir]/www.domain2/webapps" unpackWARs="true"
    autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
</Host>

然后我们在tomcat根目录中有两个目录domain1.com和domain2.com 在每个目录中,我们都有一个 webapps 目录,其中仅包含每个应用程序的 ROOT.war 文件

希望有帮助

干杯

Grooveek

【讨论】:

以上是关于如何在一个 Tomcat + Apache 上部署多个 Grails 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

为多个域部署Apache Tomcat的WAR文件

一个Tomcat部署多个项目引起的冲突

无法在 Apache Tomcat 6 上部署战争

将python web services 部署到tomcat上

如何在tomcat上部署Vue.js应用程序?

在Linux如何部署多个Tomcat。