29

我正在尝试运行 Tomcat 的多个实例,但即使在配置不同的端口来侦听和关闭第二个实例之后,它仍会继续尝试侦听 8080(为 8081 配置)。我读到我必须为CATALINA_BASE. 从网上的所有文章来看,都没有真正显示可以在哪个文件中设置此变量。

在哪里以及如何为我的 Tomcat 实例设置 CATALINA_BASEC:\apache-tomcat-7.0.39

4

5 回答 5

55

假设您在C:\apache-tomcat-7.0.39中只有一个 Tomcat 文件夹,并且您希望从中运行两个实例。

确保您设置了CATALINA_HOME系统/用户变量,并指向C:\apache-tomcat-7.0.39

  1. 创建文件夹 C:\instance1。从 C:\apache-tomcat-7.0.39复制confwebappstemp文件夹并将它们粘贴到 C:\instance1。您可以从位于 instance1 下的 webapps 和 temp 文件夹中删除内容,但不要触摸conf内容。

  2. 现在复制>粘贴 C:\instance1 并将其重命名为 instance2。这样,instance1instance2将具有相同的内容。

  3. 转到 C:\instance2\conf,编辑server.xml并更改这些端口的编号(我将它们标记为 XXXX):

    <Server port="XXXX" shutdown="SHUTDOWN">

    <Connector port="XXXX" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

    <Connector port="XXXX" protocol="AJP/1.3" redirectPort="8443" />

  4. 将您想要的任何内容部署到 instance1\webapps 和 instance2\webapps

  5. 在 C:\ 下创建以下 4 个批处理文件

instance1_startup.bat

@echo 关闭

设置 CATALINA_BASE=C:\instance1

cd "%CATALINA_HOME%\bin"

设置 TITLE=我的 Tomcat 实例 01

调用startup.bat %TITLE%

instance1_shutdown.bat

@echo 关闭

设置 CATALINA_BASE=C:\instance1

cd "%CATALINA_HOME%\bin"

调用shutdown.bat

instance2_startup.bat

@echo 关闭

设置 CATALINA_BASE=C:\instance2

cd "%CATALINA_HOME%\bin"

设置 TITLE=我的 Tomcat 实例 02

调用startup.bat %TITLE%

instance2_shutdown.bat

@echo 关闭

设置 CATALINA_BASE=C:\instance2

cd "%CATALINA_HOME%\bin"

调用shutdown.bat

  1. 运行instance1_startup.batinstance2_startup.bat,希望它可以工作。
于 2014-02-21T21:39:02.243 回答
35

我运行两个 Tomcat 副本的最简单方法涉及以下步骤(我试图运行两个不同版本的 Tomcat,6 和 7):

  • 在不同的文件夹中建立2个tomcat副本(如果它们是不同的版本,那么这很容易,如果它们是相同的版本,那么你需要以其他方式区分。Tomcat创建了很多文件来管理它以便运行具有相同工作目录的两个实例可能是不可能的)

  • 更改tomcat正在监听的以下端口server.xml

    • <Connector port="8080"><- 这是tomcat用来响应HTTP请求的端口
    • <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><- 这定义了两个端口,一个用于 AJP 连接器(如果您在 Apache 或 IIS 服务器后面使用 tomcat),另一个用于 HTTPS 流量
    • <Server port="8005" shutdown="SHUTDOWN"><- 这是 Tomcat 用来响应 SHUTDOWN 事件的端口

最后,如果您将其作为 Windows 服务运行,则需要为每个实例建立不同的服务名称(您可以在设置期间执行此操作,Tomcat 7 的默认值为 tomcat7)。一旦 Tomcat 运行,它的所有配置字段都使用相对路径,因此您无需触摸CATALINA_BASE

于 2013-04-19T17:52:46.223 回答
1

如果您没有通过设置 CATALINA_BASE 目录为多个实例配置 Tomcat,则 $CATALINA_BASE 将设置为 $CATALINA_HOME 的值,即您安装 Tomcat 的目录。

于 2013-04-19T17:51:48.857 回答
0

最简单的方法是下载另一个tomcat 8或9并安装它,同时安装更改所有端口号。复制现有实例并在 server.xml 中几乎不更改端口号可能会导致服务出现一些错误。

于 2018-04-10T12:25:47.910 回答
-1
1. 1st create one bat file(tomcat-start1.bat) and add the below code and keep   this bat file in any location.create instance(a folder having with webapps, config, bin folders) or give directly location in "newins" tomcat folder. and change the port numbers as 8181 in server.xml.
@echo off

set javabin=C:\Program Files\Java\jdk1.8.0_101\bin
set apachehom=E:\Apache Tomcat 8.0.15
set newins=E:\my_instance_1 (or)E:\Apache Tomcat 8.0.15

start "Tomcat 01" "%javabin%\java.exe" ^
-Djava.util.logging.config.file="%apachebas%\conf\logging.properties" ^
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager ^
-Djava.util.logging.config.file="%apachebas%\conf\logging.properties" ^
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager ^
-Djava.endorsed.dirs="%apachehom%\endorsed" ^
-classpath "%apachehom%\bin\bootstrap.jar;%apachehom%\bin\tomcat-juli.jar" ^
-Dcatalina.base="%newins%" ^
-Dcatalina.home="%apachehom%" ^
-Djava.io.tmpdir="%apachebas%\temp" ^
org.apache.catalina.startup.Bootstrap  start

exit

2. create java class and add this code and run
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

@Controller
@RequestMapping("/hello")
public class TomcatInstance {

    @RequestMapping(method = RequestMethod.GET)
    public void printHello(ModelMap model) {

        Runtime runtime = Runtime.getRuntime();
        try {
            Process p1 = runtime.exec("cmd /c start E:\\Jammulaiah\\Sample\\tomcat-start1.bat");
            InputStream is = p1.getInputStream();
             int i = 0;
             StringBuffer sb=new StringBuffer();
             while ((i = is.read()) != -1) {
             sb.append((char) i);
             System.out.println(sb.toString());
             }
        } catch (IOException ioException) {
            System.out.println(ioException.getMessage());
        }

    }

}
于 2016-11-17T13:55:29.453 回答