Tomcat的安装即使用

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



相关推荐
奋进的芋圆2 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin2 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20052 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉2 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国2 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882483 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈3 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_993 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹3 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理
专注_每天进步一点点3 小时前
【java开发】写接口文档的札记
java·开发语言