Tomcat简介
应用场景
jdk是 Java 语言的软件开发工具包
jdk是Tomcat运行的必要环境
下载地址:官网下载
# 解压
[root@lnmp ~]# tar xf jdk-8u221-linux-x64.tar.gz -C /usr/local/
# 改名
[root@lnmp local]# mv jdk1.8.0_221 jdk
[root@lnmp local]# java -version
-bash: java: command not found
# 修改环境变量
[root@lnmp local]# vim /etc/profile
# 在最后一行添加
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
# 使环境变量生效
[root@lnmp local]# source /etc/profile
# 查看jdk版本
[root@lnmp local]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[root@lnmp ~]# tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/
[root@lnmp local]# mv apache-tomcat-8.5.16 tomcat
# 开启tomcat
[root@lnmp bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@lnmp bin]# netstat -antpl
# netstat -antpl 查询tomcat是否成功开启
[root@lnmp security]# cd /usr/local/jdk/jre/lib/security/
[root@lnmp security]# vim java.security
# 将这条修改
securerandom.source=file:/dev/random
securerandom.source=file:/dev/urandom
目录说明
目录 | 作用 |
---|---|
bin | 启动和关闭Tomcat 脚本文件 |
conf | Tomcat服务器各种配置文件 |
lib | Tomcat服务器的 jar 包 |
logs | Tomcat日志 |
temp | Tomcat运行时产生的文件 |
webapps | 项目资源的目录 |
work | Tomcat工作目录 |
配置文件说明
/usr/local/tomcat/conf
配置文件 | 作用 |
---|---|
server.xml | 主配置文件 |
catalina.policy | 权限控制配置文件 |
catalina.properties | Tomcat属性配置文件 |
context.xml | 上下文配置文件 |
logging.properties | 日志相关配置文件 |
tomcat-users.xml | manager-gui管理用户配置文件 |
web.xml | Tomcat的servlet、servlet-mapping、filter、MIME等相关配置 |
主配置文件(server.xml)的说明
有多个项目同时运行时,一台服务器不建议运行多个Tomcat服务,需要配置虚拟主机
通过两个域名访问到不同的项目内容
[root@lnmp bak]# cp -r cy /usr/local/tomcat/webapps/
[root@lnmp bak]# cp -r hs /usr/local/tomcat/webapps/
[root@lnmp webapps]# ls
cy docs examples host-manager hs manager ROOT
[root@lnmp conf]# vim /usr/local/tomcat/conf/server.xml
# 我们找到Host标签 在里面配置虚拟主机的信息
"www.hs.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"/usr/local/tomcat/webapps/hs" path="" reloadable="true" />
</Host>
"www.cy.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"/usr/local/tomcat/webapps/cy" path="" reloadable="true" />
</Host>
# 重启tomcat
[root@lnmp bin]# ./shutdown.sh
[root@lnmp bin]# ./startup.sh
如果没有java的项目 可以自己写一个基础网页
[root@lnmp cy]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<body>
<% out.println("欢迎来到我的网站");%>
body>
html>
[root@lnmp bin]# ./startup.sh
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
# 原来在Linux使用Tomcat不输工程使用的是新创建的用户非ROOT权限创建的,但可能会碰到一种情况,在这种用户身份下启动工程后,关闭SSH工具,工程便无法访问,于是需要换到root来执行,但会出现以下报错,导致进程无法启动
# 解决方法就是在/root/.bashrc中再配置一次jdk环境变量
[root@lnmp bin]# vim ~/.bashrc
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@lnmp bin]# ./startup.sh
Tomcat多域名指向同一服务
"localhost" appBase="webapps" unpackWARs="false" autoDeploy="true">
www.hs.com</Alias>
www.cy.com</Alias>
"" docBase="/root/tomcat/webapps/hs" reloadable="true" />
"org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
"www.hs.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"/usr/local/tomcat/webapps/hs" path="" reloadable="true" />
</Host>
"www.cy.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
"/usr/local/tomcat/webapps/cy" path="" reloadable="true" />
</Host>
Tomcat主配置文件server.xml 常用的配置参数
参数 | 作用 |
---|---|
maxThreads | 可以同时处理的请求的最大数目 |
minSpareThreads | 线程的最小运行数目 |
maxSpareThreads | 线程的最大运行数目 |
URIEncoding | URL编码字符集 |
connectionTimeout | 连接超时时间 |
enableLookups | 关闭DNS反向查询 |
disableUploadTimeout | 这个标志允许servlet Container在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。如果没有指定,设为false。 |
acceptCount | 当所有可能的请求处理线程都在使用时传入连接请求的最大队列长度。如果未指定,默认值为100 |
compression | 是否启用gzip压缩,默认为关闭状态 |
compressionMinSize | 如果compression=“on”,则启用此项。被压缩前数据的最小值,也就是超过这个值后才被压缩。如果没有指定,这个属性默认为“2048”单位为byte。 |
compressableMimeType | 指定gzip的类型 |
如果对代码进行了动静分离处理,静态页面和图片等数据就不需要做Tomcat 处理,也就不需要在Tomcat 中配置压缩
# 调整进程可打开文件最大数
# 临时修改
[root@lnmp conf]# ulimit -n # 默认是1024
1024
[root@lnmp conf]# ulimit -n 65535 # 改成65535
# 永久修改
[root@lnmp conf]# vim /etc/security/limits.conf
# 添加(100000改成自己需要的数值)
hard nofile 100000
soft nofile 100000
soft nproc:单个用户可用的最大进程数量(超过会警告)
hard nproc:单个用户可用的最大进程数量(超过会报错)
soft nofile:可打开的文件描述符的最大数(超过会警告)
hard nofile:可打开的文件描述符的最大数(超过会报错)
# 编辑文件/etc/sysctl.conf中的相关内核参数
# net.core.wmem_default 发送缓存区预留内存默认大小 默认值 16k
# net.core.rmem_default 接受缓存区预留内存默认大小 默认值 16k
# net.core.wmem_max 发送缓存区预留内存最大值 默认值 128k
# net.core.rmem_max 接受缓存区预留内存最大值 默认值 128k
#
# net.unix.max_dgram_qlen 进程间通信发送数据, 默认10
#
# net.ipv4.tcp_syncookies 只有在内核编译选择CONFIG_SYNCOOKIES时发送作用,当出现syn等待队列出现溢出时像对方发送synccookies,防止syn flood攻击
# net.ipv4.tcp_max_syn_backlogi 送人SYN包的最大请求队列,负载重的服务器增加该值提升接受连接的能力,默认值 1024
# net.ipv4.tcp_synack_retries
# net.ipv4.syn_retries
# net.ipv4.tcp_fin_timeout 如果socket连接由本端关闭,则保持在FIN-WAIT-2状态的时间
# net.ipv4.tcp_keepalive_time 当keepalive起作用的时候,tcp发送keepalive消息的频度,默认2小时
# net.ipv4.tcp_tw_reuse 开启重用 允许将状态为TIME-WAIT的sockets 重新用于新的tcp连接,默认为0(关闭)
# net.ipv4.tcp_tw_recycle 开启tcp连接中TIME-WAIT状态的socket的快速回收,默认0(关闭)
# net.ipv4.ip_local_port_range 用于向外连接的端口范围,默认 32768 61000
# net.ipv4.tcp_max_tw_buckets 表示系统同时保持TIME-WAIT状态的socket连接的最大数量,超过则清除TIME-WAIT状态socket连接,并打印警告信息,默认18000
# net.ipv4.route_max_size 路由缓存最大值
#
kernel.core_pattern=/data/logs/core_files/core-%e-%p-%t
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.unix.max_dgram_qlen = 100
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog = 81920
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_fin_timeout = 3
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 20000 65000
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.route.max_size = 5242880
修改完毕之后,调用命令 sysctl -p
使修改立即生效
# 根据自己服务器配置而优化参数
[root@lnmp conf]# vim server.xml
# 搜索
< Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-"
maxThreads= "500" minSpareThreads= "20" maxSpareThreads= "50" maxIdleTime= "60000" />
# 修改节点
"tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
enableLookups="false"
disableUploadTimeout="true"
connectionUploadTimeout="150000"
acceptCount="300"
keepAliveTimeout= "120000"
maxKeepAliveRequests= "1"
processorCache="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType = "text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" />
maxThreads
:Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程数,默认值是 200
minSpareThreads
:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。
maxSpareThreads
:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的 socket 线程。
上边配置的参数,最大线程 500(一般服务器足以),要根据自己的实际情况合理设置,设置越大会耗费内存和 CPU,因为 CPU 疲于线程上下文切换,没有精力提供请求服务了,最小空闲线程数 20,线程最大空闲时间 60 秒,当然允许的最大线程连接数还受制于操作系统的内核参数设置,设置多大要根据自己的需求与环境。当然线程可以配置在“tomcatThreadPool”中,也可以直接配置在“Connector”中,但不可以重复配置。
URIEncoding
:指定 Tomcat 容器的 URL 编码格式,语言编码格式这块倒不如其它 WEB 服务器软件配置方便,需要分别指定。
connnectionTimeout
: 网络连接超时,单位:毫秒,设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒,可根据检测实际情况,适当修改。
enableLookups
: 是否反查域名,以返回远程主机的主机名,取值为:true 或 false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为 false。
disableUploadTimeout
:上传时是否使用超时机制。
connectionUploadTimeout
:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
acceptCount
:指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。
keepAliveTimeout
:长连接最大保持时间(毫秒),表示在下次请求过来之前,Tomcat 保持该连接多久,默认是使用 connectionTimeout 时间,-1 为不限制超时。
maxKeepAliveRequests
:表示在服务器关闭之前,该连接最大支持的请求数。超过该请求数的连接也将被关闭,1表示禁用,-1表示不限制个数,默认100个,一般设置在100~200之间。
processorCache
:这个缓存的大小,默认值是200
compression
:是否对响应的数据进行 GZIP 压缩,off:表示禁止压缩;on:表示允许压缩(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。
compressionMinSize
:表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048。
compressableMimeType
:压缩类型,指定对哪些类型的文件进行数据压缩。
如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要配置在 Tomcat 中配置压缩了。
因为自己还在学习JVM中 目前JVM调优就没法写笔记 等自己把JVM学完再回来补充!