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应用程序的用户界面部分.
基础配置
JDK是Java语言的软件开发工具包, 主要用于移动设备、嵌入式设备上的Java应用程序. JDK是整个Java开发的核心, 它包含了Java的运行环境(JVM+Java系统库)和Java工具.
apt | 注释处理工具 |
appletviewer | 运行和调试applet程序的工具, 不需要使用浏览器. |
extcheck | 一个检测jar包冲突的工具 |
idlj | IDL-to-Java编译器, 将IDL语言转化为java文件. |
jar | 打包工具, 将相关的类文件打包成一个文件. |
java | 运行工具, 运行.class的字节码. |
javac | 编译器, 将后缀名为.java的源代码编译成后缀名为".class"的字节码. |
javadoc | 文档生成器, 从源码注释中提取文档, 注释需匹配规范. |
javah | 从Java类生成C头文件和C源文件, 这些文件提供了连接胶合, 使Java和C代码可进行交互. |
javap | 反编译程序 |
javaws | 运行JNLP程序 |
jdb | 调试工具 |
jhat | java堆分析工具 |
jinfo | 获取正在运行或崩溃的java程序配置信息 |
jmap | 获取java进程内存映射信息 |
jps | 显示当前java程序运行的进程状态 |
jrunscript | 命令行脚本运行 |
jstack | 栈跟踪程序 |
jstat | JVM检测统计工具 |
jstatd | jstat守护进程 |
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 | mkdir /application |
安装Tomcat
安装包:apache-tomcat-8.5.42.tar.gz
1 | tar zxf apache-tomcat-8.5.42.tar.gz -C /application/ |
检查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 | vim /application/tomcat/conf/tomcat-users.xml |
需要注释一下内容:
1 | vim /application/tomcat/webapps/manager/META-INF/context.xml |
验证效果:输入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 | cd /application/tomcat/webapps/ |
浏览器访问:http://ip地址:8080
自定义默认网站目录
1 | vim /application/tomcat/conf/server.xml +150 |
重启服务
1 | /application/tomcat/bin/shutdown.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 | <Host name="localhost" appBase="/application/work/webapps" ... |
对于前端web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell的方式将会直接取得服务器的控制权,后果极其严重.
降权启动(强制)
1.tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限.
2.如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发.
1 | useradd tomcat |
避免一旦tomcat服务被入侵,黑客直接获取高级用户权限危害整个server的安全.
文件列表访问控制(强制)
1.conf/wep.xml文件中default部分listings的配置必须为false
1 | <init-param> |
false为不列出目录文件,true为允许列出,默认为false.
版本信息隐藏(强制)
1.修改conf/Web.xml,重定向403、404以及500等错误到指定的错误页面
2.也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向
1 | <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 | vim index.jsp |
Nginx服务器配置
1 | vim /usr/local/nginx/conf/nginx.conf |
测试:在浏览器中输入Nginx服务器的ip地址