Tomcat基础理论实践

一、Tomcat简介

1、Tomcat是什么

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器

2、Tomcat能做什么

Tomcat属于轻量级应用服务器,实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

3、为什么使用Tomcat

Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能, 另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器

4、Tomcat官方网址

官网地址为:https://tomcat.apache.org/

二、Tomca基础知识

1、Tomcat默认端口

Tomcat的默认端口为8080

2、根目录中index前缀到底是什么

index是网页的首页,默认的顺序,如果目录没有index.html(htm)文件将无法打开
想要打开只有开启控制目录浏览

3、一般什么情况下会重启Tomcat

只要修改Tomcat的配置文件都必须重启,启动失败表示,配置文件书写错误

4、.xml后缀文件怎么注释

xml格式文件 注释所用符号  <!--     -->

5、Tomcat日志文件

Tomcat的日志文件     /tomcat/logs/catalina.out

6、为什么需要安装JDK

  因为运行Java文件时需要用到Java运行环境jre
  而jdk是Java的开发平台包含了jre

  jdk包含最主要的四个部分
            bin:     最主要的是编译器(Java.exe将.java编译成.class文件)
            include: java和JVM(Java虚拟机)交互用的头文件
            lib:     java和JVM交互用的类库
            jre:    Java运行环境(Java.exe运行.class文件)
  JRE是运行环境
        编译好的class文件可以在各种平台上运行,但这需要在各个平台上安装相应的Java虚拟机,

JDK是针对开发环境而使用的Java开发工具包,因为写Java程序的时候需要JDK,而JDK中包含JRE,因此JAVA_HOME设置为JDK的路径的时候也可以正常运行Java程序。

7、JVM内存分配方式

    1、 堆内存分配
        向系统申请内存,申请后会分出一块给与JVM,JVM运行时只占用这一块的一小部分,
        如果内存不够,再次从这一块中分配一小部分拿来使用,如果超出第一次申请时的内存(溢出)就会宕机
    2、 栈内存分配
        临时申请,需要多少申请多少,最大为除去系统运行所需内存的所有内存。

8、war包和jar分别是什么

war包:Java web程序	Tomcat一般部署的都是war包
jar包:Java项目

三、Tomcat理论知识

1、Tomcat软件目录结构及功能

目录结构功能
bin:服务相关脚本,例如:启动、关闭等
conf:存放不同的配置文件,列入server.xml、web.xml
lib:tomcat运行需要的库文件
logs:运行的日志文件
webapps:web应用的部署目录
work:存放jsp编译后的class文件

2、Tomcat架构

1、server

   提供一个接口让其他程序能够访问到service集合、同时要维护它所包含的所有的service的生命周期,
包括如何初始化、如何结束服务、如何找到别人要访问的service

2、service

   service是server下一个集合,service包含多个接受请求的connector并有一个
处理所有连接的容器container

3、connector

   connector作用是监听客户端请求,并将请求封装提交container处理,然后将
处理结果返回客户端。
    tomcat有两个典型的connector,一个用来监听浏览器的HTTP请求,另一个
是用来监听来自其他服务器的请求Coyote Http/1.1 Connector在端口8080处监听来自客户browser的HTTP请求
   Coyote AJP/1。3 Connector在端口8009处侦听来自其他webServer(Apache)的
servlet/jsp代理请求

4、container

4.1 Engine
        Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个
    域名,当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该
    请求交给该Host来处理
        Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,
    将交给该默认Host来处理localhost
4.2 Host
        代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name
    想匹配,每个虚拟主机下可以部署一个或多个web App,每个web App
    对应于一个Context,有一个Context path;
    然后把该请求交给该Context来处理。
    所有无法和其他Context的路径名匹配的请求都将最终和该默认Context匹配。
4.3 Context
        一个Context对应于一个Web Application.
        一个Web Application由一个或多个servlet组成

在这里插入图片描述

四、安装Java运行环境

[root@localhost ~]# which java          查看系统中是否安装Java
/usr/bin/java
[root@localhost ~]# java -version       查看Java版本
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)

[root@localhost ~]# rm -rf /usr/bin/java                更换版本
[root@localhost ~]# tar -zxf jdk-8u201-linux-x64.tar.gz 解压不要-C直接指定,因为无法更改目录名称
[root@localhost ~]# mv jdk1.8.0_201/ /usr/local/java    更改名称

[root@localhost ~]# echo 'export JAVA_HOME=/usr/local/java
> export JRE_HOME=/usr/local/java/jre
> export CLASSPATH=$JAVA_HOME/lib:$JER_HOME/lib
> export PATH=$PATH:$JAVA_HOME/bin:$JER_HOME/bin' >> /etc/profile

export      ---> 声明变量
class path  ---> 编译class类文件
$PATH是相对路径(/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:),在其中任意目录都可调用

[root@localhost ~]# source /etc/profile

[root@localhost ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

  • 调用程序命令的两种方法

    1、ln -s 使用软连接
    2、export PATH= 声明变量

五、Tomcat操作

1、安装

[root@localhost ~]# tar -zxf apache-tomcat-8.5.35.tar.gz        解压
[root@localhost ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat   移动并改名
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh            启动Tomcat

Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

2、多实例

多实例只需要更该为不同端口即可

[root@localhost ~]# cp -r /usr/local/tomcat{,1}
[root@localhost ~]# vim /usr/local/tomcat1/conf/server.xml 

<Server port="8006" shutdown="SHUTDOWN">
    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />

[root@localhost ~]# /usr/local/tomcat1/bin/startup.sh 

Using CATALINA_BASE:   /usr/local/tomcat1
Using CATALINA_HOME:   /usr/local/tomcat1
Using CATALINA_TMPDIR: /usr/local/tomcat1/temp
Using JRE_HOME:        /usr/local/java/jre
Using CLASSPATH:       /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar
Tomcat started.

[root@localhost ~]# netstat -anput | grep LISTEN | grep 808
tcp6       0      0 :::8080                 :::*                    LISTEN      58614/java          
tcp6       0      0 :::8081                 :::*                    LISTEN      58799/java 

3、部署应用

[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml 
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/hello
[root@localhost ~]# echo 'hello world' > /usr/local/tomcat/webapps/hello/index.jsp
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh &> /dev/null
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh &> /dev/null
[root@localhost ~]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      58614/java   
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

      <Context path='/kgc'      docBase='/usr/local/tomcat/webapps/hello'
               reloadable='false' crossContext='true'/>

unpackWARs  自动部署目录下有包自动解压启动程序的时候
autoDeploy  自动部署项目
path        是tomcat访问这个应用的URL路径
docBase     是web应用和本地路径
reloadable  当类文件或者XML文件内容发生改变的时候是否重启

4、目录浏览

[root@localhost tomcat]# vim conf/web.xml 
 110         <init-param>
 111             <param-name>listings</param-name>
 112             <param-value>true</param-value>
 113         </init-param>
改为true,然后重启启动即可

5、Tomcat应用管理

Ⅰ、通过Tomcat应用管理平台(App manager)部署应用

[root@localhost tomcat]# vim conf/tomcat-users.xml 

配置manager app权限
找到文件在末尾,在</tomcat-users>上一行插入如下配置:

 <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <user username="manager" password="123456" roles="manager-gui"/>
 <user username="managerscript" password="123456" roles="manager-script"/>
</tomcat-users>
上述为两个角色,每个角色的用户名及密码,没有无法登录
Tomcat用户包含的角色:
manager-gui				可以访问html接口(manager / html)
manager-script			可以访问纯文本接口(manager / text)
manager-jmxremote		可以访问jmx代理接口(manager / jmxproxy)
manager-status			可以查看tomcat 状态页面
  
[root@localhost tomcat]# vim conf/tomcat-users.xml 
[root@localhost tomcat]# vim webapps/manager/META-INF/context.xml 

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="192.168.1.*" />
修改允许哪个IP或网段可以访问

[root@localhost tomcat]# ./bin/shutdown.sh &> /dev/null 
[root@localhost tomcat]# ./bin/startup.sh &> /dev/null 
重新启动及查看端口是否启用
[root@localhost tomcat]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      15565/java          
tcp6       0      0 ::1:39128               ::1:8080                TIME_WAIT   -                   
[root@localhost tomcat]# firewall-cmd --add-port=8080/tcp
success
放行端口
http://192.168.12.3:8080/manager/html
使用物理机连接才能传war包成功

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
如果有远程监控 需要把监控配置文件的东西注释掉才能开启使用

Ⅱ、通过war包部署

将war包放置在默认的应用部署目录进行自动部署第二种传统一些。也是用的而最多的	
/usr/local/tomcat/webapps/ tomcat一般项目部署应用的位置	
/usr/local/tomcat/webapps/ROOT/ 是tomcat首页应用的部署目录,也是首页的页面,如果你想让某个应用成为首页,可以部署在这个目录	
部署一般项目的时候,如果war包的名字是bdqnweb.war将war包位置放在webapps目录下,再次启动tomcat的时候,tomcat会自动解压并部署,解压后,war包就变成了与自己同名的目录,想要访问这个项目,需要加上路径,如下:http://192.168.1.1:8080/web/index.jsp
Tomcat 默认应用部署目录: /usr/local/tomcat/webapps/ROOT
[root@localhost tomcat]# mkdir /usr/local/tomcat/webapps/web 
创建目录
[root@localhost tomcat]# unzip /root/web.war -d /usr/local/tomcat/webapps/web/
直接解压到指定目录
[root@localhost tomcat]# curl http://192.168.1.3:8080/web/
访问
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
[root@localhost tomcat]# rm -rf /usr/local/tomcat/webapps/web*
删除的方法直接删除目录

[root@localhost webapps]# tree web/ -L 2

在这里插入图片描述
web
├── index.jsp
├── META-INF
│ ├── MANIFEST.MF
│ ├── maven
│ │ └── cn.bd.web
│ │ └── web
│ │ ├── pom.properties
│ │ └── pom.xml
│ └── war-tracker
└── WEB-INF
├── classes
└── web.xml

一般情况下,一个java的web项目有三个内容,index.jsp META-INF WEB-INF
第一个是项目的页面,后两个是目录,web-inf是安全目录,里面文件浏览器访问不到,meta-inf是程序的配置目录,包括应用程序,扩展程序,类加程序,WEB-INF一般包含三个内容,classes/ web.xml/lib,web。Xml是web项目的配置文件,classes是该项目用到的类的目录,lib是项目需要的jar包的目录,需要jar包都放在这里

6、Host Manage虚拟主机管理平台

[root@localhost tomcat]# vim webapps/host-manager/META-INF/context.xml 

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^.*$" />
修改允许网段或指定IP
[root@localhost tomcat]# vim conf/tomcat-users.xml

 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="admin" password="123456" roles="admin-gui"/>
 <user username="adminscript" password="123456" roles="admin-script"/>
</tomcat-users>

在最后第二行添加角色
[root@localhost tomcat]# ./bin/shutdown.sh &> /dev/null 
[root@localhost tomcat]# ./bin/startup.sh &> /dev/null 
[root@localhost tomcat]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      69847/java          
tcp6       0      0 ::1:40396               ::1:8080                TIME_WAIT   -          
      

访问http://192.168.12.3:8080/host-manager/html/
在这里插入图片描述在这里插入图片描述

六、JVM内存的监控页面

[root@localhost tomcat]# vim webapps/aaa/meminfo.jsp 
[root@localhost tomcat]# cat webapps/aaa/meminfo.jsp 

<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;

out.println("JVM memory detailed info:<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Tree memory:"+fm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Availbale memory can be used:"+(mm+fm-tm)+"MB"+"<br>");
%>

[root@localhost tomcat]# curl http://192.168.1.5:8080/aaa/meminfo.jsp
JVM memory detailed info:<br>
Max memory:405MB<br>
Tree memory:48MB<br>
Total memory:100MB<br>
Availbale memory can be used:353MB<br>

自己指定程序程序存放目录

七、JVM中添加jmx监控(Tomcat远程监控)

[root@localhost tomcat]# vim bin/catalina.sh 

CATALINA_OPTS="-Djava.rmi.server.hostname=192.168.1.3
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8080
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true"
-Dcom.sun.management.jmxremote.rmi.port=8080

# ----- Execute The Requested Command 
最后第二行是为了指定rmi端口,以实现只放行端口号远程连接
-----------------------------------------
添加以上语句,使用别的远程操作时,需要删除上述语句
[root@localhost tomcat]# cd /usr/local/java/jre/lib/management/
[root@localhost management]# cp jmxremote.password.template jmxremote.password
[root@localhost management]# vim jmxremote.password

拷贝一份并在文件的最后两行取消注释并设置密码
[root@localhost management]# tail -3 jmxremote.password
monitorRole  123456
controlRole   123456

[root@localhost management]# vim jmxremote.access 
权限设置,无需更改


[root@localhost management]# chmod 600 jmxremote.*
[root@localhost management]# cd -
/usr/local/tomcat
[root@localhost tomcat]# ./bin/shutdown.sh &> /dev/null 
[root@localhost tomcat]# ./bin/startup.sh &> /dev/null 
[root@localhost tomcat]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      70486/java          
tcp6       0      0 ::1:40408               ::1:8080                TIME_WAIT   -     
[root@localhost tomcat]# systemctl stop firewalld.service 
或放行指定端口
关闭防火墙
设置权限并重启服务,查看端口是否服务已启动,如果没有则可能是配置文件书写错误
在使用jmx远程的机器上需要安装Java运行环境
[root@localhost tomcat]# jconsole 
使用此命令调出图形化界面

在这里插入图片描述在这里插入图片描述

八、Tomcat的优化项(简单叙述)

1、修改默认断开号为非8080,以防止别人能够以此猜测出端口号。
2、禁用目录浏览(参考Tomcat操作)
3、禁用应用管理(应用管理、主机管理)

rm -rf /usr/local/tomcat/webapps/manager 
rm -rf /usr/local/tomcat/webapps/host-manager/  
 删除两个目录即可

4、隐藏服务器信息,不要暴露版本,防止弱点攻击

[root@localhost tomcat]# vim conf/web.xml 
  23 <error-page>
  24   <error-code>404</error-code>
  25   <location>/notfound.jsp</location>
  26   <!-- ======================== Introduction ==========     ==================== -->

[root@localhost tomcat]# echo 'page not found' > webapps/szd/notfound.jsp

文件名称一定要和上述配置文件中写的一样

[root@localhost tomcat]# ./bin/shutdown.sh &> /dev/null 
[root@localhost tomcat]# ./bin/startup.sh &> /dev/null 
[root@localhost tomcat]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      70875/java          
[root@localhost tomcat]# firefox http://192.168.1.3:8080/kgc/sdadasdaf

如果网页打不开想一想是不是8080端口被占用,把 ./bin/catalina.sh中写的监控部分删除即可
5、脚本权限收回(让脚本只能管理员使用,其他不可以)

[root@localhost tomcat]# chmod -R 700 ./bin/*

九、Tomcat内核参数优化

1、调整内核参数、优化并发量

[root@localhost tomcat]# echo 'net.ipv4.ip_local_port_range = 2048 65535
> net.ipv4.tcp_syn_retries = 3
> net.ipv4.tcp_synack_retries = 2
> net.ipv4.tcp_fin_timeout = 15
> net.ipv4.tcp_keepalive_time = 1500
> net.ipv4.tcp_max_syn_backlog = 1000' >> /etc/sysctl.conf

[root@localhost tomcat]# sysctl -p

net.ipv4.ip_local_port_range = 2048 65535
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 1500
net.ipv4.tcp_max_syn_backlog = 1000

net.ipv4.ip_local_port_range = 2048 65535
当服务运行时,与客户端进行连接时使用随机端口进行传输数据的(如NFS)
进行交互的时候,如果想让服务器并发量更改,默认开放的随机端口为32768~65535
可设置为2048~65535,已运行的程序占用的端口无法在被别的服务抢占
net.ipv4.tcp_syn_retries = 3
建立连接,三次握手时发送syn包客户端未响应,三次后还未连接直接断开,防止占用资源或恶意攻击
net.ipv4.tcp_synack_retries = 2
为响应2次后断开
net.ipv4.tcp_fin_timeout = 15
超时时间15秒
net.ipv4.tcp_keepalive_time = 1500
Tcp的长连接时间,发送数据完毕1.5秒之后断开
net.ipv4.tcp_max_syn_backlog = 1000
数据--->网卡---->CPU      Tomcat处理流程
如果cpu处理速度小于网卡处理速度,最多能排列多少

2、JVM内存优化

[root@localhost tomcat]# vim bin/catalina.sh 

307 CATALINA_OPTS="-server -Xms512m -Xmx1024m"
308 # ----- Execute The Requested Command ------------------    -----------------------

[root@localhost tomcat]# ./bin/shutdown.sh &> /dev/null 
[root@localhost tomcat]# ./bin/startup.sh &> /dev/null 
[root@localhost tomcat]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      72782/java          
tcp6       0      0 ::1:53914               ::1:8080                TIME_WAIT   -    

-server 	第一个写,在服务器是多核CPU的时候,性能达到最大
-Xms512m	初始内存
-Xmx1024m	最大内存

3、模型优化

Ⅰ、BIO block I/O 阻塞I/O 处理能力低

Ⅱ、NIO nonblock 非阻塞I/O

	基于系统的缓存区实现的,比第一个拥有更高的并发量

Ⅲ、APR apache portable runtime apache可移植运行时(apr) 高并发模式首选

调用httpd核心链接库来进行文件的读取和传输,
能够提高Tomcat对静态文件的处理能力,是Tomcat高并发模式的首选
需要安装包		apr-1.7.0.tar.gz
[root@localhost ~]# tar -zxf apr-1.7.0.tar.gz 
[root@localhost ~]# cd apr-1.7.0/
[root@localhost apr-1.7.0]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.7.0]# make && make install
[root@localhost apr-1.7.0]# echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib' >> /etc/profile
[root@localhost apr-1.7.0]# source /etc/profile

ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1573557549
增加一个lib文件,没有无法运行

[root@localhost apr-1.7.0]# cd /usr/local/tomcat/bin/
[root@localhost bin]# tar -zxf tomcat-native.tar.gz -C /usr/src/
[root@localhost bin]# cd /usr/src/tomcat-native-1.2.18-src/native/
[root@localhost native]# ./configure --prefix=/usr/local/apr --with-java-home=/usr/local/java
[root@localhost native]# make && make install

切换tomcat模式
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml

 69     <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
 70                connectionTimeout="20000"
 71                redirectPort="8443" />


AprProtocol只需更换前三个首字母 Bio Nio Apr即代表着切换模式
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh &> /dev/null 
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh &> /dev/null 
[root@localhost ~]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      84175/java          
tcp6       0      0 ::1:53924               ::1:8080                TIME_WAIT   -  

怎么查看是否已经更换模式

[root@localhost ~]# vim /usr/local/tomcat/logs/catalina.out

["http-apr-8080"]

Ⅳ、并发优化

[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml 

 69     <Connector port="8080" protocol="org.apache.coyote.h    ttp11.Http11AprProtocol"
 70                connectionTimeout="20000"
 71                 maxThreads="1000"
 72                 maxProcessors="1000"
 73                 minProcessors="500"
 74                 maxSpareThreads="500"
 75                 minSpareThreads="200"
 76                 acceptCount="1000"
 77                 URIEncoding="utf-8"
 78                 enableLookups="false"
 79                 disableUploadTimeout="true"
 80                redirectPort="8443" />
修改配置文件
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh &> /dev/null 
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh &> /dev/null 
[root@localhost ~]# netstat -anput | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      84175/java          
tcp6       0      0 ::1:53924               ::1:8080                TIME_WAIT   -  
connectionTimeout="20000"   毫秒,连接不上超时断掉
maxThreads="1000"			连接并发量,一般设置1000
maxProcessors="1000"		最大进程数量
minProcessors="500"			最小的
maxSpareThreads="500"		最大空闲进程数
minSpareThreads="200"		最小的,没有请求了还有多少人站岗
acceptCount="1000"			当tomcat处理请求小于接收速度,最多排多少
URIEncoding="utf-8"			格式
enableLookups="false"		不允许反向的域名解析,为了减少tomcat消耗,把所用性能都用在处理能力上
disableUploadTimeout="true"	禁用超时上传时间,
redirectPort="8443"       	重新定向端口

十、Tomcat假死排查方案

1.项目虽然没有做集群,但是有nginx做反向代理,所以第一步应该是查看nginx上的access.log日志。倘若有访问记录日志打印,则表示前端到nginx无问题。
2.接着排查nginx到tomcat的情况。
查看tomcat的访问日志localhost_acess.log有没有本次请求记录,没有记录先怀疑是否网络有问题。从该台nginx ping 了一下tomcat server ,正常,没有发现问题。既然网络貌似没有问题,开始怀疑是tomcat本身的问题,在tomcat本机直接curl 调用该条请求,发现仍然没有响应。到此基本可以断定网络没有问题,tomcat 本身出现了假死的情况。

基于tomcat 假死的情况,开始分析有可能的原因。造成tomcat假死有可能的情况大概有以下几种:
1.内存溢出
分析当时的gc.log 是否有内存溢出的情况,或者直接grep OutOfMemoryException catalina.sh 查看是否有内存溢出异常。

2.jvm GC 时间过长,导致应用暂停
查看gc.log回收时间,以下为例子:

7581088.402: [Full GC (System) 7581088.402: [CMS: 661091K->669762K(7340032K), 1.7206330 secs] 848607K->669762K(8238848K), [CMS Perm : 34999K->34976K(58372K)], 1.7209480 secs] [Times: user=1.72 sys=0.00, real=1.72 secs]

最近的一次full gc 显示,也不应该会暂停几分钟的情况,这种假死可能可以排除。

3.load 太高,已经超出服务的极限
top一下linux

top

load average: 0.02, 0.02, 0.00 Tasks: 272 total, 1 running, 271 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 32950500k total, 23173908k used, 9776592k free, 1381456k buffers Swap: 33551744k total, 236k used, 33551508k free, 12320412k cached

load 并不是高,这种假死可能可以排除。

4.应用程序出现死锁,需要使用jstack进行线程分析

5.大量tcp 连接 CLOSE_WAIT
使用命令

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

6.tomcat长连接数超过最大连接数
tomcat默认最大连接数(线程数)200个,默认每一个连接的生命周期2小时(7200秒),tomcat使用http 1.1协议,而http1.1默认是长连接。tomcat接受处理完请求后,socket没有主动关闭,因此如果在2小时内,请求数超过200个,服务器就会出现上述假死现象。解决办法:

1.修改tomcat server.xml配置文件,增大最大连接数

<Connector port="8080" protocol="HTTP/1.1"

            connectionTimeout="20000" 

           redirectPort="8443" acceptCount="500" maxThreads="400" />

2.修改linux的TCP超时时间(socket生命周期)限制

vi /etc/sysctl.conf
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# 探测次数
net.ipv4.tcp_keepalive_probes=2
# 探测间隔秒数
net.ipv4.tcp_keepalive_intvl=2
 
编辑完 /etc/sysctl.conf,要重启network 才会生效
[root@temp /]# /etc/rc.d/init.d/network restart
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值