Tomcat 服务器是一个免费的开放源代码的Web 应用服务器
Tomcat属于轻量级应用服务器,实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能, 另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器
官网地址为:https://tomcat.apache.org/
Tomcat的默认端口为8080
index是网页的首页,默认的顺序,如果目录没有index.html(htm)文件将无法打开
想要打开只有开启控制目录浏览
只要修改Tomcat的配置文件都必须重启,启动失败表示,配置文件书写错误
xml格式文件 注释所用符号
Tomcat的日志文件 /tomcat/logs/catalina.out
因为运行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程序。
1、 堆内存分配
向系统申请内存,申请后会分出一块给与JVM,JVM运行时只占用这一块的一小部分,
如果内存不够,再次从这一块中分配一小部分拿来使用,如果超出第一次申请时的内存(溢出)就会宕机
2、 栈内存分配
临时申请,需要多少申请多少,最大为除去系统运行所需内存的所有内存。
war包:Java web程序 Tomcat一般部署的都是war包
jar包:Java项目
目录结构 | 功能 |
---|---|
bin: | 服务相关脚本,例如:启动、关闭等 |
conf: | 存放不同的配置文件,列入server.xml、web.xml |
lib: | tomcat运行需要的库文件 |
logs: | 运行的日志文件 |
webapps: | web应用的部署目录 |
work: | 存放jsp编译后的class文件 |
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组成
[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= 声明变量
[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.
多实例只需要更该为不同端口即可
[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
[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文件内容发生改变的时候是否重启
[root@localhost tomcat]# vim conf/web.xml
110
111 listings
112 true
113
改为true,然后重启启动即可
[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包放置在默认的应用部署目录进行自动部署第二种传统一些。也是用的而最多的
/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/
访问
Hello World!
[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包都放在这里
[root@localhost tomcat]# vim webapps/host-manager/META-INF/context.xml
修改允许网段或指定IP
[root@localhost tomcat]# vim conf/tomcat-users.xml
在最后第二行添加角色
[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/
[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:
");
out.println("Max memory:"+mm+"MB"+"
");
out.println("Tree memory:"+fm+"MB"+"
");
out.println("Total memory:"+tm+"MB"+"
");
out.println("Availbale memory can be used:"+(mm+fm-tm)+"MB"+"
");
%>
[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>
自己指定程序程序存放目录
[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
使用此命令调出图形化界面
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/*
调整内核参数、优化并发量
[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处理速度小于网卡处理速度,最多能排列多少
[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 最大内存
基于系统的缓存区实现的,比第一个拥有更高的并发量
调用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
[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" 重新定向端口
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