tomcat
tomcat和php一样,都是用来处理动态页面的
tomcat也可以作为web应用服务器,开源的
php .php
tomcat .jsp
nginx .html
tomcat是用java代码写的程序,运行的是java的web应用程序.
tomcat的特点和功能:
1.servlet容易:执行java的servlet,服务端的java程序,处理客户端的http请求,以及响应.
2.jsp容器,javaserver page,动态页面页面,可以在html的页面里面嵌入java代码
3.自身也是一个http服务器
4.tomcat是一个轻量级的动态页面处理程序,高并发场景不适用
优化,tomcat自身的优化,以及系统内核优化,jvm优化
servlet
是java语言中用来开发web应用程序的关键组件
处理http请求,生成动态内容,以及响应客户端的请求.
作用:处理http请求,生成动态内容,处理java的业务逻辑,转发nginx的动态请求到数据库
jsp JavaScript,web应用程序的界面,这个界面的语言是用java实现的 index.jsp
tomcat的组件
connector 负责对外接收和响应请求,它是tomcat于客户端沟通的枢纽,监听端口接收外界请求,端口默认8080
接收到了请求之后,传递给其他组件进行处理,处理完成了之后回到connector,再响应客户端.
container 负责处理业务逻辑,engine,host,context,wrapper四个功能组成
engine: 用来管理多个虚拟主机,一个service只要有engine
host: 一个host就是一个主机,也可以叫站点,通过配置这个host,可以添加多个站点.
context: 一个context就是一个web应用
wrapper: 封装器,负责处理最底层的逻辑
service:对外提供外部服务,包含connector和container
tomcat可以有多个service,每个service之间互相是独立的
安装tomcat
tomcat目录的作用:
.bin存放启动和关闭tomcat脚本的文件,startup.sh shutdow.sh
.conf存放tomcat的主配置文件,server.xml主配置文件
context.xml host的默认配置信息
tomcat-user.xml 登录时认证用户和密码的相关信息,manager文件必须要赋权修改之后才能打开
lib tomcat运行时需要的jar包,一般不动
logs 日志文件,catalina.out主日志文件
temp 存放tomcat运行时产生的文件
webapps 部署web应用的目录,类似于nginx的html
systemctl stop firewalld
setenforce 0
cd /opt
rz -E #把jdk包和tomcat包扔进来
rpm -ivh jdk-8u201-linux-x64.rpm #安装jdk
java -version #检查一下环境
vim /etc/profile.d/java.sh #设置环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
:wq
source /etc/profile.d/java.sh #让它生效
java -version #看一下
tar -xf apache-tomcat-9.0.16.tar.gz #解压tomcat包
mv apache-tomcat-9.0.16 tomcat #原地改名
mv tomcat/ /usr/local/ #移位
cd /usr/local/ #过去看
ls
cd tomcat/ #去tomcat目录
cd bin/ #去tomcat目录下的bin/目录
./startup.sh #启动tomcat
netstat -antp|grep 8080 #查看端口是否启动
#然后去浏览器192.168.118.10:8080,查看页面
cd webapps/ #进入web目录
cd manager/ #进入管理器
cd META-INF/ #进入元信息目录
vim context.xml #编辑站点信息
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow=".*" />#把allow后面的值改成.*
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
:wq
cd /usr/local/tomcat/conf/ #回到tomcat下的conf目录
vim tomcat-users.xml #编辑用户文件
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0"> #在这下面添加
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
:wq
cd ..
cd bin/ #回到tomcat下的bin/
./shutdown.sh #先停止
./startup.sh #再启动
netstat -antp|grep 8080 #查看两个8080端口是否都起来了,如果没有,再停止,再启动几次
#浏览器查看mangerApp,用户名tomcat,密码tomcat
tomcat优化
tomcat启动优化(心里优化)
tomcat的并处理能力不强,大项目不适应tomcat作为转发动态的中间件(k8s集群,python,rubby),小项目会使用(内部使用的)
如何优化tomcat的启动速度
vim /usr/java/jdk/jre/lin/security/java.security
117 securerandom.source=file:/dev/urandom
非阻塞的版本,不依赖系统的终端,进程也不会进入等待状态,所以处理速度相对较快
如果对应用的安全性要求比较高,/dev/random
tomcat自身优化
默认配置不适合生产环境,可能频繁出现假死,需要不停的重启.
根据生产环境的实际情况,自行测试.
vim usr/local/tomcat/conf/server.xml
port 8080 http 80端口
8443 https 443端口,接收客户端https的请求
maxThreads tomcat使用线程来处理接收请求的个数,tomcat最多可以创建多少个线程,默认是200个,一般设置成1000个
minSpareThreads 最小空闲数进程,tomcat开启之后,没人使用也会有进程待命,默认值就是10个,
maxSpareThreads 最大空闲数线程数,一旦线程数超过了这个值,tomcat就会关闭不再需要的线程,默认就是-1,不限制.一般不设置
connectionTimeout 网络连接超时时间,单位是毫秒,20000毫秒是20秒,设置成0是永不超时
enableLookups 是否支持反向解析,值是true,false,提高处理速度
disableUplaodTimeout 上传数据时,是否使用超时机制,默认是10秒,值是true是禁用的意思和false是开启的意思
connectionUploadTimeout 设置上传的超时时间,一般比机制慢个10秒
acceptCount 当所有可以使用的处理请求的线程数都被使用的时候,可以接入请求的最大队列长度.如果超过了这个数字的请求,将被不予处理,默认是100个(缺省值)
compression 对是否对响应数据进行压缩,on是开启,off是关闭,开启压缩之后,可以有效的减少负面的大小(文本无效,图片有点用),一般可以减少三分之一,节省宽带,默认是off
compressionMinSize 表示的是,响应压缩的最小值,只有响应报文大于这个值才会进行压缩.如果开启了压缩,默认值是2048,
noCompressionUserAgents="浏览器名称",对于这些浏览器,不启用压缩
compressableMimeType="压缩类型",对于指定哪些类型的文件进行压缩
常用的页面压缩类型
文本类型 text/plain,text/html,text/css,text/javascript
图像类型 image/jpg,image/jpeg,image/gif
音频类型 audio/ogg, audio/wav, audio/mpeg
视频类型 video/mp4 video/webm video/rmvb video/quicktime
应用程序 application/pdf application/json application/xml
多个类型之间用,号隔开
<Connector port="8080" protocol="HTTP/1.1"
70 connectionTimeout="20000"
71 redirectPort="8443"
#新增 maxThreads="500"
minSpareThreads="20"
enableLookups="false"
disableUploadTimeout="false"
connectionUploadTimeout="20"
/>
cd /usr/local/tomcat/bin
./shutdown.sh && ./startup.sh
tomcat内核优化
如何在内核当中进行系统安全的优化
内核优化的配置文件
1.vim /etc/security/limits.conf 打开文件数的限制,系统初始化的第一步要做的事情
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
2.vim etc/sysctl.conf/ 内核参数文件
sysctl -a 查看内核参数
sysctl -p 内核生效
net.ipv4.ip_forward=0/1
#禁用或者开启数据包的转发功能,要做路由器必须打开,0是关,1是开
net.ipv4.ip_local_port_range=1024 65000
#设定系统的端口范围
net.ipv4.tcp_max_tw_buckets=2000
#允许timewait的最大数量,如果太多了,会造成性能下降
net.ipv4.tcp_max_orphans
#系统允许的最大的tcp连接数量
net.ipv4.tcp_fin_timeout=10
#设置tcp关闭连接的超时时间
net.ipv4.tcp_keepalive_time
#设置tcp的keepalive包的探测包的发送频率,用于检测连接状态
net.ipv4.tcp_sack=1
#启用有选择的应答,提高tcp的处理性能
net.core.netdev_max_backlog=262144
#网络接口接收数据包队列的最大的大小
vm.swappiness=0
#关闭内存的交换行为,不使用交换分区,k8s默认就不能使用交换分区,否则就会报错
tomcat jvm优化
java -jar 123.jar &
cd /usr/local/tomcat/bin
vim kdln
#119 JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"
cygwin=false
-Xms2048m
java初始化堆的大小,分配jvm的最小内存,cpu的性能比较高,可以分配的高一点
-Xmx2048m
java堆的最大值,也就是jvm的最大内存,这个取决于,物理硬件内存的大小,官方建议设置成与xms一样的值,物理内存的一半
-Xmn768m
新生代内存的大小,官方推荐,设置成jvm内存的最大值的八分之三,
java自带垃圾回收机制:回收垃圾之后,不需要重新计算堆区的大小.
堆区:新生代中生代老年代,每生成一个新的对象,对象占用的内存空间,就是所谓的新生代空间.那么垃圾回收之后对堆区当中的资源进行回收之后,新生代没有被回收的资源就转移到了中生代,原本的中生代转移到老年代
整个jvm堆的大小:新生代+老生代+永久代(系统自带)
-XX:ParallelGCThreads=2
#配置并行收集器的线程数,同时有多个线程一起进行垃圾回收,一般配置成cpu的一半
-XX:PermSize=1024m
#设置非堆内存的初始值,持久代内存的大小,默认是物理内存的1/4,建议设置成整个jvm内存的一半
#非堆内存是不会被java垃圾回收机制处理的
-XX:MaxPermSize=1024m
#非堆内存的最大值,和初始值一致即可
-Djava.awt.headless=true
#防止在linux访问的情况下,web页面的图片不能打开
-XX:+DisableExplicitGC
#老年代的收集算法,缩短垃圾回收机制的收集时间
内存.池 | Type | Initial | Total | 最大.值 | Used |
---|---|---|---|---|---|
PS Eden Space | Heap memory | 15.00 MB | 60.00 MB | 309.50 MB | 42.56 MB (13%) |
PS Old Gen | Heap memory | 40.00 MB | 40.00 MB | 629.50 MB | 16.73 MB (2%) |
PS Survivor Space | Heap memory | 2.50 MB | 2.50 MB | 2.50 MB | 2.48 MB (99%) |
Code Cache | Non-heap memory | 2.43 MB | 8.00 MB | 240.00 MB | 7.89 MB (3%) |
Compressed Class Space | Non-heap memory | 0.00 MB | 2.37 MB | 1024.00 MB | 2.20 MB (0%) |
Metaspace | Non-heap memory | 0.00 MB | 20.62 MB | -0.00 MB | 20.00 MB |
PS Eden Space 创建一个新的对象都在堆内存当中
PS Old Gen 堆内存,长期存活的对象
PS Survivor Space 堆内存,存储新生代pseden和psoldgen之间的存活对象,可以理解成中生代
Code Cache 非堆内存,存储已经编译的代码
Compressed Class Space 非堆内存,存储已经压缩过的类定义.
Metaspace 非堆内存,存储元数据的区别
Ajp-nio-8009
ajp是协议,tomcat服务器和web服务器之间进行连接的协议,可以提供负载均衡和高效转发
nio是异步非阻塞的通信方式,可以提高并发的处理能力
8009就是ajp协议的默认端口
tomcat和nginx动静分离
访问nginx就是静态页面,nginx代理index.jsp可以访问tomcat的动态页面
test1 192.168.118.10
systemctl stop firewalld
setenforce 0
cd /usr/local/tomcat/webapps
mkdir test
cd test/
vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
:wq
cd /usr/local/tomcat/conf
vim server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
<Host>
:wq
cd /usr/local/tomcat/bin/
./shutdown.sh
./startup.sh
netstat -antp|grep 8080
test2
systemctl stop firewalld
setenforce 0
cd /usr/local/tomcat/webapps
mkdir test
cd test/
vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
:wq
cd /usr/local/tomcat/conf
vim server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
<Host>
:wq
./shutdown.sh
./startup.sh
netstat -antp|grep 8080
test3
systemctl stop firewalld
setenforce 0
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak.2024.07.08
vim nginx.conf
#gzip on;
http{
upstream tomcat {
server 192.168.118.10:8080 weight=1;
server 192.168.118.20:8080 weight=1;
}
server{
location ~ .*\.jsp$ {
proxy_pass http://tomcat;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
:wq
nginx -t
systemctl restart nginx.service
cd /usr/local/nginx/html
vim index.html
#qingkong
this is static
server 192.168.118.20:8080 weight=1;
}
server{
location ~ .*\.jsp$ {
proxy_pass http://tomcat;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
:wq
nginx -t
systemctl restart nginx.service
cd /usr/local/nginx/html
vim index.html
#qingkong
this is static