tomcat基本概念
tomcat是一个web应用,也是一种jave编译的程序
tomcat的功能组成
tomcat是由三个功能组合而成的,如下:
java servlet:tomcat是一个servlet的容器,负载管理和执行java-servlet,服务短的java程序。处理客户端的http的请求和响应。
java server:服务端的配置
pages:动态页面的技术------>java代码完成的。
- tomcat既可以作为以java代码为基础的动态页面,也可以处理和转发动态请求。
- tomcat的并发能力很差,适合小项目。
tomcat的核心组件
web容器:处理web的请求,影响,动态页面的展示。
jsp容器:解析Index.jsp中的java代码转换为server的代码,然后servlet编译执行。jsp是一种技术模板,类似于html语言,允许html文件当中,嵌入java的代码。
servlet容器:接受web容器的请求,负责加载,初始化,执行和管理。
tomcat的功能组件
connector:接受外部的请求以及响应
container:容器,包含了engine、host、context、webapp四个组件
service:包含了connector和container
engine:引擎,用来管理多个虚拟主机,一个service只能有一个engine
host:代表一个虚拟主机,也可以理解成为站点
context:对应的web应用
webapp:最终的封装器,容器的最底层,index.jsp
tomcat的文件目录
bin:启动和关闭的脚本文件
conf:tomcat的配置文件
logs:tomcat的日志文件
webapps:保存不同项目的应用目录
work:工作目录
temp:临时文件保存目录
安装tomcat步骤
1、apt -y install openjdk-8-jdk-headless #安装java的依赖环境
2、将准备好的tocat压缩包,解压;并将解压后的包移到/usr/local/目录下
3、到 /tomcat/bin目录下,./startup.sh启动/tomcat即可(shutdown.sh是关闭)
4、访问tomcat需要在加上他的默认端口8080,访问的页面便是tomcat的service
自定义service
1、在/tomcat/webapps/下创建访问目录和文件
两个index.jsp具体配置如下
2、配置主配置文件 /conf/server.xml,添加两个host如下,配置完之后,要./startup.sh启动
<Host name="www.test1.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test1" path="" reloadable="true" />
</Host>
- Host name:主机名"www.test1.com"
- appBase="webapps":web应用程序目录
- unpackWARs="true":是否对.war格式结尾文件进行展开,默认展开
- autoDeploy="true" :tomcat在运行时会自动部署webapps里面对应的配置
- xmlValidation="false":是否验证xml文件的有效性
- xmlNamespaceAware="false":是否启动xml的命名空间
- Context docBase="/usr/local/tomcat/webapps/test1":用来说明对应站点的工作的目录
一定要 netstat -antp | 8080 查看有没有起来,tomcat容易假起。
3、做域名映射
4、这时候我们访问tomcat页面就是我们所作的两个index.jsp页面
tomcat的优化
默认的安装情况下,tomcat经常会假死的情况,所有tomcat需要优化。
自身配置优化
当我们登录tomcat的时候会发现,无法访问Manager App等服务,是因为权限不够。
修改/tomcat/webapps/manager/META-INF/context.xml配置文件,改成允许任意地址,如下
修改/tomcat/conftomcat-users.xml用户权限配置文件,设置账号密码都是tomcat,操作和代码如下
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
重启tomcat后,我们便可以进入Manager App等服务,输入账号密码即可。
修改主配置文件 /conf/server.xml,在<Connectro>里面修改
- 8080:tomcat对外提供访问的默认端口
- protocol="HTTP/1.1":默认的协议就是http/1.1
- connectionTimeout="20000":连接的超时时间20000毫秒=20秒
- redirectPort="8443":如果是https,自动跳转到8443,https协议服务的
添加如下内容
- maxThreads="500":tomcat可以创建的最大线程数
- minSpareThreads="50":空闲线程的最小数量,用来处理溢出部分的请求
- enableLookups="false":禁用反向解析,提高访问速度
- disableUploadTimeout="true":开启上传的超时时间,连接在上传期间不存在超时的情况
- acceptCount="300":当所有线程都在忙碌的时候,可以等待排队处理的请求数量
- processorCache="500":连接器可以缓存的最大处理数量
- URlEncoding="UTF-8":设置字符集编码
- compression="on":开启对响应内容的压缩功能
- compressionMinSize="2048":如果大小超过2M,才会进行压缩
- compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image /jpg,image/png"/> :支持被压缩的文件类型
这时候我们重启tomcat服务后,会发现页面内容已经修改了我们设定的
内核优化
vim /etc/sysctl.conf #修改内核配置文件
添加如下所需的配置即可
net.ipv4.ip_forward=0 #开启服务数据的路由功能
net.ipv4.tcp_syncookies = 1 #启动SYN cookies功能,避免tcp SYN的攻击
net.ipv4.tcp_max_tw_buckets = 6000 #系统中允许出现的最大的time_wait的数量
net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。
vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。
net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。
kernel.sysrq = 0: 禁用了内核的sysrq功能,sysrq允许在系统崩溃或有问题时执行一些调试操作。
kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。
kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。
kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。
jvm调优
修改 /tomcat/bin/catalina.sh 配置文件,添加如下代码
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -Djava.awt.headless=true -XX:+DisableExplicitGC"
- $JAVA_OPTS -server:jvm服务端的优化
- Xms:jvm分配的最小内存
- Xmx:jvm分配的最大内存
- 2048m:官方建议,初始大小和最大值设置成一样的值,一般是物理内存大小的一半。
- Xmn768m:设置新生代的内存大小,官方建议设置成整个堆内存的3/8。
- XX:ParallelGCThreads=2:设置资源回收器的线程数量是2
- XX:MetaspaceSize=128m:设置元空间(元:保存数据的核心信息)的初始大小
- XX:MaxMetaspaceSize=512m:元空间的最大值
- Djava.awt.headless=true:启用无图形界面的模式,防止在linux系统下web页面无法正常显示图片
- XX:+DisableExplicitGC:垃圾回收机制的信息在后台显示
修改完我们可以发现tomcat网页已经修改成我们设置的
ajp-nio-8009
ajp:内部通信的协议,tomcat服务端和前端的服务器进行连接的协议,提供负载均衡和高效请求的转发。
nio:nio技术,异步非阻塞通信
8009:和前端服务器通信的端口8009
tomcat的动静分离
如下图所示,我们使用五台主机,完成动静分离,具体配置如下:
zw4:192.168.254.14(代理服务器)
zw5:192.168.254.15(前端服务器,静态页面)
zw6:192.168.254.16(后端服务器,静态页面)
tocat1:192.168.254.21(后端服务器,动态页面)
tocat2:192.168.254.22(后端服务器,动态页面)
我们实现访问代理服务器zw4,就是访问静态页面zw5和zw6;通过zw5和zw6,访问代理服务器zw4,也可以访问动态页面tocat1和tocat2。
数据流向图如下:
注意:四层代理不能处理数据,但是可以对数据包进行转发。也就是说在代理服务器zw4上做四层代理两个静态页面,再在两个静态页面上做七层代理两个动态页面,即可实现动静分离。
操作步骤
1、配置zw4的nginx主配置文件,配置四层代理zw5和zw6
配置完之后代表我们主机zw4便代理了两个静态页面
2、配置zw5和zw6的nginx主配置文件,配置七层代理tocat1和tocat2
配置完之后代表zw5和zw6便代理了两个动态页面,zw4可以通过zw5和zw6访问tocat1和tocat2
3、配置tocat1和tocat2动态页面,自定义server,具体操作如下
tocat1配置动态页面1,路径 /tomcat/webapps/test1/index.jsp
tocat2配置动态页面2,路径 /tomcat/webapps/test2/index.jsp
注意我们这边使用了localhost,这样我们就不要通过访问目录来访问tocat页面,但是上面原有的localhost的<Host>的配置要删掉。
4、这样我们便可以实现动态分离
注意:根据数据流向,我们zw4访问动态页面tomcat1和tomcat2是通过静态页面zw5和zw6访问,故一定要加上我们给zw5和zw6定义的端口号81。