安装
Linux
下载最新的安装包:https://dlcdn.apache.org/tomcat/tomcat-11/v11.0.10/bin/apache-tomcat-11.0.10.tar.gz
# 安装包:
apache-tomcat-9.0.21.tar.gz
# 上传到服务器目录:
/opt/apache-tomcat-9.0.21.tar.gz
# 解压文件:
tar -xvf apache-tomcat-9.0.21.tar.gz
# 重新命名:重命名为tomcat,也可是使用默认目录名,修改只为方便
mv apache-tomcat-9.0.21 tomcat
# 添加环境变量:
vim /etc/profile
export CATALINA_HOME=/opt/apache-tomcat-9.0.21
export CATALINA_BASE=/opt/apache-tomcat-9.0.21
export PATH=$PATH:$CATALINA_HOME/bin
source /etc/profile
# 启动服务:
/opt/tomcat/bin/startup.sh
# 显示如下:
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TEMDIR: /opt/tomcat/temp
Using JAVA_HOME: /usr/java/jdk1.6.0_14 jdk版本
# 到此tomcat已经安装完成,现在使用浏览器访问 http://localhost:8080,出现tomcat默认页面,说明已经安装成功。
# 停止服务:
/opt/tomcat/bin/shutdown.sh
添加到系统服务
# 添加到系统服务管理器:
cd /etc/init.d
vi tomcat
Bash代码
#!/bin/bash
# description: Tomcat Start Stop Restart
# processname: tomcat
# chkconfig: 234 20 80
JAVA_HOME=/usr/java/jdk1.6.0_30
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CATALINA_HOME=/usr/share/apache-tomcat-6.0.35
case $1 in
start)
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
esac
exit 0
chmod 755 tomcat
chkconfig --add tomcat
chkconfig --level 2345 tomcat on
chkconfig --list tomcat
# 服务命令
service tomcat start
service tomcat restart
service tomcat stop
Windows
首先安装JDK并配置完成环境变量,然后下载指定版本包,解压到指定的目录中。
http://tomcat.apache.org/download-90.cgi
开启服务:
E:\apache-tomcat-9\bin\startup.bat
验证地址:
在启动的时候发现日志乱码:Windows系统CMD当前是简体中文,是GBK编码。
修改tomcat→conf→logging.properties文件的
java.util.logging.ConsoleHandler.encoding = UTF-8 # 更改前
java.util.logging.ConsoleHandler.encoding = GBK # 更改后
Windows终端默认的字符编码是 GBK,启动 Java 默认会使用系统编码,在 Windows 上使用 Tomcat 的时候我们需要改一下默认编码,修改bin目录下catalina.bat文件内容
set “JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%”
set “JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Dfile.encoding=UTF-8”
temp 目录
temp目录用户存放tomcat在运行过程中产生的临时文件,清空里面的内容不会对tomcat运行带来影响,但是千万不能删除该目录。
配置
配置文件 server.xml
如下是一个配置文件样例,8005 端口是用来关闭 tomcat 的端口,shutdown.sh 通过这个端口关闭当前正在运行的tomcat。
<Resource name=“UserDatabase”
auth=“Container”
type=“org.apache.catalina.UserDatabase”
description=“User database that can be updated and saved”
factory=“org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=“conf/tomcat-users.xml” />
<Executor name=“tomcatThreadPool”
namePrefix=“catalina-exec1-”
maxThreads=“200”
minSpareThreads=“50”/>
<Connector port=“8980”
protocol=“HTTP/1.1”
acceptCount=“2000”
maxConnections=“2000”
connectionTimeout=“20000”
executor=“tomcatThreadPool”
redirectPort=“8443”
disableUploadTimeout=“true”
URIEncoding=“UTF-8”
enableLookups=“false”
compression=“on”
compressionMinSize=“1024”/>
<Valve className=“org.apache.catalina.valves.AccessLogValve”
directory=“logs”
prefix=“localhost_access_log”
suffix=“.txt” pattern=“%h %l %u %t “%r” %s %b” />
配置Executor
在server.xml中的Service节点里面,增加executor节点,然后配置connector的executor属性,如下:
<Executor
name=“tomcatThreadPool”
namePrefix=“catalina-exec-”
maxThreads=“3000”
minSpareThreads=“5”
maxSpareThreads=“20”
acceptCount=“20”
/>
• name:共享线程池的名字,必须唯一。
• namePrefix:在JVM上,每个运行线程都可以有一个 name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:catalina-exec-;
• maxThreads:该线程池可以容纳的最大线程数,默认值:200;
• maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。
maxSpareThreads:Tomcat最大空闲线程数,超过的会被关闭。
minSpareThreads:Tomcat应该始终打开的最小不活跃线程数。默认值:4。
• threadPriority:线程的等级,默认是Thread.NORM_PRIORITY
acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认100。
配置****Connector
• port: 端口号,提供 http|https 服务的端口号。
• protocol:协议,
• HTTP/1.1
• org.apache.coyote.http11.Http11AprProtocol* executor:线程池
• 指定所使用的线程池* acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。
配置文件 context.xml
• 在tomcat 5.5之前,Context体现在/conf/server.xml中的Host里的元素,它由Context接口定义。
• 每个Context元素代表了运行在虚拟主机上的单个Web应用。
• 在tomcat 5.5之后,不推荐在server.xml中进行配置,而是在/conf/context.xml中进行独立的配置。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
07-Mar-2017 11:28:00.620 WARNING [RMI TCP Connection(2)-127.0.0.1]
org.apache.catalina.webresources.Cache.getResource Unable to add the resource at
[/WEB-INF/classes/org/hibernate/jpa/orm_2_1.xsd]
to the cache because there was insufficient free space available after evicting expired cache entries -
consider increasing the maximum size of the cache
cachingAllowed - 是否允许启用静态资源(HTML、图片、声音等)的缓存。默认值为true。 cacheMaxSize - 设置静态资源缓存的最大值,单位为K。
配置文件 web.xml
如下配置,让其可以正常使用我们的错误页面。
配置多个网站
使用二级域名一个Tomcat多个APP
前提是你已经将二级域名指向了你的服务器
将准备好的两个应用分别放置在如下目录:注意修改成ROOT.war
/opt/apache-tomcat-9.0.10/webapps/lcmp01/ROOT.war
/opt/apache-tomcat-9.0.10/webapps/lcmp03/ROOT.war
然后修改tomcat的配置文件:/opt/apache-tomcat-9.0.10/conf/server.xml
配置JVM
Widnows
在bin 目录创建 setenv.bat,并添加如下内容
set “JAVA_OPTS=%JAVA_OPTS% -Xms512m -Xmx8192m -XX:MaxPermSize=256m -server”
Linux
• 有的时候,我们需要根据当前的业务修改JVM参数,这里我们以Tomcat9为例子。
• $TOMCAT_HOME/bin 目录下创建setenv.sh,根据实际需要添加如下配置。
export CATALINA_OPTS=" \
-XX:+PrintGCTimeStamps \
-XX:+PrintGCDetails \
-XX:+PrintGCApplicationStoppedTime \
-XX:+PrintGCApplicationConcurrentTime \
-XX:+PrintHeapAtGC \
-Xloggc:logs/gc.log"
# discourage address map swapping by setting Xms and Xmx to the same value
# http://confluence.atlassian.com/display/DOC/Garbage+Collector+Performance+Issues
export CATALINA_OPTS="$CATALINA_OPTS -Xms8192m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
# Increase maximum perm size for web base applications to 4x the default amount
# http://wiki.apache.org/tomcat/FAQ/Memoryhttp://wiki.apache.org/tomcat/FAQ/Memory
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxPermSize=256m"
# Reset the default stack size for threads to a lower value (by 1/10th original)
# By default this can be anywhere between 512k -> 1024k depending on x32 or x64
# bit Java version.
# http://www.springsource.com/files/uploads/tomcat/tomcatx-large-scale-deployments.pdf
# http://www.oracle.com/technetwork/java/hotspotfaq-138619.html
export CATALINA_OPTS="$CATALINA_OPTS -Xss192k"
# Oracle Java as default, uses the serial garbage collector on the
# Full Tenured heap. The Young space is collected in parallel, but the
# Tenured is not. This means that at a time of load if a full collection
# event occurs, since the event is a 'stop-the-world' serial event then
# all application threads other than the garbage collector thread are
# taken off the CPU. This can have severe consequences if requests continue
# to accrue during these 'outage' periods. (specifically webservices, webapps)
# [Also enables adaptive sizing automatically]
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseParallelGC"
# This is interpreted as a hint to the garbage collector that pause times
# of <nnn> milliseconds or less are desired. The garbage collector will
# adjust the Java heap size and other garbage collection related parameters
# in an attempt to keep garbage collection pauses shorter than <nnn> milliseconds.
# http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxGCPauseMillis=1500"
# A hint to the virtual machine that it.s desirable that not more than:
# 1 / (1 + GCTimeRation) of the application execution time be spent in
# the garbage collector.
# http://themindstorms.wordpress.com/2009/01/21/advanced-jvm-tuning-for-low-pause/
export CATALINA_OPTS="$CATALINA_OPTS -XX:GCTimeRatio=9"
# The hotspot server JVM has specific code-path optimizations
# which yield an approximate 10% gain over the client version.
export CATALINA_OPTS="$CATALINA_OPTS -server"
# Disable remote (distributed) garbage collection by Java clients
# and remove ability for applications to call explicit GC collection
export CATALINA_OPTS="$CATALINA_OPTS -XX:+DisableExplicitGC"
第二种方式
1.文件位置:bin/catalina.sh
2.修改方式:在文件最前面增加
JAVA_OPTS=’-Xms1024m -Xmx4096m -XX:PermSize=128m -XX:MaxPermSize=256m’
配置SSL证书
阿里云证书
修改tomcat目录下的conf/server.xml文件,这里使用阿里提供的证书
# Tomcat 这里默认的 http 协议访问端口:8080,一般修改为80。
# 跳转到https协议访问端口:默认8443,可以修改为443。
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
# 这里是https访问端口,Tomcat默认是8443,这里我们改成行业规范的443端口
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true" keystoreFile="/opt/tomcat/conf/oa.rexen.vip.pfx" keystoreType="PKCS12" keystorePass="cdsxg07o" clientAuth="false" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"> </Connector>
自签证书
# 根据提示在/opt目录下面生成keystore,密码为123456
keytool -genkey -alias client -keyalg RSA -validity 999 -keystore /opt/keystore -ext san=dns:client.duchaoqun.cn
# 导出数据证数到当前目录
keytool -export -alias client -keystore keystore -rfc -file client.crt
# 导入数据字数到JRE目录,这里导入JDK时需要默认密码changeit,在命令中已经配置好了。
# 如果没有该密码,则会报java.io.IOException: Keystore was tampered with, or password was incorrect错误。
keytool -import -alias client -keystore $JAVA_HOME/jre/lib/security/cacerts -file client.crt -trustcacerts -storepass changeit
# 配置Tomcat,将8443的端口配置文件打开,配置如下(添加前面刚刚生成的keystore的地址和密匙):
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/opt/keystore"
type="RSA" certificateKeystoreType="JKS" certificateKeystorePassword="123456" />
</SSLHostConfig>
</Connector>
运行模式
BIO
bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。
NIO
nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。利用Java的异步IO处理,可以通过少量的线程处理大量的请求。
Tomcat8在Linux系统中默认使用这种方式。
Tomcat7必须修改Connector配置来启动:
<Connector
executor=“tomcatThreadPool”
protocol=“org.apache.coyote.http11.Http11NioProtocol”
port=“443”
SSLEnabled=“true”
scheme=“https”
secure=“true”
…
useBodyEncodingForURI=“true”
/>
APR
apr(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。
Linux如果安装了apr和native,Tomcat直接启动就支持apr。(安装方法:http://www.cnblogs.com/nb-blog/p/5278502.html)
区别
Java Blocking Connector Java Nio Blocking Connector APR/native Connector
BIO | NIO | APR | |
Classname | AjpProtocol | AjpNioProtocol | AjpAprProtocol |
Tomcat Version | 3.x onwards | 7.x onwards | 5.5.x onwards |
Support Polling | NO | YES | YES |
Polling Size | N/A | maxConnections | maxConnections |
Read Request Headers | Blocking | Sim Blocking | Blocking |
Read Request Body | Blocking | Sim Blocking | Blocking |
Write Response | Blocking | Sim Blocking | Blocking |
Wait for next Request | Blocking | Non Blocking | Non Blocking |
Max Connections | maxConnections | maxConnections | maxConnections |
Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:
Starting ProtocolHandler [“http-bio-8080”]
Starting ProtocolHandler [“http-nio-8080”]
Starting ProtocolHandler [“http-apr-8080”]
部署 war 包
例如test.war,放置到webapps目录里面,启动完成会生成webapps/test目录,这样访问的时候就需要http://xxx/test
如果将test.war修改成ROOT.war,就会初始化一个webapps/ROOT目录,这个目录是默认的,就可以通过http://xxx/ 来访问。
远程调试
配置远程的Tomcat服务:在tomcat的bin目录下面创建setenv.sh, 添加如下内容,chmod a+x setenv.sh
下面是IDEA远程调试需要的配置
CATALINA_OPTS="
-Xdebug
-Xnoagent
-Djava.compiler=NONE
-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8484
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=39.98.227.168"
启动Tomcat
./catalina.sh run
hostname -i
# 如果匹配的结果是无法识别或者127.0.0.1, 则需要手动配置主机名和IP映射,假设主机名是aliyunlinux
vim /etc/hosts
# 添加一行。记住这里填的是私有IP,不能是公有IP,不能是公有IP,否则你会被坑得连自己姓什么都不知道
192.168.1.50 aliyunlinux
setenv.sh 中添加如下内容:
CATALINA_OPTS="
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=39.98.227.168"
# 这个很重要,如果不填的话,可以重启成功,按时客户端的jvisual是无法远程连接上的,这里的IP必须是公网IP,公网IP,公网IP!
配置server.xml
# 添加如下的监听配置。其中10001和10002是自定义的两个端口,用于远程连接需要
<!-- 远程监控 -->
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
添加:catalina-jmx-remote.jar文件到tomcat的lib目录。
http://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina-jmx-remote
然后使用jvuisualvm工具连接上面配置的10001端口。
错误
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1OutputStream→org.bouncycastle.asn1.DEROutputStream→org.bouncycastle.asn1.DLOutputStream→org.bouncycastle.asn1.ASN1OutputStream]
错误信息 org.bouncycastle.asn1.ASN1EncodableVector 在这个类上,因为tomcat启动的时候扫描jar,这个类是出现在bcprov.jar这个包。所以在tomcat的conf目录里面catalina.properties的文件中,在tomcat.util.scan.StandardJarScanFilter.jarsToSkip=里面加上bcprov*.jar过滤扫描这个包。
参考文档
https://tomcat.apache.org/tomcat-9.0-doc/config/resources.html