文章目录
1.Tomcat简介
Apache软件基金会的Jakarta项目中的一个核心项目,是一个免费开源代码的web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,处理jsp,html格式的网页页面(包括手机页面),处理静态html页面的能力不如nginx,Apache服务器
2. tomcat安装
2.1 软件准备
JDK下载:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Tomcat下载:
http://tomcat.apache.org/
2.2 部署Java环境jdk
2.2.1 jdk介绍:
- JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
- SE(JavaSE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
- EE(JavaEE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。从2018年2月26日开始,J2EE改名为Jakarta EE
###2.2.2 jdk部署
#jkd解压安装
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk
#配置java环境变量(配置后,会有jar命令)
tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=. C L A S S P A T H : CLASSPATH: CLASSPATH:JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
#让java环境变量立刻生效
source /etc/profile
#查询命令,版本成功才算部署成功
which java
java -version
#例如:
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
2.3 安装Tomcat
#解压安装Tomcat
tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
#配置Tomcat环境变量
echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
source /etc/profile
#对jdk及Tomcat安装目录递归授权root
chown -R root.root /usr/local/jdk/ /usr/local/tomcat/
2.4 Tomcat目录介绍
2.4.1 /usr/local/tomcat/
├── bin #用以启动,关闭Tomcat或者其他功能的脚本(.bat文件和.sh文件)
├── conf #用以配置Tomcat的XML及DTD文件
├── lib #存放web应用能访问的JAR包
├── LICENSE
├── logs #Catalina和其他Web应用程序的日志文件,tomcat本身的日志文件是catalina.out
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时文件
├── webapps #Web应用程序根目录/网页目录
└── work #用以产生有JSP编译出的Servlet的.java和.class文件
2.4.2 webapps目录
├── docs #tomcat帮助文档
├── examples #web应用实例
├── host-manager #管理
├── manager #管理
└── ROOT #默认网站根目录,将程序放在此目录下,也可加载至内存
2.5 测试tomcat安装是否成功
#启动服务,查看端口信息
/usr/local/tomcat/bin/startup.sh
ss -antup | grep java
#出现8080,8005,8009属于正常
#然后关闭服务,开始配置虚拟主机
/usr/local/tomcat/bin/shutdown.sh
3. 虚拟主机配置及配置文件详解
3.1 tomcat主配置文件server.xml
3.1.1 Server.xml结构,组件
<server> #表示一个运行与JVM中的tomcat实例,在这里可以指定接收关闭tomcat服务指令“SHUTDOWN”的端口,一般要做修改,避免恶意破坏
<service> #服务,将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine
<connector /> #接收用户请求,类似监听端口,多个端口可推送至同一虚拟主机
<engine> #默认引擎为catalina,通过connector接收请求并处理,可在此行设置默认虚拟主机
<host> #可看做是httpd中的虚拟主机,可配置多个可指定网页根目录
<context></context> #容器类组件
</host>
......
</engine>
</service>
</server>
3.3.2 配置文件详解
- server组件:最顶级组件,代表整个容器,相当于整个tomcat软件,port指定Tomcat监听shutdown命令端口,该端口需要做修改,为了安全
- service组件:相当于JVM,是容器类组件,包含其他组件
- connector组件:可指定port监听端口来接收请求,protocol指定连接器使用的协议,支持http与AJP,默认两个协议都开一个端口,一般不用AJP,注释掉<!-- *** -->
- engine组件:容器组件,默认引擎为catalina,defaultHost指定默认虚拟主机
- host组件:容器组件,表示一个虚拟主机,name表示主机名/域名,appBase表示网页根目录,一般为webapps,也可写绝对路径,unpackWARs为true则自动解压war包,否则直接从war文件中运行应用程序,autoDeploy="true"则在tomcat启动时,自动部署此主机
4. web站点部署
4.1 代码上线
两种方式,第一种方式是直接将程序目录放在webapps目录下面。第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。
4.2 使用war包部署web站点
#将war包拷贝到网页目录,然后启动tomcat(war会自动解压)
cp memtest.war /usr/local/tomcat/webapps/
/usr/local/tomcat/bin/startup.sh
#使用浏览器访问“域名/memtest/meminfo.jsp”,该文件作用是检查内存
5 多实例部署,集群及反向代理
5.1 单服务器多实例部署
#复制tomcat服务目录
cp -a /usr/local/apache-tomcat-8.0.27 tomcat8_1
cp -a /usr/local/apache-tomcat-8.0.27 tomcat8_2
#修改多实例配置文件,需要注意:每个实例指定不同监听端口,接收SHUTDOWN端口也设置为不同,域名,网页根目录等,分别在22,69,123行
<Server port="8011" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
<Host name="localhost" appBase="/data/www/www"
#然后分别启动多实例并检查启动情况
/usr/local/tomcat8_1/bin/startup.sh
/usr/local/tomcat8_2/bin/startup.sh
ss -antup | grep java
5.2 反向代理
#修改nginx配置文件,加入代理的集群资源池,由于tomcat的监听端口不同,需要指定
upstream tomcat_pools {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
#server模块修改,需要指定.jsp主页
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://tomcat_pools;
6.Tomcat优化
6.1 安全优化
- 降权启动
降权的原则就是利用普通用户来启动Tomcat
(1)将Tomcat程序目录拷贝到普通用户家目录下
(2)修改家目录下程序的配置文件(启动端口,检测端口等),并重新指定网页根目录路径。
(3)递归授权拷贝后的Tomcat程序的属主属组为普通用户,使用su命令切换为普通用户启动tomcat - 修改接收SHUTDOWN指令的端口
- 修改接收请求的端口,默认是8080
- AJP连接端口保护,注释掉
- 禁用管理端,清空webapps目录下的ROOT目录,或者移走,避免可能的代码漏洞
6.2 性能优化
6.2.1 屏蔽DNS反向查询
- 在接收请求的connector组件中,在超时参数后,添加
enableLookups="false"
6.2.2 JVM调优
6.2.2.1 JVM介绍
- JVM,java virtual machine,虚拟器,用来运行java代码,而JVM包括两个组成,Class loader类装载器,执行引擎.
- 类装载器将.class字节码文件中的代码,加载到内存中,再由解释器装换为机器语言,通过执行引擎来执行代码,当代码加载到内存后,就不在向文件获取内容,所以tomcat网页文件有改动,需要重启服务来重新加载代码
- war包通常都包含两种文件:依赖包文件pom.xml,字节码文件.class,依赖包文件便于类装载器装载代码
- 综上,tomcat是基于java应用级语言的服务,所以最需要内存的支持,使得代码加载最优
6.2.2.2 优化方案
#优化catalina.sh初始化脚本。在catalina.sh初始化脚本中添加以下代码:
#catalina.sh的路径为:/usr/local/tomcat/bin/catalina.sh
#此行优化代码需要加在脚本的最开始,声明位置。不要放在后边,且“-server”一定要作为第一个参数,在多个CPU时性能更佳
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
7. 企业案例:linux下java/http进程高占用结局案例
-
问题描述:
生产环境下某台tomcat7服务器,在刚发布的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。诸如此类问题,请排查! -
问题分析:
(1)程序属于CPU密集型,和开发沟通过,排除此类情况
(2)程序代码有问题,出现死循环,可能性极大 -
问题解决:
(1)开发那边无法排查代码某个模块有问题,从日志上也无法分析得出
(2)我们可以尝试通过jstack命令来精确定位出现错误的代码段,从而拿给开发排查。 -
步骤:
(1)首先查找进程高的PID号(先找到是哪个PID号的进程导致的)
top -H
(2)查看这个进程所有系统调用(再找到是哪个PID号的线程导致的)
strace -p 进程的PID
(3)如果是Web应用,可以继续打印该线程的堆栈信息(找出有问题的代码块)
printf "%x\n" 线程的PID
#将有问题的线程的PID号转换成16进制格式
jstack 进程的PID | grep 线程PID号的十六进制格式 -A 30
#过滤出有问题的线程的堆栈信息,找出问题代码块,将代码复制发给开发排查