tomcat

1、tomcat

和php一样都是用来处理动态页面

tomcat也可以作为web应用服务器,是开源的

php处理的是以.php为结尾的

tomcat处理的是以.jsp为结尾的

nginx处理的是以.html为结尾的

tomcat是用java代码写的程序,运行的是java的web应用程序

1.1tomcat的特点和功能

1、servlet容器:执行java的servlet,是服务端的java程序,用来处理客户端的http请求以及响应

2、jsp容器:javaserver page,是一个动态页面技术,可以在html的页面里面嵌入java代码

3、自身也是一个http服务器

4、tomcat是一个轻量级的动态页面处理程序,高并发场景不适用

重要的:优化,tomcat自身的优化,以及系统的内核优化,jvm优化

1.1.1servlet

是java语言当中用来开发web应用程序的关键组件

功能:

1、处理http请求

2、生成动态内容以及响应客户端的请求

3、处理java的业务逻辑

4、进行会话管理,保持用户的状态信息,购物车同步,用户登录等

5、转发nginx的动态请求到数据库

jsp:web用户程序的界面,界面的语言是用java实现的。以.jsp为结尾的文件

1.2tomcat的组件

connector:是一个接收器,负责对外接收和响应请求,是tomcat与客户端沟通的一个枢纽,监听端口接收外界请求。tomcat默认端口:8080

接收了请求之后,传递给其他组件进行处理,处理完成之后回到connector,再响应客户端

container:负责处理业务逻辑,由四部分组成:engine host context wrapper

engine:用来管理多个虚拟主机。一个service只有一个engine

host:一个host就是一个主机,也可以叫站点,通过配置host可以添加多个站点

context:一个context代表一个web应用

wrapper:封装器,负责处理最底层的逻辑

service:对外提供外部服务,包含connector和container

tomcat可以有多个service,每个service之间是互相独立的

1.3安装tomcat

将安装包拖进去,关闭防火墙

安装jdk

[root@test3 opt]# rpm -ivh jdk-8u201-linux-x64.rpm

环境已安装好

[root@test3 opt]# java -version

openjdk version "1.8.0_181"

OpenJDK Runtime Environment (build 1.8.0_181-b13)

OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

设置java环境变量

[root@test3 opt]# 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

生效

source /etc/profile.d/java.sh

版本号升级了

[root@test3 opt]# java -version

java version "1.8.0_201"

Java(TM) SE Runtime Environment (build 1.8.0_201-b09)

Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

解压tomcat

[root@test3 opt]# tar -xf apache-tomcat-9.0.16.tar.gz

改名为tomcat,并且移动到/usr/local/

[root@test3 opt]# mv apache-tomcat-9.0.16 tomcat

[root@test3 opt]# mv tomcat/ /usr/local/

启动tomcat

[root@test3 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/java/jdk1.8.0_201-amd64

Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

Tomcat started.

查看端口是否开启

[root@test3 bin]# netstat -antp | grep 8080

开始访问

打开Manager APP

进入context.xml,站点信息

重启

[root@test3 bin]# ./shutdown.sh

[root@test3 bin]# ./startup.sh

查看端口已开启

tomcat页面已打开

1.4tomcat目录的作用

1、bin:存放启动和关闭tomcat脚本的文件,startup.sh shutdown.sh

2、conf:存放tomcat的主配置文件,server.xml主配置文件

3、context.xml:host的默认配置信息

4、tomcat-user.xml:登录时认证用户和密码的相关信息,manager文件必须要赋权修改之后才能打开

5、lib:tomcat运行时需要的jar包,一般不动

6、logs:日志文件。catalina.out主日志文件

7、temp:存放tomcat运行时产生的文件

8、webapps:部署web应用的目录,类似于nginx的html

2、tomcat的优化

2.1tomcat自身的优化

tomcat的并发处理能力不强。大项目不使用tomcat作为转发动态的中间件(k8s集群,python rubby,小项目会使用(内部使用)

优化tomcat的启动速度

file:/dev/urandom :非阻塞的版本,不依赖系统的终端,进程忙也不会进入等待状态,处理速度相对较快。如果对应用的安全性要求比较高,只能用file:/dev/random

默认配置不适合生产环境,可能频繁出现假死,需要不停的重启。

根据生产环境的实际情况,自行测试

port 8080:http的端口

8443:https的端口 (接收客户端https的请求)

vim server.xml

maxThreads:tomcat使用线程来处理进程的个数。tomcat最多可以创建多少个线程,默认是200个

minSpareThreads:最小空闲数线程,tomcat开启之后,没人使用也会有进程待命,默认值是10

maxSpareThreads:最大空闲数线程,一旦线程总数超过这个值,tomcat就会关闭不再需要的线程,默认是-1,不限制,一般不设置

connectionTimeout="20000":网络连接超时时间,单位是毫秒,设置成0 就是永不超时。默认即可

enableLookups:是否支持反向解析,true,false。一般都是关闭false,可以提高处理速度

disableUploadTimeout:上传时是否使用超时机制,默认是10s,true是禁用,false是开启

connectionUploadTimeot:上传的超时时间

acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以接入请求的最大队列长度。超过了这个数字的请求将被不予处理(直接丢弃),默认是100个

compression:是否对响应数据进行压缩,on是开启,off是关闭。开启压缩之后可以有效的减少页面的大小(文件无效,图片音频视频)一般可以减少三分之一,节省带宽,默认off

如果compression="on"

compressionMinSize:表示响应压缩的最小值,只有响应报文大于这个值才会进行压缩。如果开启了压缩,默认值是2048

noCompressionUserAgents="浏览器名称":对于这些浏览器,不启用压缩

compressableMimeType=" ":压缩类型,指定对哪些类型的文件进行压缩

常用的页面类型:

文本类型:text/plain,text/html,text/css,text/javascript

图片类型:image/jpg,image/jpeg,image/gif

音频类型:audio/ogg,wav,mpeg

视频类型:video/mp4,webm,rmvb,quicktime

应用程序:application/pdf,json,xml

2.2内核优化:系统安全的优化补齐

内核优化的配置文件:

1、vim /etc/security/limits.conf

打开文件数的限制,系统初始化第一步要做的事情

2、内核参数文件:vim/etc/sysctl.conf

sysctl -a 查看当前系统默认的内核参数

net.ipv4.ip_forward=0/1:禁用或者开启数据包的转发功能,如果要做路由器必须打开。0是关,1是开

net.ipv4.tcp_max_tw_buckets=2000:允许timewait的最大数量

net.ipv4.tcp_sack=1:启用有选择的应答,可以提高tcp的处理性能

net.core.netdev_max_backlog=262144:网络接收数据包队列的最大的大小

vm.swappiness=0:关闭内存的交换行为,不使用交换工具,k8s默认就不能使用交换分区,否则会报错

net.ipv4.tcp_max_orphans:系统允许的最大的tcp的连接数量

net.ipv4.ip_local_port_range=1024-65000:设定系统的端口范围

net.ipv4.tcp_fin_timeout=10:设置tcp关闭连接的超时时间

net.ipv4.tcp_keepalive_time:设置tcp的keepalive包的探测包的发送频率,用于检测连接状态

2.3JVM优化

vim catalina.sh

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自带垃圾回收机制,java进行垃圾回收之后,不需要重新计算堆区的大小。

堆区有三类:新生代、中生代、老年代

每生成一个新的对象,对象占用的内存空间就是新生代空间。垃圾回收对堆区当中的资源进行回收之后,新生代没有被回收的资源就转移到中生代,中生代的就会转移到老年代

整个jvm堆的大小:新生代+老年代+永久代(系统自带的)

-XX:ParallelGCThreads=2:配置并行收集器的线程数,同时有多少个线程一起进行垃圾回收,配置成cpu的一半

-XX:PermSize=1024m:设置非堆内存的初始值,持久代内存的大小,默认是物理内存的四分之一,建议设置成整个jvm内存的一半

非堆内存是不会被java的垃圾回收机制处理的

-XX:MaxPermSize=1024m:非堆内存的最大值,和初始值一致即可

-Djava.awt.headless=true:防止在linux访问的情况下,web页面的图片不能打开

-XX:+DisableExplicitGC":老年代的收集算法,缩短垃圾回收机制的时间

tomcat server status 下各部分的含义:

PS Eden Space:堆内存,创建一个新的对象都在堆内存当中

PS Old Gen:堆内存,长期存活的对象,永生代

PS Survivor Space:堆内存,PS Eden Space和PS Old Gen之间的存活对象,中生代

Code Cache:非堆内存,存储已经编译的代码

Compressed Class Space:非堆内存,存储已经压缩过的类定义

Metaspace:非堆内存,存储元数据的区域

ajp-nio-8009

ajp-nio:连接器的类型,ajp是协议,nio是技术,异步非阻塞的通信访问

ajp协议的作用:tomcat服务器和web服务器之间进行连接的协议,可以提供负载均衡和高效转发。nio可以提高并发的处理能力

8009:ajp协议的默认端口

3、tomcat和nginx实现动静分离

访问nginx就是静态页面

nginx代理index.jsp,可以实现tomcat的动态页面

实验步骤:

关闭防火墙

[root@tomcat1 ~]# systemctl stop firewalld

[root@tomcat1 ~]# setenforce 0

先配置tomcat1和tomcat2,查看端口是否开启,访问是否正常

[root@tomcat1 bin]# netstat -antp | grep 8080

tomcat1、tomcat2各创建一个test目录

[root@tomcat1 tomcat]# cd webapps/

[root@tomcat1 webapps]# mkdir test

在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>

在conf目录下vim server.xml

开启tomcat

[root@tomcat1 bin]# ./shutdown.sh

[root@tomcat1 bin]# ./startup.sh

查看端口是否开启

[root@tomcat1 bin]# netstat -antp |grep 8080

可以访问动态页面

开始配置nginx

重启nginx

[root@nginx1 nginx]# systemctl restart nginx

先将nginx.conf文件备份

[root@nginx1 conf]# cp nginx.conf nginx.conf.bak.2024.07.08

进入nginx.conf修改配置文件

访问的是静态页面

访问动态页面

相关推荐
ProtonBase11 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
乐之者v18 分钟前
leetCode43.字符串相乘
java·数据结构·算法
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭9 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫9 小时前
泛型(2)
java
超爱吃士力架9 小时前
邀请逻辑
java·linux·后端
南宫生9 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论