Tomcat的概念
Tomcat服务器是Java语言开发的,免费的开放源代码的Web应用服务器。
Tomcat处理静态HTML的能力远不及Apache或者Nginx,通常是作为一个Servlet和JSP容器,单独运行在后端。
Tomcat是由三个功能组合而成:
java servlet:Tomcat是一个servlet容器,负责管理和执行java-servlet,服务端的java程序,处理客户端的http请求后台响应
java server:服务端的配置,pages动态页面的技术就是由Java代码完成的,tomcat既可以作为以java代码为基础的动态页面,也可以处理和转发动态请求。
Tomcat的并发能力很差,仅适用于小项目
Tomcat核心组件
web容器:处理web请求,影响,动态页面的展示
jsp容器:解析index.jsp中java代码转换为servlet的代码,然后servlet编译执行。
jsp是一种技术模板,类似于html语言,允许在html文件当中,嵌入java代码
servler容器:接受web容器的请求,负责加载,初始化,执行和管理
connector:接受外部的请求已经响应请求
container:包含了engine host context webapp四个组件组成
service:包含了connector和container
engine:引擎,用来管理多个虚拟主机,一个service只能有一个engine
host;代表一个虚拟主机,也可以理解为站点
context:对应web应用
wrapps:最终的封装器,容器的最底层,index.jsp
Tomcat的安装
安装java
c
apt -y install openjdk-8-jdk-headless
把apache-tomcat安装包放到opt目录下并解压
重命名为tomcat并移到/usr/local/目录下
tomcat目录下的内容:
bin:启动和关闭脚本文件
conf:tomcat的配置文件
logs:tomcat的日志文件
webapps:保存不同项目的应用目录
work:工作目录
temp:临时文件保存目录
c
切换到/usr/local/bin目录下,执行
./startup.sh
#开启tomcat
netstat -antp | grep 8080
#查看端口是否正常启动
在浏览器上输入对应的网址加上8080端口,查看网页是否正常
配置多台虚拟主机
c
cd /usr/local/tomcat/webapps
mkdir test1 test2
cd test1/
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>
保存退出
cd ../test2
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.test2.com");%>
</body>
</html>
保存退出
cd /usr/local/tomcat/conf
vim server.xml
<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.test2.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test2" path="" reloadable="true" />
</Host>
保存退出
cd ../conf
./startup.sh
vim /etc/hosts
192.168.42.20 www.test1.com www.test2.com
保存退出
www.test1.com域名
www.test2.com域名
Tomcat的优化和动静分离
Tomcat的优化
默认的安装情况下,tomcat经常会假死的情况,所以tomcat需要进行优化
优化的三个方面
1、tomcat的配置优化
2、操作系统的内核优化
3、jvm调优
tomcat的配置优化
c
在tomcat的配置文件的第69行
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="50"
enableLookkups="false"
disableUpploadTimeout="true"
acceptCount="300"
processorCache="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"/>
8080: tomcat对外提供访问的默认端口
protocol: 默认的协议就是http/1.1
connectionTimeout:连接的超时时间 20000毫秒=20秒
redirectPort:如果是https,自动转到8843,为https协议服务的
maxThreads="500" :tomcat可以创建最大的线程数
minSpareThreads="50":空闲线程的最小数量,用来处理溢出部分的请求
enableLookkups="false":禁用反向解析,提高访问速度
disableUpploadTimeout="true":开启上传的超时时间,连接在上传期间不存在超时的情况
acceptCount="300":当线程都在忙碌的时候,可以排队等待处理的请求数量
processorCache="500":连接器可以缓存的最大处理的数量
URIEncoding="UTF-8":设置字符集编码
compression="on":开启响应内容的压缩功能
compressionMinSize="2048":如果文件大小超过2M(2048KB),才会进行压缩。
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png":支持被压缩的文件类型,包括HTML、XML、JavaScript、CSS、纯文本、GIF图像、JPEG图像和PNG图像。
c
在网页浏览tomcat的配置
vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
第20行
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />改成
allow=.*/>
vim /usr/local/tomcat/conf/tomcat-user.xml
第22行
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
可以在网页上查看tomcat的配置
操作系统的内核优化
在/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优化
c
vim /usr/local/tomcat/bin/catalina.sh
第119行
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服务端的优化:
-Xms2048m:设置JVM分配的最小内存为2048MB。
-Xmx2048m:设置JVM分配的最大内存为2048MB。
2核4G:设置成的内存
官方建议,初始大小核最大值设置成一样的值,一般是物理内存大小的一般
-Xmn768m:设置新生代的内存大小为768,建议设置成整个堆内存大小的3/8
-XX:ParallelGCThreads=2:设置资源回收器的线程数量是2
-XX:MetaspaceSize=128m:设置元空间的初始大小
-XX:MaxMetaspaceSize=512m:设置元空间的最大值,元:都是保存数据的核心信息
-Djava.awt.headless=true :启用无图形界面的模式,防止在linux系统下,web页面无法正常显示图片
-XX:+DisableExplicitGC:垃圾回收机制的信息在后台显示
内存匹配改变
Eden Space: 堆内存 用来存储新创建的对象,这一部分的是完全分配给新创建的对象使用
G1 Old Gen:堆内存 存储的是长时间活动的对象
Survivor Space :堆内存,存储中中生代的对象
CodeHeap 'non-nmethods':非堆内存,存储已经编译的代码
CodeHeap 'non-profiled nmethods':非堆内存,已经被压缩的类定义
CodeHeap 'profiled nmethods':非堆内存当中的元数据信息
Compressed Class Space:存储已压缩的类定义
Metaspace:元数据空间的大小
ajp:ajp是一种协议,ajp协议:是tomcat服务端和前端的服务器进行连接的协议
作用:提供负载均衡和高效请求的转发
nio:nio技术:异步非阻塞通信
和前端服务器通信的端口是8009
Tomcat的动静分离
c
nginx1服务器
vim nginx.conf
upstream tomcat {
server 192.168.42.30:8080 weight=3;
server 192.168.42.40:8080 weight=2;
}
...
location ~* \. jsp$ {
proxy_pass http://tomcat;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HOST $host;
#设定后端服务器收到的请求访问的主机名,域名,ip端口。默认的proxy_pass
#指定的主机名,是代理的主机名,不是客户端的真实主机名
}
保存退出
systemctl restart nginx
tomcat第一台
cd /usr/local/tomcat/webapps
mkdir test1
cd test1/
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>
保存退出
cd /usr/local/tomcat/conf
vim server.xml
<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>
tomcat第二台
cd ../test2
vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
保存退出
cd /usr/local/tomcat/conf
vim server.xml
<Host name="www.test2.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/test2" path="" reloadable="true" />
</Host>
保存退出
cd ../conf
./startup.sh
按照以下配置配置出tomcat的动静分离
客户端: 浏览器
nginx1: 调度器 192.168.42.20
nginx2 静态页面 192.168.42.30
nginx3 静态页面 192.168.42.40
tomcat1: 后端服务器1 动态 192.168.42.21
tomcat2: 后端服务器2 动态 192.168.42.22
c
调度器
cd /usr/local/nginx/conf
vim nginx.donf
#全局
stream {
upstream xy104 {
server 192.168.42.30:80;
server 192.168.42.40:80;
}
server {
listen 81;
proxy_pass xy104;
}
}
保存退出
systemctl restart nginx
nginx2的配置
cd /usr/local/nginx/html
vim index.html
this is xy104
保存退出
cd ../conf
vim nginx.conf
#http模块
upstream tomcat {
server 192.168.42.21:8080;
server 192.168.42.22:8080;
}
#server模块
server {
....
keepalive_timeout 0;
location ~* \.jsp$ {
proxy_pass http://tomcat;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded-for;
proxy_set_header Host $host;
}
....
}
保存退出
systemctl restart nginx
nginx3的配置
cd /usr/local/nginx/html
vim index.html
this is xy105
保存退出
cd ../conf
vim nginx.conf
#http模块
upstream tomcat {
server 192.168.42.21:8080;
server 192.168.42.22:8080;
}
#server模块
server {
....
keepalive_timeout 0;
location ~* \.jsp$ {
proxy_pass http://tomcat;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded-for;
proxy_set_header Host $host;
}
....
}
保存退出
systemctl restart nginx
tomcat1的配置
cd /usr/local/tomcat/webapps
mkdir test1
cd test1/
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>
保存退出
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/test1" path="" reloadable="true" />
</Host>
cd ../bin
./shutdown.sh
./startup.sh
tomcat2的配置
cd /usr/local/tomcat/webapps
mkdir test2
cd test2/
vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
保存退出
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/test2" path="" reloadable="true" />
</Host>
cd ../bin
./shutdown.sh
./startup.sh