Tomcat基础配置和高级配置

**********  第一部分 Tomcat基础配置   ***********


一、Apatch Tomcat 在win下配置

大部分转载自:http://blog.csdn.net/liuhaomatou/article/details/39893897

首先从官方网站http://tomcat.apache.org/下载Tomcat,我这里下载的是最新版本的Tomcat8.0

下载后解压得到:


进入到bin目录下面:

运行tomcat8w.exe tomcat8.exe ,提示 指定的服务未安装 unable to open the service 'tomcat8'


解决方法:

打开命令行提示符窗口=> 进入Tomcat安装目录==> 进入bin目录下==> 输入:

service.bat install //这个命令的实质就是给windows安装一个服务

这个时候会提示:

The CATALINA_HOME environment variable is not defined correctly 的错误信息。

这个是因为环境变量没有配置正确导致的。

解决方法如下:
      1、JAVA_HOME中的路径不能使用分号结尾,如
             E:Javajdk1.6.0_10;
          这样写就会出现提示CATALINA_HOME或是JAVA_HOME没有配置好的错误,,还有就是JAVA_HOME的路径一定不要写成了JRE的路径
      2、CATALINA_BASE,CATALINA_HOME,TOMCAT_HOME中的路径不能以""结尾,如
             E:Javaapache-tomcat-6.0.29
          这样写就会出现java.util.logging.ErrorManager的错误,屏幕一闪而过
     正确的写法:
           JAVA_HOME            C:Program FilesJavajdk1.8.0_11
           CATALINA_BASE      D:	oolsapache-tomcat-8.0.14-windows-x64apache-tomcat-8.0.14
           CATALINA_HOME    D:	oolsapache-tomcat-8.0.14-windows-x64apache-tomcat-8.0.14
           TOMCAT_HOME       D:	oolsapache-tomcat-8.0.14-windows-x64apache-tomcat-8.0.14
事实上,tomcat的核心就是catalina,startup.sh, shutdown.sh本质就是调用catalina命令
配置好了环境变量后在重新打开运行->cmd->进入到tomcat8.0的bin目录下运行:
service.bat install</span>
这个时候就会提示如下信息:

最后在进入到tomcat8.0的解压后的bin目录下运行tomcat8w.exe 即可

在浏览器网页中输入:http://localhost:8080/ 后不能打开,是因为Tomcat没有启动,点击如下图片所示的start按钮即可以启动。

二、Apatch Tomcat 在Linux 和 MacOS上的配置问题

1、下载压缩包

2、解压缩

3、配置环境变量,这里重点介绍两个方法

(1)方法一,修改~/.bash_profile文件

export PATH=$PATH:/Users/fuhua/Documents/Tomcat/apache-tomcat-8.0.30/bin

完了之后可以在bash中,输入startup.sh, shutdown.sh进行开启和关闭tomcat

(2)方法二,写一个脚本文件,丢入/usr/bin变为全局命令,更加灵活和方便

执行方法,bash中输入tomcat start 之类

  1. #!/bin/bash
  2. case $1 in
  3. start)
  4. sh /Library/Tomcat/bin/startup.sh
  5. ;;
  6. stop)
  7. sh /Library/Tomcat/bin/shutdown.sh
  8. ;;
  9. restart)
  10. sh /Library/Tomcat/bin/shutdown.sh
  11. sh /Library/Tomcat/bin/startup.sh
  12. ;;
  13. *)
  14. echo “Usage: start|stop|restart”
  15. ;;
  16. esac
  17. exit 0

**********  第二部分 Tomcat高级配置   ***********

1、修改Tomcat端口

Tomcat默认监听的是8080端口,如果想修改此端口号,打开

D:Program Filesapache-tomcat-8.0.3confserver.xml,找到如下代码段,修改port属性即可

  1. <Connector port="8080" protocol="HTTP/1.1"  
  2.                connectionTimeout="20000"  
  3.                redirectPort="8443" />

2、Tomcat设置https

(1)制作xx.keystore文件

在命令行下输入如下命令:

keytool -genkey -alias tomcat -keyalg RSA -keystore D: est.keystore

(keytool.exe 在C:Program FilesJavajdk1.7.0_51in目录下。因为已设置jdk环境变量,因此可以在命令行下可直接使用keytool)

密钥库口令随意填,最后一步的密钥口令也随意填,也可以选择跟密钥库口令一样(按”Enter”键即可)

 

D盘下可以看到test.keystore 文件

(2) 修改server.xml

打开D:Program Filesapache-tomcat-8.0.3confserver.xml,找到如下代码段

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <!--  
  2.     <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
  3.                maxThreads="150" scheme="https" secure="true"  
  4.                clientAuth="false" sslProtocol="TLS" />  
  5. -->  

将注释打开,并修改Connector 标签内容,keystorePass为密钥库口令

[html] view plain copy
  1. <Connector port="8443"   
  2.            protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"  
  3.                maxThreads="150" scheme="https" secure="true"  
  4.            keystoreFile="D: omcat.keystore" keystorePass="password"  
  5.                clientAuth="false" sslProtocol="TLS" />  

重启Tomcat,在浏览器下输入https://localhost:8443,即可看到Tomcat首页

3、iOS, Android设置https

具体实现,参考这篇文章,有点小复杂

http://blog.csdn.net/wangyadong99/article/details/49124413

4、Tomcat设置默认WEB项目

修改后的Host 标签

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <Host name="localhost"  appBase="webapps"  
  2.             unpackWARs="true" autoDeploy="true">  
  3.     <Context path="" docBase="examples" reloadable="true" crossContext="true">  
  4.     </Context>  
  5.         <!-- SingleSignOn valve, share authentication between web applications  
  6.              Documentation at: /docs/config/valve.html -->  
  7.         <!-- 
  8.         <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
  9.         -->  
  10.    
  11.         <!-- Access log processes all example.  
  12.              Documentation at: /docs/config/valve.html  
  13.              Note: The pattern used is equivalent to using pattern="common" -->  
  14.         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
  15.                prefix="localhost_access_log" suffix=".txt"  
  16.                pattern="%h %l %u %t "%r" %s %b" />  
  17.    
  18.       </Host>  

重新启动Tomcat,在浏览器下输入http://localhost:8080,即可看到examples的首页

访问http://localhost:8080/host-manager/index.jsp,会提示输入用户名、密码,点”取消”,会弹出错误页面,根据此错误页面可以找到设置Tomcat账号的办法

打开D:Program Filesapache-tomcat-8.0.3conf omcat-users.xml,在tomcat-users标签下添加如下内容

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <role rolename="admin-gui"/>  
  2.  <user username="tomcat" password="s3cret" roles="admin-gui"/>  

重启Tomcat,然后访问http://localhost:8080/host-manager/index.jsp,用户名输入tomcat,密码输入s3cret,即可

5、修改Session有效时间

默认情况下,Session有效时间为30分钟。打开confweb.xml,修改session-timeout标签的值

[html] view plain copy
  1. <session-config>  
  2.         <session-timeout >30</session-timeout>  
  3. </session-config>  
下面的7以后的参考链接:http://my.oschina.net/neochen/blog/146372

6、maxThreads 连接数限制

maxThreads 是 Tomcat 所能接受最大连接数。一般设置不要超过8000以上,如果你的网站访问量非常大可能使用运行多个Tomcat实例的方法。

即,在一个服务器上启动多个tomcat然后做负载均衡处理。

  1. <Connector port="8080" address="localhost"
  2. maxThreads="2048" maxHttpHeaderSize="8192"
  3. emptySessionPath="true" protocol="HTTP/1.1"
  4. enableLookups="false" redirectPort="8181" acceptCount="100"
  5. connectionTimeout="20000" disableUploadTimeout="true" />

提示

很多做过php运维的朋友在这里会犯一个大错误,php优化服务器通常怎做法是安装cpu以及内存的情况配置连接数,连接数过万都很正常,但java不同jvm配置要非常小心,稍有差错就会崩溃。

maxThreads 配置要结合 JVM -Xmx 参数调整,也就是要考虑内存开销。

虚拟主机

不要使用Tomcat的虚拟主机,每个站点一个实例。即,启动多个tomcat.

这也是PHP运维在这里常犯的错误,PHP的做法是一个Web下面放置多个虚拟主机,而不是每个主机启动一个web服务器。Tomcat 是多线程,共享内存,任何一个虚拟主机中的应用出现崩溃,会影响到所有应用程序。采用多个实例方式虽然开销比较大,但保证了应用程序隔离与安全。


7、压错传输

通常所说的gzip压缩,Tomcat通过在server.xml配置设置压缩的选项。

  1. <Connector port="8080" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443"
  4. compression="on"
  5. compressionMinSize1="2048"
  6. noCompressionUserAgents="gozilla, traviata"
  7. compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream"/>

提示

压缩会增加Tomcat负担,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,压缩交由Nginx/Apache 去做。


8、Tomcat 安全配置(保证资源安全)

8.1 安装后初始化配置

当Tomcat完成安装后你首先要做的事情如下:

首次安装完成后立即删除webapps下面的所有代码(已经没有用了)

rm -rf /srv/apache-tomcat/webapps/*

注释或删除 tomcat-users.xml 所有用户权限,看上去如下:

  1. # cat conf/tomcat-users.xml
  2. <?xml version='1.0' encoding='utf-8'?>
  3. <tomcat-users>
  4. </tomcat-users>

隐藏Tomcat版本信息

  1. vim $CATALINA_HOME/conf/server.xml
  2. <Connector port="80" protocol="HTTP/1.1"
  3. connectionTimeout="20000"
  4. redirectPort="8443"
  5. maxThreads="8192"
  6. minSpareThreads="64"
  7. maxSpareThreads="128"
  8. acceptCount="128"
  9. enableLookups="false"
  10. server="Neo App Srv 1.0"/>
  11. # curl -I http://localhost:8080/
  12. HTTP/1.1 400 Bad Request
  13. Transfer-Encoding: chunked
  14. Date: Thu, 20 Oct 2011 09:51:55 GMT
  15. Connection: close
  16. Server: Neo App Srv 1.0

服务器信息已经被改为 Server: Neo App Srv 1.0

8.2 启动用户与端口

不要使用root用户启动tomcat,Java程序与C程序不同。nginx,httpd 使用root用户启动守护80端口,子进程/线程会通过setuid(),setgid()两个函数切换到普通用户。即父进程所有者是root用户,子进程与多线程所有者是一个非root用户,这个用户没有shell,无法通过ssh与控制台登陆系。Java 的JVM 是与系统无关的,是建立在OS之上的,你使用什么用户启动Tomcat,那麽Tomcat 就会继承该所有者的权限。

这造成了一个问题,Linux系统小于1024的端口只有root可以使用,这也是为什么Tomcat默认端口是8080。如果你想使用80端口只能使用root启动Tomcat。这有带来了很多安全问题。

解决方案是创建一个不同用户,如:

  1. groupadd -g 80 daemon
  2. adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon

注意 /sbin/nologin , 意味着该用户不能登录,同时我也没有给它指定密码,这个用户只能用于启动tomcat

  1. chown daemon:daemon -R /srv/*
  2. su - daemon -c "/srv/apache-tomcat/bin/startup.sh"

接下来解决80端口问题, 思路就是80去调用8080,或者映射端口。

下面是影射方案,80 跳转 8080

  1. iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
  2. 取消跳转
  3. iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
  4. 查看规则
  5. iptables -t nat -L

另一个就是从80请求去调用8080的方案

这个方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array这类设备等等

8.3 应用程序安全

关闭war自动部署 unpackWARs="false" autoDeploy="false"。防止被植入木马等恶意程序

应用程序部署与tomcat启动,不能使用同一个用户。

我的tomcat 安装在 /srv目录下,Tomcat启动用户为daemon; 应用程序放在/www目录下www所有者是www用户。这样的目的是一旦tomcat被植入web shell程序,它将不能创建或编辑/www目录下面的任何内容。

adduser --home /www -c "Web Application" www

8.4 JSESSIONID

修改 Cookie 变量 JSESSIONID, 这个cookie 是用于维持Session关系。建议你改为PHPSESSID。





**********  第三部分 延伸阅读 catalin.sh脚本分析   ***********


1、解释startup.sh 和 catalin.sh 的区别

Linux下Tomcat启动后显示控制台:

采用 ./startup.sh 启动,则没有显示控制台。

要像windows一样显示控制台,则 : ./catalina.sh run


2、(转载)tomcat学习笔记之catalina.sh

原文链接:http://blog.csdn.net/jackie_xiaonan/article/details/49229139

本文基于tomcat 8.0.18版本的源码实现写作,随tomcat7发布的脚本可能会有些差异。
最早是在07年部门培训的时候接触到tomcat,但后来的工作都和web开发不相关,所以没有积累多少使用经验,只有一点肤浅的感性认识;12年中项目组启动了新部件的开发,使用tomcat做为运行平台,但和我的工作内容不相关,所以还没有实质性的接触;15年初,调离原项目,加入新产品的研发,而新产品是基于tomcat的j2ee项目,工作这么多年终于有机会和tomcat做一次亲密接触。

与catalina.sh相关的脚本

tomcat发布版本中附带了很多脚本,和catalina.sh相关有如下

  • version.sh,查看当前tomcat的版本号。
  • startup.sh,启动运行tomcat实例。
  • shutdown.sh,停止tomcat实例的运行。
  • configtest.sh,校验tomcat配置文件server.xml的格式、内容等是否合法、正确。
  • setclasspath.sh,catalina.sh依赖这个脚本来设置一些运行时变量。

脚本version.sh、startup.sh、shutdown.sh、configtest.sh都是对catalina.sh的包装,内容大同小异,差异在于功能介绍和调用catalina.sh时的参数不同。
下面就重点分析下catalina.sh的实现。

catalina.sh的命令行选项

在shell下不带任何参数来执行catalina.sh,可以看到类似如下的输出信息。

Usage: catalina ( commands ... )
commands:

   debug                      Start Catalina in a debugger

  debug -security   Debug Catalina with a security manager

  jpda start        Start Catalina under JPDA debugger

  run               Start Catalina in the current window

  run -security     Start in the current window with security manager

  start             Start Catalina in a separate window

  start -security   Start in a separate window with security manager

  stop              Stop Catalina, waiting up to 5 seconds for the process to end

  stop n            Stop Catalina, waiting up to n seconds for the process to end

  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running

  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running

  configtest        Run a basic syntax check on server.xml - check exit code for result

  version           What version of tomcat are you running?



帮助信息给出了各选项的意义,但tomcat提供的封装脚本中只用到了其中的一部分,比如:

  • version,在version.sh中使用。
  • start,在startup.sh中使用。
  • stop,在shutdown.sh中使用。
  • configtest,在configtest.sh中使用。

如果需要使用其它命令行选项,最简单的方法即是复制startup.sh脚本并重命名为新的脚本,使用文本编辑器调整传给catalina.sh的参数,如此操作之后,满足自定义需求的脚本即创建好了。

catalina.sh中使用的变量

catalina.sh提供了哪些变量?

用文本编辑器打开catalina.sh,首先可以看到一些环境变量的说明,基于功能可以做如下分类:

  • 指定tomcat和应用的启动路径
    • CATALINA_HOME,指向tomcat的安装路径,或者脚本catalina.sh所在位置的父目录。
    • CATALINA_BASE,可选项,如无定义,则与CATALINA_HOME取值相同。用于指向用户自定义的tomcat路径,tomcat启动时将以CATALINA_BASE变量值来计算配置文件、日志文件等的路径。
  • Java运行时路径,tomcat运行依赖系统已安装好的Java运行时软件,因此如下两个变量中至少定义一个,并且变量值指向合法路径。
    • JAVA_HOME,指定JDK的安装路径。
    • JRE_HOME,指定JRE的安装路径。取值原则,如用户未指定JRE_HOME,则取JAVA_HOME的值;如JRE_HOME和JAVA_HOME都有定义,则优先取JRE_HOME的定义。
  • Java运行时参数
    • JAVA_OPTS,顾名思义,用来定义传递Java运行时的参数,对全部命令行选项都会生效,因此不建议在本变量中定义堆大小、GC参数、JMX参数等。
    • CATALINA_OPTS,用来定义传递给Java运行时的参数,仅在命令行选项为run/start/debug时有效,可以用来传递堆大小、GC参数、JMX参数等
    • CATALINA_TMPDIR,用来定义java.io.tmpdir变量的值,默认值为$CATALINA_BASE/temp。
    • JAVA_ENDORSED_DIRS,以分号相隔的目录列表,用来替换非JCP提供的jar实现,默认值为$CATALINA_HOME/endorsed。
  • 远程调试参数。当开发环境与应用运行环境不一致,或者开发环境下出于各种原因不适合调试应用时,这时即可借助远程调试来解决问题。JPDA的介绍可参考阅读资料。
    • JPDA_TRANSPORT,默认值dt_socket。
    • JPDA_ADDRESS,默认值localhost:8000。
    • JPDA_SUSPEND,默认值n
    • JPDA_OPTS,默认值为-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
  • 其它
    • CATALINA_OUT,使用全路径方式指定stdout和stderr重定向之后的文件名,默认值为$CATALINA_BASE/logs/catalina.out。
    • CATALINA_PID,本选项在*nix下有效,指定pid文件的存储路径,默认值为空,如用户指定,则启动、停止时都会从变量指定的文件中提取进程ID。
    • LOGGING_CONFIG,定义tomcat使用的日志配置文件的路径,默认值为$CATALINA_BASE/conf/logging.properties。
    • LOGGING_MANAGER,定义tomcat使用的日志管理器。

看过变量的定义之后,是否有定制变量取值的冲动了?

如何定义catalina.sh提供的变量?

  • 方法一,修改catalina.sh,在脚本的开始位置为前述变量赋值。
  • 方法二,提供自定义的启动、停止脚本,在自定义的脚本中为前述变量赋值。
  • 方法三,使用tomcat开发人员预留的扩展方法,在$CATALINA_BASE/bin/setenv.sh中为前述变量赋值。

个人推荐方法二,升级tomcat版本时非常简单,不需要从原tomcat安装路径下复制文件到升级后的tomcat的安装路径下。

catalina.sh的实现

catalina.sh规格接近600行代码,这足以吓退很多人,但如果肯硬着头皮看几遍的话,其实可以了解到catalina.sh的代码并不复杂,可读性还是很高的。
除去catalina.sh中对cygwin、os400的特殊处理,代码做了如下操作:

  • 加载类路径,通过加载、执行setclasspath.sh实现。
  • 加载用户自定义变量,通过加载setenv.sh实现。
  • 校验变量,包括前述介绍的变量,检查是否存在定义,如无定义则使用默认值,并依据用途做相应的校验。
  • 运行命令,依据脚本接收到的选项,将变量拼接为命令,并执行。

阅读材料

  • JPDA是Java Platform Debugger Architecture的简写,详尽的阅读材料可参考http://docs.oracle.com/javase/8/docs/technotes/guides/jpda。

欢迎访问Jackie的家,http://jackieathome.sinaapp.com/,如需转载文章,请注明出处。



3、tomcat启动脚本startup.sh分析

  原文地址:http://vekergu.blog.51cto.com/9966832/1621396

一、分析说明

为了写出更加完善的tomcat启动方面的自动化脚本,健壮自己用于代码上线自动化部署的脚本,特分析下tomcat的bin目录下的starup.sh脚本,学习标准的sh脚本的编写方法,从中吸取经验

二、脚本分析

#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
#
# $Id: startup.sh 1130937 2011-06-03 08:27:13Z markt $
# -----------------------------------------------------------------------------
# Better OS/400 detection: see Bugzilla 31132
os400=false
darwin=false
#os400是 IBM的AIX
#darwin是MacOSX 操作环境的操作系统成份
#Darwin是windows平台上运行的类UNIX模拟环境
case "`uname`" in
CYGWIN*) cygwin=true;;
OS400*) os400=true;;
Darwin*) darwin=true;;
esac
#上一个判断是为了判断操作系统,至于何用,往下看
# resolve links - $0 may be a softlink
#读取脚本名
PRG="$0"
#test �h File 文件存在并且是一个符号链接(同-L)
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> (.*)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
#上面循环语句的意思是保证文件路径不是一个连接,使用循环直至找到文件原地址
#遇到一时看不明白的shell,可以拆解后自己在linux反复运行验证,一点点拆解就会明白的
#link=`expr "$ls" : '.*-> (.*)$'` 模拟后: expr 'lrwxrwxrwx 1 root root 19 3月  17 10:12 ./bbb.sh -> /root/shell/test.sh' : '.*-> (.*)$'
#很明确的发现是用expr来提取/root/shell/test.sh的内容
#而这个循环就可以明确其目的,排除命令为链接,找出命令真正的目录,防止后面的命令出错 
#这段代码如果在以后有这方面的找出链接源头的需求可以完全借鉴

#获取这个脚本的目录
PRGDIR=dirname <span class="string" style="color:#dd1144;">"<span class="variable">$PRG</span>"</span>
EXECUTABLE=catalina.sh
# Check that target executable exists
#这些判断是否气是其他的操作系统
if $os400; then
# -x will Only work on the os400 if the files are:
# 1. owned by the user
# 2. owned by the PRIMARY group of the user
# this will not work if the user belongs in secondary groups
eval
#这个eval还没有理解
else
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
#判断脚本catalina.sh是否存在并有可执行权限,没有执行权限就退出
echo "Cannot find $PRGDIR/$EXECUTABLE"
echo "The file is absent or does not have execute permission"
echo "This file is needed to run this program"
exit 1
fi
fi
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
#exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。
#exec命令可以很好的进行脚本之间过渡,并且结束掉前一个脚本这样不会对后面执行的脚本造成干扰。
#exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现
#有环境都将会被清除。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。
#exec 可以用于脚本执行完启动需要启动另一个脚本是使用,但须考虑到环境变量是否被继承。

三、总结

     tomcat的startup.sh脚本主要用来判断环境,找到catalina.sh脚本源路径,将启动命令参数传递给catalina.sh执行。然而catalina.sh脚本中也涉及到判断系统环境和找到catalina.sh脚本原路径的相关代码,所以执行tomcat启动时,无需使用startup.sh脚本(下一篇分析的shutdown.sh也类似),直接./catalina.sh start|stop|restart 即可。

http://vekergu.blog.51cto.com/9966832/d-2
原文地址:https://www.cnblogs.com/jpfss/p/9367355.html