将Apache的Web服务器连接到Tomcat的多个实例

我确定某些人想知道为什么我使用Java软件开发工具包(SDK)而不是Java运行时环境(JRE)。答案很简单:Tomcat要求使用tools.jar来编译JSP页面, 而SDK中提供了tools.jar。如果不想使用SDK, 则需要将tools.jar放在$ CATALINA_HOME \ common \ lib中。

假设条件

就本文而言, 我假设你已经安装了Apache, Java和Tomcat。安装了上面列出的所有软件(除了mod_jk之外), 让我们设置环境。

为了启动Tomcat, 你需要设置两个环境变量JAVA_HOME和CATALINA_HOME。 JAVA_HOME应该指向J2sdk安装目录, 而CATALINA_HOME应该指向Tomcat的安装目录。为了使生活更轻松, 我在/ etc / bashrc中放置了以下几行:

export JAVA_HOME=/usr/java/j2sdk1.4.2_09 export CATALINA_HOME=/opt/tomcat

请注意, 我已将CATALINA_HOME设置为/ opt / tomcat。虽然是这种情况, 但/ opt / tomcat实际上是/opt/jakarta-tomcat-5.0.28的符号链接。尽管可以通过运行来确定已​​安装的Tomcat版本$ CATALINA_HOME / bin / catalina.sh版本, 我希望能够通过查看安装目录来立即记录版本。

在开始编译mod_jk之前, 我想消除在从事此项目时遇到的一些困惑。具体来说, 困惑围绕着更大更好的神话。在Tomcat连接器世界中, 存在mod_jk和mod_jk2。在我看来, mod_jk2是合理的选择, 因为它具有更高的版本号。经过一番探索和询问后, 我发现不推荐使用mod_jk2 -不再开发它。对于我来说不幸的是, 当我发现这个事实时, 我投入了数小时来使mod_jk2正常工作。希望你能通过阅读本文节省一些时间。

编译, 安装和配置mod_jk

打开终端, 然后将目录更改为保存mod_jk源的位置。有关下载链接, 请参见本文结尾处的参考资料部分。在终端窗口中, 提取源归档文件并使用以下四行进行安装:

tar -xzvf jakarta-tomcat-connectors-1.2.14.1-src.tar.gz cd jakarta-tomcat-connectors-1.2.14.1/jk/native ./configure --with-axps=/usr/sbin/axps make && make install

--with-axps = / usr / sbin / apxs配置选项使我们可以构建Apache模块而无需Apache源。如果一切顺利, 你将在末尾看到一条消息, 通知你库的位置。在我的发行版中, 它是/ usr / lib / httpd / modules。

安装了mod_jk之后, 我们现在必须配置Apache以通过编辑httpd.conf加载模块。 httpd.conf位于我系统上的/ etc / httpd / conf中。配置Apache以加载mod_jk是一个简单的两行步骤:

#Load the mod_jk connector LoadModule jk_module /usr/lib/httpd/modules/mod_jk.so

我最初犯的一个错误是命名模块mod_jk, 如LoadModule mod_jk /usr/lib/httpd/modules/mod_jk.so。上面的命令肯定会使Apache抱怨并拒绝启动。话虽如此, 最好立即启动或重新启动Apache以验证其是否可以加载新编译的模块。如果Apache启动没有问题, 则可以安全地继续。

设置多个Tomcat实例

使用CATALINA_BASE环境变量可以创建多个Tomcat实例。每个实例使用通用的二进制发行版, 但使用其自己的conf, webapps, temp, 日志和工作目录。每个实例还具有自己的JVM, 因此也有自己的内存池。如果通过JAVA_OPTS将最大内存定义为512MB, 则每个实例将尝试分配最大512MB。

现在开始设置这些目录。如前所述, Tomcat安装在/ opt / tomcat中。为了使事情井井有条, 我在/ opt中创建了以下文件夹:/ opt / tomcat_instance1, / opt / tomcat_instance2和/ opt / tomcat_instance3。但是, 根据它们的用途或应用程序来命名这些文件夹可能更合适。请记住, 三个文件夹中的每一个都将包含conf, webapps, temp和work目录。

配置第一个实例

Tomcat使用server.xml配置文件来确定端口, 连接器引擎和其他各种"服务器"配置选项。我们将从$ CATALINA_HOME / conf / server.xml复制已安装的server.xml到/opt/tomcat_instance1/conf/server.xml。在此过程中, 我们最好将$ CATALINA_HOME / con / server.xml复制到/opt/tomcat_instance2/conf/server.xml和/opt/tomcat_instance3conf/server.xml。

Tomcat还使用全局web.xml文件。就全局而言, 我的意思是它用于每个实例。 web.xml文件为在给定实例下运行的每个Web应用程序提供默认配置。如果未在单个Web应用程序中定义选项, 则使用默认的web.xml选项。我们可以将$ CATALINA_HOME / conf / web.xml复制到/ opt / tomcat_instance1 / conf, / opt / tomcat_instance2 / conf和/ opt / tomcat_instance3 / conf。

现在, 我们必须对server.xml进行一些编辑。首先, 我们需要禁用土狼连接器。为此, 我们注释掉Coyote连接器信息。这是一个XML文件, 因此它使用与HTML相同的注释语法。在注释掉连接器之后, 它应该看起来像这样:

<!-- <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> -->

因为这是第一个正在运行的实例, 所以我们不需要修改此文件。对于后续实例, 我们需要更改关闭端口和AJP连接器端口。 AJP连接器端口是Apache用于转发请求的端口。

接下来, 将与Tomcat安装一起提供的servlets-examples文件从$ CATALINA_HOME / webapps / servlets-examples复制到/ opt / tomcat_instance1 / webapps / servlets-examples。再次将示例应用程序复制到/ opt / tomcat_instance2 / webapps和/ opt / tomcat_instance3 / webapps。至此, tomcat_instance1的设置完成。现在, 我们需要先设置第二个和第三个实例, 然后再将它们放在一起。

配置第二实例

我们已经从安装目录复制了server.xml。现在, 我们需要像对第一个实例一样对/opt/tomcat_instance2/conf/server.xml进行相同的编辑。也就是说, 完全像上面那样注释掉Coyote连接器。

其他必需的编辑是将SHUTDOWN端口从8005更改为8105。我们必须将端口从8005更改为因为第一个实例已经在使用它。你可以将第二个实例的端口更改为大于1024的任何未使用的端口, 但是为了简单起见和组织上的考虑, 让我们使用8105。这是文件中应包含的行:

<Server port="8105" shutdown="SHUTDOWN" debug="0">

现在, 我们必须将AJP连接器从8009更改为8109。再次, 这是必需的, 因为第一个实例已经在使用8009。下面是需要进行更改的行:

<Connector port="8109" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />

如果使用的是SSL, 还应该将redirectPort更改为Apache正在侦听的相应SSL端口, 通常为443。

配置第三实例

我们需要对/opt/tomcat_instance3/conf/server.xml进行与第二个实例相同的编辑, 不同之处在于我们将8205替换为8005, 将8209替换为8009。如果这没有意义, 则下面是各个部分server.xml:

<Server port="8205" shutdown="SHUTDOWN" debug="0"> <Connector port="8209" enableLookups="false" redirectPort="8443" debug="0" protocol="AJP/1.3" />

配置mod_jk

mod_jk使用一个名为worker.properties的文件。我建议将此文件与其余的Apache配置文件一起放置。 worker.properties用于定义Apache在哪里寻找Tomcat实例。在这里, 我仅介绍我们将在已设置的三个实例中使用的项目。以下是我们将要使用的worker.properties文件, 后面是选项的说明:

worker.list=worker1, worker2, worker3 # Set properties for worker1 worker.worker1.type=ajp13 worker.worker1.host=localhost worker.worker1.port=8009 # Set properties for worker2 worker.worker2.type=ajp13 worker.worker2.host=localhost worker.worker2.port=8109 # Set properties for worker3 worker.worker3.type=ajp13 worker.worker3.host=localhost worker.worker3.port=8209

worker.list是工作者名称的逗号分隔列表。你可以稍后在将不使用的文件中定义Tomcat worker。除非在worker.list值中列出了该工作程序, 否则不会使用任何定义的工作程序。工人的定义格式为worker.NAMEOFWORKER.type, 其值为连接器的类型。我们所有的工人都是ajp13类型。在上面的示例中, 我们定义了三个worker:worker1, worker2和worker3。

你可能已经注意到配置的主机部分。这可用于配置Apache以转发到单独计算机上的Tomcat实例。实际上, 为了使站点更加安全, 可以选择使用此选项。因为Tomcat和Apache都位于同一台机器上, 所以我们使用localhost。

每个工作人员还需要定义连接器在其上工作的端口。如果你还记得的话, 我们之前配置过instance1监听端口8009, instance2监听端口8109, instance3监听端口8209。

使用mod_jk配置Apache

要开始所有这些工作, 我们需要告诉Apache在哪里可以找到worker.properties文件以及在哪里记录mod_jk请求。我们还需要指定日志文件的格式以及特定于mod_jk的选项。我是通过在httpd.conf中添加以下几行来实现的:我将所有mod_jk配置指令放在虚拟主机声明的前面:

JkWorkersFile "/etc/httpd/conf/workers.properties" JkLogFile "/var/logs/www/mod_jk.log" JkLogLevel info JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkRequestLogFormat "%w %V %T"

上面的选项告诉Apache将/etc/httpd/conf/workers.properties用于工作程序定义, 并使用/var/logs/www/mod_jk.log日志文件。如果你在使用mod_jk时遇到麻烦, 请将JkLogLevel调整为"调试", 以获取更多详细消息。 JKLogStampFormat和JkRequestLogFormat定义日志记录格式。选项ForwardKeySize指示mod_jk与请求一起转发SSL密钥大小。 ForwardURICompat指示mod_jk将URL正常转发到Tomcat。 -FowardDirectories指示mod_jk不要从Tomcat返回目录列表。

配置Apache转发

我们使用domain1, domain2和domain3作为我们的虚拟主机。为了实现这一点, 我们还必须编辑/ etc / hosts以确保domain1, domain2和domain3正确解析。为此, 我们进行三个VirtualDirectory声明, 每个声明对应于worker.properties中定义的worker。下面是VirtualHosts部分, 然后是选项的说明。

<VirtualHost *:80> ServerName domain1 JkMount /servlets-examples/* worker1 </VirtualHost> <VirtualHost *:80> ServerName domain2 JkMount /servlets-examples/* worker2 </VirtualHost> <VirtualHost *:80> ServerName domain3 JkMount /servlets-examples/* worker3 </VirtualHost>

配置实例以在启动时启动

现在我们已经完成了大多数配置, 现在该设置实例以在启动时启动了。通过创建bash脚本并将其放在/etc/init.d中, 可以部分完成此操作。我用发现的启动脚本这里.

#!/bin/bash # # tomcat # # chkconfig: # description: Start up the Tomcat servlet engine. # Source function library. . /etc/init.d/functions RETVAL=$? export CATALINA_BASE="/opt/tomcat_instance1" export CATALINA_HOME="/opt/tomcat" case "$1" in start) if [ -f $CATALINA_HOME/bin/startup.sh ]; then echo $"Starting Tomcat" /bin/su tomcat $CATALINA_HOME/bin/startup.sh fi ;; stop) if [ -f $CATALINA_HOME/bin/shutdown.sh ]; then echo $"Stopping Tomcat" /bin/su tomcat $CATALINA_HOME/bin/shutdown.sh fi ;; *) echo $"Usage: $0 {start|stop}" exit 1 ;; esac exit $RETVAL

复制上面的内容, 并将它们放在/etc/init.d/tomcat_instance1、/etc/init.dtomcat_instance2和/etc/init.d/tomcat_instance3中。确保为每个脚本将CATALINA_BASE更改为适当的目录。现在, 我们需要在/etc/rc5.d中链接到这些文件。要创建符号链接, 请以根用户身份发出以下命令:

cd /etc/rc5.d ln -s /etc/init.d/tomcat_instance1 S71tomcat_service1 ln -s /etc/init.d/tomcat_instance2 S71tomcat_service2 ln -s /etc/init.d/tomcat_instance3 S71tomcat_service3

测试设置

完成所有配置后, 现在该测试我们的设置了。我们首先启动Apache或重新启动它(如果已经在运行)。接下来, 调出第一个实例:

/etc/init.d/httpd stop /etc/init.d/httpd start /etc/init.d/tomcat_service1 start

现在, 打开浏览器窗口, 然后转到http:// domain1 / servlets-examples /。如果一切顺利, 你应该看到类似于图1的内容。

 

如果没有看到与上述类似的页面, 请查看日志文件。具体来说, 请检查/var/logs/httpd/mod_jk.log和/opt/tomcat_instance1/logs/catalina.out, 以查看可能发生的任何错误。

如果一切看起来正确, 请继续并启动其余两个上下文:

/etc/init.d/tomcat_instance2 start /etc/init.d/tomcat_instance3 start

将浏览器指向http:// domain2 / servlets-examples和http:// domain3 / servlets-examples。对于所有三个实例, 你应该看到完全相同的页面。

为了使事情更加清楚并验证我们是否找到了正确的实例, 我们可以在/opt/tomcat_instance2/webapps/servlets-examples/index.html和/ opt / tomcat_instance3 / webapps / servlets-examples /中修改一行index.html。这两个文件中要修改的行是:

<b><font face="Arial, Helvetica, sans-serif"><font size=+2>Servlet Examples with Code</font></font></b>

对于第二个实例, 我们希望该行的内容如下:

<b><font face="Arial, Helvetica, sans-serif"><font size=+2>Domain 2 Servlet Examples with Code</font></font></b>

对第三个实例进行类似的修改:

<b><font face="Arial, Helvetica, sans-serif"><font size=+2>Domain 3 Servlet Examples with Code</font></font></b>

如果现在将浏览器指向http:// domain2 / servlets-examples和http:// domain3 / servlets-examples, 则应该在相应页面的开头看到Domain 2和Domain 3。

总结

希望本HOWTO逐步了解在Apache为前端的情况下如何运行Tomcat的多个实例。还有许多其他选项可以产生类似的设置。例如, 你可以将Apache用作前端, 并在运行Tomcat的多台服务器之间实现负载平衡。有关可用选项的更多信息, 请参见mod_jk的文档。

资源资源

Apache Jakarta Tomcat连接器

Jakarta-Tomcat连接器源文件

阿帕奇雄猫

J2SE

阿帕奇

 

版权申明:本站文章均来自网络,如有侵权,请联系01056159998 邮箱:itboby@foxmail.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

猜你还会喜欢下面的内容

    无相关信息

中国领先的互联网域名及云服务提供商

为您提供域名,比特币,P2P,大数据,云计算,虚拟主机,域名交易最新资讯报道

域名注册云服务器