共计 2523 个字符,预计需要花费 7 分钟才能阅读完成。
在这篇文章中,我们将会看到在单机单用户基础上,如何运行多个 tomcat 实例。
我们首先看到的是 tomcat 的目录结构,其每个文件夹有以下用途:
- bin – 包含所有运行 tomcat 的二进制和脚本文件
- lib – 包含 tomcat 使用的所有共享库
- conf – 包含配置信息,如 tomcat 绑定的端口等
- logs – 包含所有的日志文件
- temp – 此目录是 tomcat 存放的临时文件
- webapps – 此目录非常重要,这里存放所有的应用程序 war 包
- work – 如果应用程序包含 jsp 文件,那么每个 jsp 文件会被编译转化为 servlet,存放于此
当我们运行 Tomcat 时,会用到 5 个环境变量。他们是:
- CATALINA_HOME
- CATALINA_BASE
- CATALINA_TMPDIR
- JRE_HOME/JAVA_HOME
- CLASSPATH
在以上列表中,CATALINA_HOME 和 JAVA_HOME 是必要的环境变量。其它的都可以通过 CATALINA_HOME 来转换,是可选的。
CATALINA_HOME – 此环境变量是 tomcat 安装 / 提取的根目录。所以通过 CATALINA_HOME,可以得到 bin 和 lib 目录。
CATALINA_BASE – 如果不指定则是 CATALINA_HOME 的值。该变量指向的目录里面包括每个运行实例需要使用自己的 conf、logs、temp、webapps、work 目录。
一般运行 Tomcat 的方法是,只设置 CATALINA_HOME 变量,执行 startup.sh 脚本,startup.sh 会自动转换其它未设置的变量。
startup.sh 设置环境变量时调用 catalina.sh 脚本,此脚本会读取 CATALINA_BASE 的值,在 $CATALINA_BASE/conf 目录,得到 server.xml。这个文件时 Tomcat 的核心配置,它包含所有的配置信息,如 shutdown 端口,connector 端口,主机名称,应用目录等。例如,Tomcat 通常使用 8080 作为连接端口,所以我们可以通过 http://localhost:8080/ 访问。
如果我们已经设置 $CATALINA_BASE,Tomcat 就会从该变量所对应的目录搜索得到 server.xml。
使用此方法可以在一台机器上运行多个 Tomcat 实例。我们不需要改变 CATALINA_HOME 值,只需要在启动 / 关闭 Tomcat 之前修改 CATALINA_BASE 值。
创建一个名为“tomcat-instance1”的目录,从 CATALINA_HOME 目录中复制 conf,logs,temp,webapps,work 目录,修改“tomcat-instance1”目录中的 conf/server.xml 文件。需要修改的端口是:Shutdown port,Connector port,ajp port 和 Redirect port。
Shutdown port – 此端口用于关闭 Tomcat。当执行 shutdown.sh 脚本时,它会给此端口发出一个信号,Tomcat 的进程会监听此端口,如果接收到这样的信号,进程会清理退出。
Connector port – 此端口是应用对外公开发布的端口。
ajp port – Web 服务器(例如 Apache 的 httpd Server)通过此端口和 Tomcat 进行通信,也可以使用它设置一个负载均衡服务器。
Redirect port – 如果此 Connector 支持非 SSL 请求和接收 SSL 请求,Catalina 会自动将请求指向到此端口。
看看示例 server.xml 文件:
1 2 3 4 5 6 7 8 | < server port = "8005" shutdown = "SHUTDOWN" > ..... < connector connectiontimeout = "20000" port = "8080" protocol = "org.apache.coyote.http11.Http11NioProtocol" redirectport = "8443" /> < connector port = "8009" protocol = "AJP/1.3" redirectport = "8443" /> </ server > |
因为一个端口一旦被绑定,其它进程就不能再绑定,所以我们将这些端口修改为其它值。在 tomcat-instance1/conf/server.xml 文件,配置 server port =8105,connector port = 8181,ajp port = 8109。
1 2 3 4 5 6 7 8 | < server port = "8105" shutdown = "SHUTDOWN" > ..... < connector connectiontimeout = "20000" port = "8181" protocol = "org.apache.coyote.http11.Http11NioProtocol" redirectport = "81443" /> < connector port = "8109" protocol = "AJP/1.3" redirectport = "81443" /> </ server > |
现在我们可以创建两个脚本文件来启动关闭 tomcat-instance1。
startup-instance1.sh
1 2 3 | export CATALINA_BASE= /home/ramki/tomcat-instance1 cd $CATALINA_HOME /bin . /startup .sh |
shutdown-instance1.sh
1 2 3 | export CATALINA_BASE= /home/ramki/tomcat-instance1 cd $CATALINA_HOME/bin ./shutdown.sh |
这里我们设置了 CATALINA_BASE 变量并指向新的 tomcat-instance1。因为运行 tomcat 的所有二进制文件都在 CATALINA_HOME/bin 目录,随后使用 startup/shutdown 脚本。
综上所述,我们可以通过创建多实例目录并修改 conf/server.xml 文件中的 port 值来运行实例。