tomcat
Java体系
- Java编程语言
- Java类文件:java类文件为java编译后的文件
- JavaAPI:java类文件库
- JavaVM(JVM)
- class loader:编译和类库文件加载器
- 执行引擎
JRE(Java Runtime Enviroment):
是Java的运行环境。面向Java程序的使用者,而不是开发者。如果你仅下载并安装了JRE,那么你的系统只能运行Java程序。JRE是运行Java程序所必须环境的集合,包含JVM标准实现及 Java核心类库。它包括Java虚拟机、Java平台核心类和支持文件。它不包含开发工具(编译器、调试器等)。
JDK(Java Development Kit):
又称J2SDK(Java2 Software Development Kit),是Java开发工具包,它提供了Java的开发环境(提供了编译器javac等工具,用于将java文件编译为class文件)和运行环境(提 供了JVM和Runtime辅助包,用于解析class文件使其得到运行)。如果你下载并安装了JDK,那么你不仅可以开发Java程序,也同时拥有了运 行Java程序的平台。JDK是整个Java的核心,包括了Java运行环境(JRE),一堆Java工具tools.jar和Java标准类库 (rt.jar)。
运行jsp的web容器
jsp技术将java代码嵌入html文件中,建立了一种动态网页的编写标准,它的技术基础是serverlet技术,当用户请求一个jsp文件时,jsp会将代码转换成serverlet(即标准的java代码),java代码再交由低层的jdk执行。常见的容器有websphere,weblogic,tomcat。
tomcat简介
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0。
tomcat就是中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中。而tomcat本身的运行也依赖于jdk环境。
tomcat应用场景:lnmt
tomcat部署
tomcat官网: http://tomcat.apache.org/
Tomcat目录结构
| 目录 | 含义 |
|---|---|
| conf/ | tomcat配置文件 |
| .. | server.xml 主配置文件 |
| .. | web.xml 补充额外功能 |
| .. | tomcat-user.xml tomcat管理端配置文件 用户名 密码 |
| logs | 日志 |
| .. | catalina.out tomcat最全日志 查看error startup时间 |
| .. | catalina.data.log catalina.out切割日志 |
| .. | localhost_access_log_data.txt tomcat访问日志 |
| webapps | tomcat站点目录 |
配置jdk
[root@localhost ~]# tar -xzvf jdk-8u281-linux-x64.tar.gz -C /usr/local/ [root@localhost ~]# vim /etc/profile ....................... ..................... export JAVA_HOME=/usr/local/jdk1.8.0_281/ export JRE_HOME=/usr/local/jdk1.8.0_281/jre export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export TOMCAT8080_HOME=/usr/local/tomcat
解压缩tomcat
[root@loclhost ~]# tar -zxvf apache-tomcat-8.5.65.tar.gz -C /usr/local/ [root@localhost ~]# ln -s /usr/local/apache-tomcat-8.5.65 /usr/local/tomcat
放行端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
写一个hello world的java测试页面
[root@localhost ~]# mkdir /usr/local/tomcat/webapps/test
[root@localhost ~]# vim /usr/local/tomcat/webapps/test/index.jsp
<html>
<head>
<title>test page</title>
</head>
<body>
<%
out.println("Hello World");
%>
</body>
</html>
启动服务
[root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh
测试访问
[root@localhost ~] curl 192.168.248.40:8080/test/ hello world
Tomcat管理端
- 搭建与测试的时候开启管理端 开启管理端
- 生产环境 关闭管理端
开启管理端
# 8.0这样配置就完成了 # 8.5之后管理跟严格了 # 要配置tomcat-user.xml之外 # 还限制只能再本地使访问管理 [root@localhost ~]# cd /usr/local/tomcat/ [root@localhost tomcat]# vim conf/tomcat-users.xml .............. ............. <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> .................


解除本地限制
[root@localhost tomcat]# find -type f -name "*.xml" | xargs grep '127' ./webapps/host-manager/META-INF/context.xml: allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> ./webapps/host-manager/WEB-INF/manager.xml: allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> ./webapps/manager/META-INF/context.xml: allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> [root@localhost tomcat]# sed -i.bak 's#127#\\d+#g' ./webapps/host-manager/META-INF/context.xml ./webapps/manager/META-INF/context.xml [root@localhost tomcat]# /usr/local/tomcat/bin/shutdown.sh [root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh

tomcat 多实例
在一台服务器上运行多个tomcat
注意事项: 端口与路径不同
root@localhost ~]# tar xf apache-tomcat-8.5.65.tar.gz
[root@localhost ~]# cp -r apache-tomcat-8.5.65 /usr/local/tomcat8081
[root@localhost ~]# cp -r apache-tomcat-8.5.65 /usr/local/tomcat8082
[root@localhost ~]# cd /usr/local/
[root@localhost local]# sed -i.bak 's#8080#8081#g' tomcat8081/conf/server.xml
[root@localhost local]# sed -i.bak 's#8005#8006#g' tomcat8081/conf/server.xml
[root@localhost local]# sed -i.bak 's#8009#8010#g' tomcat8081/conf/server.xml
[root@localhost local]# sed -i.bak 's#8080#8082#g' tomcat8082/conf/server.xml
[root@localhost local]# sed -i.bak 's#8005#8007#g' tomcat8082/conf/server.xml
[root@localhost local]# sed -i.bak 's#8009#8011#g' tomcat8082/conf/server.xml
#启动服务
[root@localhost local]# tomcat8081/bin/startup.sh
[root@localhost local]# tomcat8082/bin/startup.sh
#检测是否启动
[root@localhost local]# ss -lntup| grep java
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 [::]:* users:(("java",pid=2193,fd=69))
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8006 [::]:* users:(("java",pid=12271,fd=69))
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8007 [::]:* users:(("java",pid=12311,fd=69))
tcp LISTEN 0 100 [::]:8080 [::]:* users:(("java",pid=2193,fd=55))
tcp LISTEN 0 100 [::]:8081 [::]:* users:(("java",pid=12271,fd=55))
tcp LISTEN 0 100 [::]:8082 [::]:* users:(("java",pid=12311,fd=55))
#防火墙放行
[root@localhost local]# firewall-cmd --zone=public --add-port=8081/tcp --permanent
[root@localhost local]# firewall-cmd --zone=public --add-port=8082/tcp --permanent
[root@localhost local]# firewall-cmd --reload
#网页访问
tomcat 3种工作模式
| 模式 | header 2 | ||
|---|---|---|---|
| bio | blocking io | tomcat 7及之前使用,同步模型、阻塞 | 一个线程处理一个进程,缺点:并发高式,线程数较多,浪费资源 |
| nio | now ip | tomcat 8及以后,异步非阻塞 | nio1(默认的) nio2可以通过少量的线程处理大量的请求 |
| apr | Apache Portable Rutime | tomcat对静态文件的处理性能。 tomcat apr在tomcat上运行高并发应用的首选 |
bio(blocking I/O),阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包),对于每一个请求都要创建一个线程来进行处理,所以开销较大不适合处理高并发的场景。
nio基于缓冲区、并能提供非阻塞I/O操作的Java API实现,比传统的I/O处理方式(bio)有更高的并发运行性能
apr(Apache Portable Runtime/Apache可移植运行库)是Apache HTTP服务器的支持库。从操作系统级别解决异步I/O问题,大幅度提高服务器的并发处理性能,也是Tomcat生产环境运行的首选方式。要tomcat支持apr,必须安装apr和native,这样tomcat才可以利用apache的apr接口,使用操作系统的部分本地操作,从而提升性能。
nio2模式
#配置server.xml文件
<Connector port="8081" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
#apr模式需要一些插件
[root@localhost tomcat8081]# yum -y install apr apr-devel tomcat-native
#修改server.xml文件
<Connector port="8081" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
#centos8中 yum源中没有tomcat-native 需要编译安装,默认在下载的tomcat里的bin目录带的有该项目的tar包
开启tomcat远程监控
#修改 tomcat/bin/catalina.sh #CATALINA_OPTS java内置变量 修改Java启动参数(tomcat) CATALINA_OPTS #java启动参数 CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.mam=nagement.jmxremote #开启tomcat远程监控功能 -Dcom.sun.mam=nagement.jmxremote.port=12345 #指定端口 ,还会生产两个随机端口 -Dcom.sun.mam=nagement.jmxremote.authenticate=false #是否开启认证 -Dcom.sun.mam=nagement.jmxremote.ssl=false #是否开启https -Djava.rmi.server.hostname=192.168.248.20" #服务器IP,生产环境使用内网 [root@localhost tomcat]#vim /usr/local/tomcat/bin/catalina.sh #添加此行 CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.248.40 #重启服务
Tomcat优化
- 安全优化
- 性能优化
- server.xml
- catalina.sh
安全优化
server.xml文件
降权启动(强制)
# 在普通用户下运行和维护tomcat,降权启动/监牢模式
[root@localhost tomcat]# useradd tomcat
[root@localhost tomcat]# chown -R tomcat.tomcat /usr/local/tomcat
[root@localhost local]# su - tomcat
[tomcat@localhost ~]$ /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8.0_281/jre
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.248.40
Tomcat started.
[tomcat@localhost ~]$ ss -lntup|grep java
tcp LISTEN 0 50 [::]:1111 [::]:* users:(("java",pid=2040,fd=21))
tcp LISTEN 0 50 [::]:41783 [::]:* users:(("java",pid=2040,fd=20))
tcp LISTEN 0 50 [::]:35996 [::]:* users:(("java",pid=2040,fd=22))
tcp LISTEN 0 100 [::]:8080 [::]:* users:(("java",pid=2040,fd=59
#通过普通用户自启
vim /etc/rc.local
su - 用户 -c "/usr/local/tomcat/bin/startup.sh"
注意事项 1-1024之间是特权端口,只能root使用
文件列表访问控制(强制),默认展示站点目录下所有内容
nginx 网站文件列表功能 autoindex on:
tomcat 关闭
conf/web.xml文件中
..........................
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
............................
版本信息隐藏
#第一种
cd /usr/local/tomcat/lib
unzip catalina.jar
vim org/apache/catalina/util/ServerInfo.properties
server.info=Apache Tomcat
server.number=0.0.0.0
server.built=Nov 7 2018 10:05:27 UTC
jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties
cd /usr/local/tomcat/lib/
#第二种,添加报错页面
vim conf/web.xml
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
Server header重写
conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
server="nginx/1.26.1" #添加此行
redirectPort="8443" />
日志访问格式
#User-Agent 用户的浏览器 客户端
#Referer 从什么地方跳转过来
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t %s %b %{Referer}i %{User-Agent}i %D" />
tomcat性能优化
- 调优 参数数值调整方式:
- 参考值(基准) 不设置数值,通过压力参数软件,看看tomcat性能
- 增加优化参数,通用压力测试软件
| 压力测试工具 | |
|---|---|
| ab/webbench | http压力测试 |
| stress | 压力测试 cpu 内存 swap..... |
| jmeter | 压力测试java(tomcat) |
| dd/fio | 测试磁盘性能 |
| mysqlslap | 压力测试数据库(mysql) |
| loadrunner | 专业测试工具 |
优化参数
maxThreads="500" #最大的线程数量
acceptCount="" #当达到最大线程数量的时候 列队长度,一版和maxThreads一致
acceptorThreadCount="2" #分为几对,一般与cpu核心一致默认是1
minSoareTherads="10" #空闲时候最小进程
enableLookups="false" #禁止DNS逆向处理,route -n/apr -n
compression="true" #开启tomcat压缩功能,一般是静态资源
compressionMinSize="2048" #压缩文件最小是2048个字节
compressableMimeType="text/html,text/plain,/text/css,application/javascript,application/json,application/x-font-tty,application/x-font-otf" #压缩那些类型的文件
disableUploadTimeout="true" #上传文件的超时时间
redirectPort="8443"
maxTherads:
如果操作是纯粹的计算,那么影响系统响应时间的主要限制就是cpu的运算能力,此时maxThreads应该 尽量设小,降低同一时间争抢cpu的线程个数。
如果是操作是纯粹的IO或数据库,那么响应时间的主要限制就变为等待外部资源,此时maxThreads应该尽量设置大,这样才能提高同时处理多个请求的个数
java启动参数优化
# catalina.sh文件中添加 # 设置 jvm初始内存大小和jvm最大内存大小 # -Xms jvm初始内存 # -Xmx jvm最大内存 # 一般 -Xmx是-Xms的两倍 # gc 定期清理jvm内存 #-Xlog 执行gc的日志 JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat.gc.log'

浙公网安备 33010602011771号