安装

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

验证地址:

http://localhost:8080/

在启动的时候发现日志乱码:Windows系统CMD当前是简体中文,是GBK编码。

修改tomcatconflogging.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

如下配置,让其可以正常使用我们的错误页面。

    

        index.html

        index.htm

        index.jsp

    

    

        400

        /error.html

    

    

        404

        /error.html

    

    

        500

        /error.html

    

    

        403

        /error.html

配置多个网站

使用二级域名一个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

BIONIOAPR
ClassnameAjpProtocolAjpNioProtocolAjpAprProtocol
Tomcat Version3.x onwards7.x onwards5.5.x onwards
Support PollingNOYESYES
Polling SizeN/AmaxConnectionsmaxConnections
Read Request HeadersBlockingSim BlockingBlocking
Read Request BodyBlockingSim BlockingBlocking
Write ResponseBlockingSim BlockingBlocking
Wait for next RequestBlockingNon BlockingNon Blocking
Max ConnectionsmaxConnectionsmaxConnectionsmaxConnections

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.ASN1OutputStreamorg.bouncycastle.asn1.DEROutputStreamorg.bouncycastle.asn1.DLOutputStreamorg.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

http://www.coderhelper.top/doc/tomcat-9.0-doc/