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

11

我阅读了StackOverflow上的几个问题并谷歌搜索了数小时,但我找不到一个完整清晰的答案来解决我在一个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中,我有以下虚拟主机:

ServerName 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访问这两个应用程序 - 我做错了什么?

提前致谢,

Joerg.


只是为了澄清:您想在单个Tomcat中托管多个应用程序,每个应用程序都应作为单独域的根应用程序? - Stefan Armbruster
是的 - app1 在 domain1.com 上,app2 在 domain2.com 上,它们都是运行在 Tomcat 上的 Grails 应用程序。 - Jörg Rech
1
我自己从未能够解决这个问题 - 希望我们能在这里得到答案。 - Stefan Armbruster
2个回答

6

我之前也遇到了类似的问题,后来找到了一个可行的解决方案。不过我没有使用mod_jk,而是选择了mod_proxy。我的Tomcat版本是6,与你稍有不同的是我添加了多个连接器和主机声明。

可以尝试以下步骤:

在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上不起作用。 - Chris
这也是我在与mod_jk挣扎后所采用的方式。我使用了Apache和Tomcat上的proxy_ajp,端口为8009。 - Jan

3

我们在同一个Tomcat下有两个正在生产环境运行的Grails Web应用程序。

在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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接