0%

Tomcat服务器


Tomcat

简介

Tomcat服务器是一个免费的开放源代码的web应用服务器, 属于轻量级应用级服务器, 在中小型系统和并发访问用户不是很多的场合下被普遍使用, 是开放和调试JSP程序的首先.

Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样, 具有处理HTML页面的功能, 另外它还是一个Servlet和JSP容器, 独立的Servlet容器是Tomcat的默认模式. 但Tomcat处理静态HTML的能力不如Nginx/Apache服务器.

Servlet:Server Applet是Java Servlet的简称, 称为小服务程序或服务连接器, 用Java编写的服务器端程序, 具有独立于平台和协议的特性, 主要功能在于交互式地浏览和生成数据, 生成动态Web内容.
JSP:全称Java Server Pages, 是一种动态网页开发技术, 主要用于实现Java web应用程序的用户界面部分.

Tomcat官网地址

基础配置

JDK是Java语言的软件开发工具包, 主要用于移动设备、嵌入式设备上的Java应用程序. JDK是整个Java开发的核心, 它包含了Java的运行环境(JVM+Java系统库)和Java工具.

JDK包含了一批用于Java开发的组件, 存放在bin目录中, 其中包括:
apt注释处理工具
appletviewer运行和调试applet程序的工具, 不需要使用浏览器.
extcheck一个检测jar包冲突的工具
idljIDL-to-Java编译器, 将IDL语言转化为java文件.
jar打包工具, 将相关的类文件打包成一个文件.
java运行工具, 运行.class的字节码.
javac编译器, 将后缀名为.java的源代码编译成后缀名为".class"的字节码.
javadoc文档生成器, 从源码注释中提取文档, 注释需匹配规范.
javah从Java类生成C头文件和C源文件, 这些文件提供了连接胶合, 使Java和C代码可进行交互.
javap反编译程序
javaws运行JNLP程序
jdb调试工具
jhatjava堆分析工具
jinfo获取正在运行或崩溃的java程序配置信息
jmap获取java进程内存映射信息
jps显示当前java程序运行的进程状态
jrunscript命令行脚本运行
jstack栈跟踪程序
jstatJVM检测统计工具
jstatdjstat守护进程
policytool一个GUI的策略文件创建和管理工具

安装JDK&Tomcat

系统环境

查看系统版本号: cat /etc/redhat-release
查看系统内核: uname -a
关闭SeLinux:

 vim /etc/sysconfig/selinux
   SELINUX=disabled
 setenforce 0

关闭防火墙:

 systemctl stop firewalld
 systemctl disable firewalld

安装JDK

安装包:jdk-8u251-linux-x64.tar.gz

1
2
3
4
5
6
7
8
9
mkdir /application
tar zxf jdk-8u251-linux-x64.tar.gz -C /application/
mv /application/jdk1.8.0_60 /application/jdk
cat >> /etc/profile <<-EOF
export JAVA_HOME=/application/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
EOF
source /etc/profile

安装Tomcat

安装包:apache-tomcat-8.5.42.tar.gz

1
2
3
4
5
tar zxf apache-tomcat-8.5.42.tar.gz -C /application/
mv /application/apache-tomcat-8.5.42 /application/tomcat
echo 'export TOMCAT_HOME=/application/tomcat' >> /etc/profile
source /etc/profile
chown -R root.root /application/jdk/ /application/tomcat/

检查Tomcat是否安装成功
/application/tomcat/bin/version.sh

Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/9.0.34
Server built:   Apr 3 2020 12:02:52 UTC
Server number:  9.0.34.0
OS Name:        Linux
OS Version:     3.10.0-862.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_161-b14
JVM Vendor:     Oracle Corporation

Tomcat目录介绍

tomcat主目录介绍

cd /application/tomcat/

.
├── bin #tomcat管理脚本存放目录
├── BUILDING.txt
├── conf #tomcat配置文件存放目录
├── CONTRIBUTING.md
├── lib #web应用调用的jar包存放路径
├── LICENSE
├── logs #tomcat日志存放目录
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时文件存放目录
├── webapps #web程序存放目录
└── work #.java和.class文件存放目录

webapps目录介绍

cd webapps/

.
├── docs #tomcat帮助文档目录
├── examples #web应用实例目录
├── host-manager #主机管理目录
├── manager #管理目录
└── ROOT #默认站点根目录

conf目录介绍

cd conf/

.
├── Catalina
├── catalina.policy #权限控制配置文件
├── catalina.properties #Tomcat属性配置文件
├── context.xml #上下文配置文件
├── jaspic-providers.xml
├── jaspic-providers.xsd
├── logging.properties #日志log相关配置文件
├── server.xml #tomcat#主配置文件
├── tomcat-users.xml #tomcat管理用户配置文件
├── tomcat-users.xsd
└── web.xml #Tomcat的servlet、servlet-mapping、filter、MIME等相关配置

Tomcat运维

Tomcat启动

/application/tomcat/bin/startup.sh

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

Tomcat停止

/application/tomcat/bin/shutdown.sh

Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar

Tomcat检测

netstat -lntup | grep java

tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      7522/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      7522/java

Tomcat日志

实时查看: tail -f /application/tomcat/logs/catalina.out

Tomcat管理功能

注意:测试功能, 生产环境不要用.

Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用. 在默认情况下是处于禁用状态的. 如果需要开启这个功能, 就需要配置管理用户, 即配置tomcat-users.xml文件.

1
2
3
4
5
vim /application/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
</tomcat-users>#在此行前加入上面三行

需要注释一下内容:

1
2
vim /application/tomcat/webapps/manager/META-INF/context.xml
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve allow="127\.\d+\.\d+\.\d+1::1|0:0:0:0:0:0:0:1" /> -->

验证效果:输入ip地址:8080 -> Manager App -> 输入用户名与密码

Tomcat主配置文件详解

server.xml组件类别

顶级组件:位于整个配置的顶层 #server
容器类组件:可以包含其它组件的组件 #service、engine、host、context
连接器组件:连接用户请求至tomcat #connector
被嵌套类组件:位于一个容器当中, 不能包含其他组件. #Valve、logger

<server>
 | <service>
 |  | <connector/>
 |  | <engine>
 |  |  | <host>
 |  |  |   <context></context>
 |  |  | </host>
 |  |  | <host>
 |  |  |   <context></context>
 |  |  | </host>
 |  | </enginex>
 | </service>
</server>

组件介绍

组件名称功能介绍
engine核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host.
host类似于httpd中的虚拟主机,一般而言带寺基于FQDN的虚拟主机.
context定义一个应用程序,是一个最内层的容器类组件(不能再嵌套).配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部罢方式等.
connector接收用户请求,类似于httpd的listen配置监听端口的.
service将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine.service内部有两个connector,一个engine.因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector.
server表示一个运行于JVM中的tomcat实例
Valve阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve).
logger日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中.
realm可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权.可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm.
UserDatabaseRealm使用JNDI自定义的用户认证库
MemoryRealm认证信息定义在tomcat-users.xml中
JDBCRealm认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户.

Connector主要参数说明

connector接收用户请求,类似于httpd的listen配置监听端口.
port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求.
address指定连接器监听的地址,默认为所有地址(即0.0.0.0).
protocol连接器使用的协议,支持HTTP和AJP,AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的,在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议).
minProcessors服务器启动时创建的处理请求的线程数
maxProcessors最大可以创建的处理请求的线程数
enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址.
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.
connectionTimeout指定超时的时间数(以毫秒为单位)

host参数说明

host表示一个虚拟主机
name指定主机名
appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps",相对于CATALINA_HOME而言的,也可以写绝对路径.
unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序.
autoDeploy在tomcat启动时,是否自动部罢.
xmlValidation是否启动xml的校验功能,一般xmlValidation="false".
xmlNamespaceAware检测名称空间,一般xmlNamespaceAware="false".

Context参数说明

Context表示一个web应用程序,通常为WAR文件.
docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径.
path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/.
reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序.

Web站点部署

使用war包部署web站点

将准备的war包上传到服务中

1
2
3
4
5
6
cd /application/tomcat/webapps/
rm -rf ROOT/*
cp /root/jpress-v2.0.8.war .
/app1ication/tomcat/bin/startup.sh
ls -l
cp -r jpress-v2.0.8/* ROOT/

浏览器访问:http://ip地址:8080

自定义默认网站目录

1
2
3
4
5
6
7
8
vim /application/tomcat/conf/server.xml +150
.....
<Context path="" docBase="/application/tomcat/webapps/test" delug="0"
reloadable="false" crossContext="true" />
.....
rm -rf jpress-v2.0.8.war
mkdir test
mv jpress-v2.0.8/* test/

重启服务

1
2
/application/tomcat/bin/shutdown.sh
/application/tomcat/bin/startup.sh

Tomcat安全优化

telnet管理端口保护(强制)

1.修改默认的8005管理端口管理为不易猜测的端口(大于1024)
2.修改SHUTDOWN指令为其他字符串

1
<Server port="8527" shutdown="dangerous">

以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理配置,但要求端口配置在8000-8999之间.

ajp连接端口保护(推荐)

1.修改默认的ajp 8009端口为不易冲突的大于1024端口
2.通过iptables规则限制ajp端口访问的权限仅为线上机器

1
<Connector port="8528" protocol="AJP/1.3"/>

保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器
以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置,但要求
端口配置在8000-8999之间.

禁用管理端(强制)

1.删除默认的{Tomcat安装目录}/conf/tomcat-users.xml文件,重启tomcat后将会自动生
成新的文件.
2.删除{Tomcat安装目录}/webapps下默认的所有目录和文件
3.将tomcat应用根目录配置为tomcat安装目录以外的目录

1
2
3
4
<Host name="localhost" appBase="/application/work/webapps" ...
mkdir -p /application/work/webapps
rm -rf /application/tomcat/conf/tomcat-users.xml
rn -rf /application/tomcat/webapps/*

对于前端web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell的方式将会直接取得服务器的控制权,后果极其严重.

降权启动(强制)

1.tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限.
2.如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发.

1
2
3
4
5
6
useradd tomcat
mkdir /home/tomcat -p
cp -a /application/tomcat /home/tomcat/tomcat8_1
chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
ps -ef | grep tomcat

避免一旦tomcat服务被入侵,黑客直接获取高级用户权限危害整个server的安全.

文件列表访问控制(强制)

1.conf/wep.xml文件中default部分listings的配置必须为false

1
2
3
4
5
6
7
8
<init-param>
<param-name>
listings
</param-name>
<param-value>
false
</param-value>
</init-param>

false为不列出目录文件,true为允许列出,默认为false.

版本信息隐藏(强制)

1.修改conf/Web.xml,重定向403、404以及500等错误到指定的错误页面
2.也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>

<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</1ocation>
</error-page>

<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>

在配置中对一些常见错误进行重定向,避免当出现错误时tomcat默认显示的错误页面暴露服务器和版本信息.
必须确保程序根目录下的错误页面已经存

Nginx + Tomcat负载均衡集群

环境配置

Tomcat:192.168.100.40/24
Tomcat2:192.168.100.50/24
Nginx:192.168.100.60/24

Tomcat服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim index.jsp
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test page</title>
</head>
<body>
<%out.println("-------------------test-------------------");%>
</body>
</html>

vim index.jsp
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<%out.println("-------------------test2-------------------");%>
</body>
</html>

Nginx服务器配置

1
2
3
4
5
6
7
8
9
10
11
vim /usr/local/nginx/conf/nginx.conf
#gzip on;
upstream myjava {
server 192.168.100.50:8080 weight=1;
server 192.168.100.40:8080 weight=1;
}

location / {
......
proxy_pass http://myjava;
}

测试:在浏览器中输入Nginx服务器的ip地址

-------------------本文结束 感谢阅读-------------------