高负载WEB服务器–Tomcat
Tomcat介绍
Tomcat 是一个开源的轻量级应用服务器,在 Java Web 应用开发中被广泛使用。
- 发展历程:Tomcat 最初由 Sun Microsystems 开发,后来成为 Apache 软件基金会的一个项目。它的发展与 Java 技术的发展密切相关,随着 Java EE 规范的不断更新,Tomcat 也在不断升级和完善,以支持新的技术和特性。
- 功能特点
- 支持 Servlet 和 JSP:这是 Tomcat 的核心功能。Servlet 是 Java 编写的服务器端程序,用于生成动态 Web 内容;JSP 则是在 HTML 页面中嵌入 Java 代码的技术,方便开发人员创建动态网页。Tomcat 为 Servlet 和 JSP 提供了运行环境,能够高效地处理客户端请求并生成相应的动态内容。Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。
- 轻量级:与一些大型的应用服务器相比,Tomcat 的体积较小,启动速度快,资源占用少。这使得它非常适合在开发环境和小型生产环境中使用,可以快速搭建和部署 Web 应用。
- 可扩展性:Tomcat 具有良好的可扩展性,通过各种插件和扩展机制,可以方便地添加新的功能。例如,可以通过添加自定义的 Servlet 过滤器来实现对请求和响应的预处理和后处理,还可以通过扩展 Tomcat 的 JNDI(Java Naming and Directory Interface)功能来集成外部的资源和服务。
- 跨平台性:由于 Tomcat 是基于 Java 语言开发的,而 Java 具有 “一次编写,到处运行” 的特性,所以 Tomcat 可以在不同的操作系统上运行,如 Windows、Linux、Mac OS 等。开发人员可以在自己喜欢的操作系统上进行开发和测试,然后将应用部署到不同的生产环境中,而无需担心兼容性问题。
- 应用场景
- Web 应用开发与部署:在 Java Web 应用的开发过程中,开发人员通常会使用 Tomcat 作为开发服务器,方便进行代码调试和测试。在项目部署阶段,也可以将经过测试的 Web 应用部署到 Tomcat 服务器上,使其能够对外提供服务。许多小型企业级应用、个人网站、博客等都可以使用 Tomcat 来部署。
- Java EE 应用的基础容器:虽然 Tomcat 本身不完全符合 Java EE 的全部规范,但它提供了 Servlet 和 JSP 的运行环境,是构建 Java EE 应用的重要基础。许多 Java EE 应用服务器实际上也包含了 Tomcat 的核心功能,用于处理 Web 层的请求。例如,JBoss、WebLogic 等应用服务器在内部都使用了类似 Tomcat 的 Servlet 容器来处理 Web 相关的业务。
Tomcat安装
tomcat官网:https://tomcat.apache.org/
安装Tomcat和JDK
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
机器 | IP | 说明 |
---|---|---|
openEuler-1 | 172.25.254.100 | tomcat服务器 |
openEuler-2 | 172.25.254.200 | 客户端 |
使用RPM安装JDK环境
## 在官网中找到jdk的rpm包并上传到虚拟机中
[root@openEuler-1 ~]# ll
-rw-r--r-- 1 root root 122M Apr 7 13:51 jdk-8u261-linux-x64.rpm
[root@openEuler-1 ~]# java -version
-bash: java: command not found
[root@openEuler-1 ~]# yum install jdk-8u261-linux-x64.rpm -y
[root@openEuler-1 ~]# java -version
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
安装Tomcat
## 在Tomcat官网中找到想要下载版本,复制链接下载
[root@openEuler-1 ~]# wget -c https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.87/bin/apache-tomcat-9.0.87.tar.gz
[root@openEuler-1 ~]# tar xf apache-tomcat-9.0.87.tar.gz -C /usr/local
[root@openEuler-1 ~]# ll /usr/local
drwxr-xr-x 9 root root 4.0K Apr 7 14:08 apache-tomcat-9.0.87
......
[root@openEuler-1 ~]# ln -sv /usr/local/apache-tomcat-9.0.87/ /usr/local/tomcat
'/usr/local/tomcat' -> '/usr/local/apache-tomcat-9.0.87/'
bin
目录: 该目录包含了 Tomcat 的各种脚本文件,如启动脚本startup.sh
(在 Linux 系统下)、startup.bat
(在 Windows 系统下),用于启动 Tomcat 服务器;停止脚本shutdown.sh
(Linux 系统)、shutdown.bat
(Windows 系统)用于关闭 Tomcat 等。conf
目录:存放 Tomcat 的配置文件,像server.xml
是 Tomcat 的主要配置文件,用于配置服务器的各种参数,例如端口号、连接器、虚拟主机等;web.xml
是 Web 应用的部署描述符的默认配置文件等。lib
目录: 包含了 Tomcat 运行时所依赖的各种 Java 类库(JAR 文件),比如支持 Servlet 和 JSP 运行的相关库等,这些库是 Tomcat 正常运行和处理 Web 请求所必需的。logs
目录:用于存储 Tomcat 运行时产生的日志文件,例如访问日志记录了客户端对服务器的访问情况,错误日志记录了服务器运行过程中出现的错误信息等,通过查看这些日志可以帮助诊断和解决问题。temp
目录: 临时文件目录,Tomcat 在运行过程中产生的一些临时文件会存放在这里,比如在处理某些请求时可能会生成临时数据等。webapps
目录:这是部署 Web 应用的主要目录,将开发好的 Web 应用(通常是 WAR 包或者解压缩后的应用目录结构)放置到该目录下,Tomcat 启动时会自动部署这些应用,使其可以对外提供服务。work
目录: Tomcat 会将 JSP 页面编译成 Servlet 类的字节码文件,并将这些编译后的文件存放在work
目录下,此外还可能包含一些其他与 JSP 编译和运行相关的临时文件。
Tomcat启动服务
使用Tomcat自带的启动脚本
[root@openEuler-1 ~]# /usr/local/tomcat/bin/startup.sh
[root@openEuler-1 ~]# ss -nutlp |grep java
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=9678,fd=65))
tcp LISTEN 0 100 *:8080 *:* users:(("java",pid=9678,fd=57))
##停止
[root@openEuler-1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@openEuler-1 ~]# ss -nutlp |grep java
配置systemctl
方式启动
## 可以模仿nginx进行配置
[root@Rocky ~]# systemctl cat nginx
# /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
## 模仿nginx配置tomcat
[root@openEuler-1 ~]# vim /usr/lib/systemd/system/tomcat.service
# /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecRetart=/usr/local/tomcat/bin/startup.sh && sleep2 && /usr/local/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
[root@openEuler-1 ~]# systemctl daemon-reload
[root@openEuler-1 ~]# systemctl start tomcat
[root@openEuler-1 ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat Server
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2025-04-07 14:52:36 CST; 7s ago
Process: 9910 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 9924 (java)
Tasks: 17 (limit: 8950)
Memory: 68.7M
CGroup: /system.slice/tomcat.service
└─9924 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.Cla>
Apr 07 14:52:36 openEuler-1 systemd[1]: /usr/lib/systemd/system/tomcat.service:9: Unknown key name 'ExecRetart' in section 'Service', ignoring.
Apr 07 14:52:36 openEuler-1 systemd[1]: Starting Apache Tomcat Server...
Apr 07 14:52:36 openEuler-1 startup.sh[9910]: Tomcat started.
Apr 07 14:52:36 openEuler-1 systemd[1]: Started Apache Tomcat Server.
[root@openEuler-1 ~]# ss -lnput | grep java
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=9924,fd=65))
tcp LISTEN 0 100 *:8080 *:* users:(("java",pid=9924,fd=57))
Tomcat测试
创建静态页面
[root@openEuler-1 ~]# echo "tomcat test" > /usr/local/tomcat/webapps/ROOT/test01.html [root@openEuler-1 ~]# curl 172.25.254.100:8080/test01.html tomcat test ## 或者浏览器访问http://172.25.254.100:8080/test01.html
测试jsp页面
[root@openEuler-1 ~]# vim /usr/local/tomcat/webapps/ROOT/test02.jsp <html> <body> <center> Now time is: <%=new java.util.Date()%> </center> </body> </html> [root@openEuler-1 ~]# curl 172.25.254.100:8080/test02.jsp <html> <body> <center> Now time is: Mon Apr 07 15:02:11 CST 2025 </center> </body> </html> ## 或者浏览器访问http://172.25.254.100:8080/test02.jsp
Tomcat目录结构
tomcat主目录
[root@openEuler-1 ~]# tree -d -L 1 /usr/local/tomcat/
/usr/local/tomcat/
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
└── work
bin
目录: 该目录包含了 Tomcat 的各种脚本文件,如启动脚本startup.sh
(在 Linux 系统下)、startup.bat
(在 Windows 系统下),用于启动 Tomcat 服务器;停止脚本shutdown.sh
(Linux 系统)、shutdown.bat
(Windows 系统)用于关闭 Tomcat 等。conf
目录:存放 Tomcat 的配置文件,像server.xml
是 Tomcat 的主要配置文件,用于配置服务器的各种参数,例如端口号、连接器、虚拟主机等;web.xml
是 Web 应用的部署描述符的默认配置文件等。lib
目录: 包含了 Tomcat 运行时所依赖的各种 Java 类库(JAR 文件),比如支持 Servlet 和 JSP 运行的相关库等,这些库是 Tomcat 正常运行和处理 Web 请求所必需的。logs
目录:用于存储 Tomcat 运行时产生的日志文件,例如访问日志记录了客户端对服务器的访问情况,错误日志记录了服务器运行过程中出现的错误信息等,通过查看这些日志可以帮助诊断和解决问题。temp
目录: 临时文件目录,Tomcat 在运行过程中产生的一些临时文件会存放在这里,比如在处理某些请求时可能会生成临时数据等。webapps
目录:这是部署 Web 应用的主要目录,将开发好的 Web 应用(通常是 WAR 包或者解压缩后的应用目录结构)放置到该目录下,Tomcat 启动时会自动部署这些应用,使其可以对外提供服务。work
目录: Tomcat 会将 JSP 页面编译成 Servlet 类的字节码文件,并将这些编译后的文件存放在work
目录下,此外还可能包含一些其他与 JSP 编译和运行相关的临时文件。
Tomcat的webapps目录
[root@openEuler-1 ~]# tree -d -L 1 /usr/local/tomcat/webapps
/usr/local/tomcat/webapps
├── docs
├── examples
├── host-manager
├── manager
├── ROOT
docs
目录:通常存放 Tomcat 的相关文档,比如一些使用说明、配置示例等帮助用户了解和使用 Tomcat 的资料。examples
目录:包含了许多 Tomcat 的示例 Web 应用,这些示例可以帮助开发者学习和理解如何在 Tomcat 上开发和部署不同类型的 Web 应用,例如 Servlet、JSP 等示例。host-manager
目录:这是 Tomcat 提供的一个用于管理虚拟主机的 Web 应用。通过它,管理员可以配置和管理 Tomcat 中的虚拟主机相关设置,比如创建、删除虚拟主机等操作。不过为了安全起见,通常需要配置用户权限才能访问。manager
目录:Tomcat 的 Web 应用管理器,用于管理部署在 Tomcat 上的 Web 应用。可以通过这个管理器进行应用的部署、启动、停止、重载等操作。同样,也需要合理配置访问权限以保证安全性。ROOT
目录:这是 Tomcat 的默认 Web 应用目录。当访问http://yourserver:port/
(不指定具体应用名)时,Tomcat 会尝试加载ROOT
目录下的应用。如果这个目录下部署了 Web 应用,那么它就会作为默认应用被访问。
Tomcat的conf配置文件
[root@openEuler-1 ~]# tree -L 1 /usr/local/tomcat/conf
/usr/local/tomcat/conf
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── jaspic-providers.xml
├── jaspic-providers.xsd
├── logging.properties
├── server.xml
├── tomcat-users.xml
├── tomcat-users.xsd
└── web.xml
Catalina
目录:用于存放特定于Catalina
(Tomcat 的内核名称) 的配置文件,一般里面会包含每个虚拟主机的配置文件,当你在server.xml
中配置了虚拟主机时,与虚拟主机相关的一些详细配置可能会放在这个目录下对应主机名的文件中。catalina.policy
:这是 Tomcat 的安全策略文件,用于定义 Tomcat 运行时的安全权限,比如指定哪些代码可以访问系统资源,哪些类库具有特定的权限等。catalina.properties
:包含了 Tomcat 的一些属性配置,例如日志记录相关的属性、默认的类加载器配置等,它对 Tomcat 的整体运行环境有一定的影响。context.xml
:全局的Context
配置文件,用于配置 Web 应用的默认上下文参数等信息。可以在这个文件中设置一些应用通用的配置,这些配置会应用到所有部署在 Tomcat 上的 Web 应用。jaspic-providers.xml
:与 Java Authentication and Authorization Service Provider Configuration (JASPIC) 相关的配置文件,用于配置认证和授权提供程序。jaspic-providers.xsd
:是jaspic-providers.xml
的 XML 模式定义文件,用于验证jaspic-providers.xml
文件的格式是否正确。logging.properties
:Tomcat 的日志配置文件,在这里可以设置日志的级别、输出位置、日志格式等相关参数,控制 Tomcat 运行时的日志记录行为。server.xml
:Tomcat 的核心配置文件,用于配置整个服务器的架构,包括连接器(如 HTTP 连接器的端口等)、虚拟主机、全局命名资源等关键设置,对 Tomcat 的运行起着决定性作用。tomcat-users.xml
:用于配置 Tomcat 的用户和角色,定义了哪些用户可以访问 Tomcat 的管理界面(如manager
和host-manager
应用)以及这些用户具有的角色和权限。tomcat-users.xsd
:是tomcat-users.xml
的 XML 模式定义文件,用于验证tomcat-users.xml
文件的格式是否符合要求。web.xml
:这是 Web 应用的部署描述符的全局配置文件,定义了一些全局的 Servlet、过滤器、监听器等 Web 应用组件的配置信息,这些配置对所有部署在 Tomcat 上的 Web 应用都起作用 。
Tomcat配置文件server.xml
在 Tomcat 的 server.xml
配置文件里,不同组件有着不同的功能和层级关系。下面为你详细介绍各类组件:
顶级组件
Server
:这是server.xml
里的顶级组件,代表整个 Tomcat 服务器实例。一个server.xml
文件仅能有一个Server
元素,它充当所有其他组件的容器。
<Server port="8005" shutdown="SHUTDOWN">
<!-- 其他组件 -->
</Server>
port
属性指定了用于关闭服务器的端口,shutdown
属性则规定了关闭服务器所需的命令。
容器类组件
1. Service
组件
Service
组件用于关联 Connector
和 Engine
。一个 Server
可包含多个 Service
,每个 Service
只能有一个 Engine
,但能有多个 Connector
。
参数 | 说明 |
---|---|
name |
用于标识 Service 的名称,在日志和配置引用时使用。 |
示例代码:
<Service name="Catalina">
<!-- 嵌套 Connector 和 Engine 组件 -->
</Service>
2. Engine
组件
Engine
代表整个 Servlet 引擎,负责处理所有传入的请求。它是 Service
组件的子元素,一个 Service
仅能有一个 Engine
。
参数 | 说明 |
---|---|
name |
Engine 的名称,用于标识,在日志和配置引用中使用。 |
defaultHost |
指定默认的虚拟主机名,当请求的主机名未在 Host 组件中明确定义时,使用该默认主机处理请求。 |
示例代码:
<Engine name="Catalina" defaultHost="localhost">
<!-- 嵌套 Host 组件 -->
</Engine>
3. Host
组件
Host
代表虚拟主机,一个 Engine
可以包含多个 Host
元素,每个 Host
对应一个域名或 IP 地址。
参数 | 说明 |
---|---|
name |
虚拟主机的名称,通常是域名或 IP 地址,客户端通过该名称访问虚拟主机。 |
appBase |
指定该虚拟主机下 Web 应用程序的基础目录,Tomcat 会在此目录下查找和部署 Web 应用。 |
unpackWARs |
指示是否自动解压 WAR 文件。设置为 true 时,Tomcat 会自动将 WAR 文件解压到指定目录;设置为 false 则不解压。 |
autoDeploy |
指示是否在运行时自动部署新的 Web 应用或更新已部署的应用。设置为 true 时,Tomcat 会定期检查 appBase 目录,发现新的 WAR 文件或应用更新时自动部署。 |
示例代码:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 嵌套 Context 组件 -->
</Host>
4. Context
组件
Context
代表一个 Web 应用程序,一个 Host
可以包含多个 Context
元素,每个 Context
定义了一个 Web 应用的部署信息。
参数 | 说明 |
---|---|
path |
该 Web 应用的上下文路径,客户端通过该路径访问 Web 应用。若设置为空字符串 "" ,则表示该应用为默认应用,可通过根路径访问。 |
docBase |
指定该 Web 应用的文档基础目录,即 Web 应用的实际文件存放位置,可以是相对路径或绝对路径。 |
reloadable |
指示是否在类文件发生变化时自动重新加载该 Web 应用。设置为 true 时,Tomcat 会监控类文件的变化,发现变化后自动重新加载应用;设置为 false 则不监控。 |
示例代码:
<Context path="/myapp" docBase="/path/to/myapp" reloadable="true" />
连接器组件
Connector
组件
Connector
负责接收客户端的请求并将其转发给 Engine
进行处理。一个 Service
可以有多个 Connector
,每个 Connector
可以监听不同的端口和协议。
参数 | 说明 |
---|---|
port |
指定 Connector 监听的端口号,客户端通过该端口向 Tomcat 发送请求。 |
protocol |
指定 Connector 使用的协议,常见值有 HTTP/1.1 、AJP/1.3 等。 |
connectionTimeout |
指定客户端与服务器建立连接后,在无数据传输情况下,连接保持打开的最长时间(以毫秒为单位)。超过该时间,连接将被关闭。 |
maxThreads |
指定 Connector 可创建的最大线程数,限制同时处理请求的最大数量。 |
minSpareThreads |
指定 Connector 启动时创建的最小空闲线程数,预先创建以提高响应速度。 |
redirectPort |
当客户端发起 HTTP 请求,但服务器需用 HTTPS 处理时,将请求重定向到该端口。 |
SSLEnabled |
启用或禁用 SSL/TLS 加密,设置为 true 时,Connector 使用 SSL/TLS 协议处理请求。 |
URIEncoding |
指定处理请求 URI 时使用的字符编码,确保非 ASCII 字符正确解析。 |
acceptCount |
当所有线程都在处理请求时,允许在队列中等待处理的最大请求数,超过数量的请求将被拒绝。 |
示例代码:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="200"
minSpareThreads="25"
redirectPort="8443"
URIEncoding="UTF-8"
acceptCount="100" />
被嵌套类组件
Valve
:Valve
是一个过滤器组件,可在请求处理的不同阶段执行特定的操作,像访问日志记录、请求过滤等。Valve
可以嵌套在Engine
、Host
或Context
中。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
Logger
:Logger
用于记录 Tomcat 的日志信息,可嵌套在Engine
、Host
或Context
中。
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="localhost_log." suffix=".txt"
timestamp="true"/>
完整示例
下面是一个完整的 server.xml
配置文件示例,展示了这些组件如何相互嵌套和协作:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="200"
minSpareThreads="25"
redirectPort="8443"
URIEncoding="UTF-8"
acceptCount="100" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/myapp" docBase="/path/to/myapp" reloadable="true" />
</Host>
</Engine>
</Service>
</Server>
这个示例呈现了一个基本的 Tomcat 配置,包含了一个 Service
、一个 Engine
、一个 Host
、一个 Context
以及一个 Connector
用于接收客户端请求。
Tomcat虚拟主机
- 修改server.xml文件
[root@openEuler-1 ~]# cd /usr/local/tomcat/conf/
[root@openEuler-1 conf]# cp server.xml{,.bak}
## 添加虚拟主机配置
......
<Host name="www.a.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/a" path="" reloadable="false" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="www.b.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context docBase="/web/b" path="" reloadable="false" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@openEuler-1 conf]# mkdir -p /web/{a,b}
[root@openEuler-1 conf]# tree /web
/web
├── a
└── b
[root@openEuler-1 conf]# vim /web/a/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP a page</title>
</head>
<body>
<% out.println("Welocome to test site,http://www.a.com");%>
</body>
</html>
[root@openEuler-1 conf]# vim /web/b/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP b page</title>
</head>
<body>
<% out.println("Welocome to test site,http://www.b.com");%>
</body>
</html>
## 在windows上配置host解析C:\WINDOWS\System32\drivers\etc\hosts
[root@openEuler-1 conf]# curl www.a.com:8080
<html>
<head>
<title>JSP a page</title>
</head>
<body>
Welocome to test site,http://www.a.com
</body>
</html>
[root@openEuler-1 conf]# curl www.b.com:8080
<html>
<head>
<title>JSP b page</title>
</head>
<body>
Welocome to test site,http://www.b.com
</body>
</html>
Tomcat站点部署
两种方式
- 第一种方式是直接将程序目录放在webapps目录下面
- 第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。
- ZrLog 博客程序
## 恢复默认配置
[root@openEuler-1 conf]# cp server.xml.bak server.xml
[root@openEuler-1 conf]# cd ../webapps/
## 将开发好的war包放入该目录,自动解压
[root@openEuler-1 webapps]# ll
......
-rwxr-x--- 9 root root 4.0K Apr 7 16:19 zrlog
-rw-r--r-- 1 root root 11M Apr 7 16:18 zrlog.war
浏览器访问:http://172.25.254.100:8080/zrlog/
在172.25.254.101上创建数据库相关配置
[root@Rocky ~]# systemctl start mysqld [root@Rocky ~]# mysql mysql> create database zrlog; mysql> create user zrlog@'%' identified with mysql_native_password by '123456'; mysql> grant all on zrlog.* to zrlog@'%';
填写数据库信息
安装
Tomcat管理页面
Tomcat自带的管理页面有管理功能和监控功能
1、所有的管理页面,都将权限赋予了角色,而角色的名称是固定的:manager-gui,admin-gui
2、需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的管理页面
[root@openEuler-1 ~]# cd /usr/local/tomcat/conf
[root@openEuler-1 conf]# cp tomcat-users.xml{,.bak}
[root@openEuler-1 conf]# vim tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
3、由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问
将127改成自己的网段
[root@openEuler-1 conf]# vim ../webapps/host-manager/META-INF/context.xml
......
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="172\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
[root@openEuler-1 conf]# vim ../webapps/manager/META-INF/context.xml
......
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="172\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
4、重启tomcat并访问172.25.254.100:8080
Tomcat服务管理脚本
创建用户和用户组
[root@openEuler-1 ~]# groupadd -r -g 53 tomcat [root@openEuler-1 ~]# useradd -r -u 53 -g 53 -c "Apache Tomcat" -d /usr/local/tomcat -s /sbin/nologin tomcat
修改权限
[root@openEuler-1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/*
编写服务脚本
[root@openEuler-1 ~]# vim /usr/lib/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking Environment=CATALINA_HOME=/usr/local/tomcat ExecStart=/usr/local/tomcat/bin/startup.sh ExecStop=/usr/local/tomcat/bin/shutdown.sh ExecReload=/bin/kill -s HUP $MAINPID USER=tomcat Group=tomcat PrivateTmp=true [Install] WantedBy=multi-user.target [root@openEuler-1 ~]# systemctl daemon-reload [root@openEuler-1 ~]# systemctl restart tomcat
测试:浏览器访问:172.25.254.100:8080
Tomcat监控
开发java监控页面
[root@openEuler-1 ~]# vim /usr/local/tomcat/webapps/ROOT/meminfo.jsp
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory:"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
浏览器访问:http://172.25.254.100:8080/meminfo.jsp
使用jps命令进行监控
[root@openEuler-1 ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=你的服务器实际IP"
windwos安装jdk环境,运行jconsole.exe进行监控
Tomcat 安全优化
- telnet 管理端口保护(强制)
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
telnet 管理端口 | 1. 建议关闭 telnet 管理端口; 2. 如无法关闭,修改端口为非 8005 端口,且设置 SHUTDOWN 命令为复杂字符串 | - | 关闭或修改端口,可防止利用该端口进行远程操作,避免服务器被恶意控制 |
- ajp 连接端口保护(推荐)
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
ajp 连接端口 | 1. 建议关闭 AJP 8009 端口; 2. 如无法关闭,修改端口为非 8009 端口,并将连接协议修改为 org.apache.coyote.http11.Http11NioProtocol | <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8009" /> (示例,端口按需修改) |
关闭或修改端口,能防止攻击者通过 AJP 协议漏洞攻击服务器 |
禁用管理端(强制)
操作一:删除默认的 {Tomcat 安装目录}/conf/tomcat - users.xml 文件,重启 Tomcat 后自动生成新文件。
操作二:删除 {Tomcat 安装目录}/webapps 下默认的所有目录和文件。
操作三:将 tomcat 应用根目录配置为 tomcat 安装目录以外的目录,如
<Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
。
降权启动
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
启动用户权限 | 1. Tomcat 启动用户权限为非 root 权限,降低目录访问权限; 2. 如需使用 80 端口,普通账号启动后配置 iptables 规则转发 | - | 避免 Tomcat 被入侵后黑客获取高级权限危及服务器安全 |
- 文件列表访问控制
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
文件列表访问 | 在 conf/web.xml 文件中 default 部分,将 listings 配置设为 false | listings = false |
false 表示不列出目录文件,防止攻击者通过目录列表获取敏感信息 |
- 版本信息隐藏
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
错误页面重定向 | 1. 修改 conf/web.xml,将 403、404、500 等错误重定向到指定页面; 2. 也可修改应用程序目录下 WEB - INF/web.xml 配置进行重定向 | 如 <error - page error - code="403" location="/forbidden.jsp"/> <error - page error - code="404" location="/notfound.jsp"/> <error - page error - code="500" location="/systembusy.jsp"/> |
避免错误页面暴露服务器和版本信息,需确保程序根目录下对应错误页面存在 |
Tomcat 性能优化
增加 Tomcat 处理线程数
操作方式:编辑 Tomcat 目录下
conf
子目录的server.xml
文件。关键参数说明
maxThreads
:Tomcat 使用线程处理每个请求,此值代表 Tomcat 可创建的最大线程数。acceptCount
:当所有可用处理请求的线程都被占用时,可放入处理队列中的请求数,超过该数量将不予处理。connectionTimeout
:网络连接超时时间(单位:毫秒),设为0
表示永不超时,但此设置有隐患,一般设为 30000 毫秒。
minSpareThreads
:Tomcat 初始化时创建的线程数。maxSpareThreads
:一旦创建的线程超过此值,Tomcat 会关闭不再需要的 socket 线程 。
配置示例
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150"
minSpareThreads="30" maxSpareThreads="75" enableLookups="false"
redirectPort="8443" acceptCount="100" disableUploadTimeout="true" />
Tomcat 内存空间设置
常见内存错误及原因
- java.lang.OutOfMemoryError: java heap space:Java 程序从数据库查询大量数据时易出现。当 98% 的时间用于垃圾回收(GC)且可用堆大小不足 2% 时抛出此异常。
- java.lang.OutOfMemoryError: PermGen space :
PermGen space
即Permanent Generation space
,是内存的永久保存区域,主要被加载的类和静态对象占用。若 WEB 应用部署大量第三方 jar 且大小超过默认的 4M ,会产生此错误。 - OutOfMemoryError: unable to create new native thread:无法创建新线程。
- java.lang.Unable to create initial heap :初始堆设置问题。
解决方法:在生产环境下,若内存空间为 8G ,在
catalina.sh
文件头部注释下方,添加如下内容 :export JAVA_OPTS='-server -Xms4096m -Xmx4096m -Xmn256m -XX:PermSize=256m -XX:MaxNewSize=512m -XX:MaxPermSize=512m'
提示:使用 64 位 Tomcat 版本。