tomcat

1.什么是tomcat?

tomcat是一个开源的web应用服务器,区别于nginx,nginx主要处理静态页面,那么动态请求(连接数据库,动态页面)并不是nginx处理的长相,动态的请求会交给tomcat进行处理。

2.tomcat的作用

1.处理动态页面(基于http的请求)

2.处理后端请求(调用数据库服务器)

3.易部署 tomcat会自动识别配置文件,自动部署运行。

4.轻量级的服务软件,处理中小架构的网站可以满足,大型的交互需求,tomcat就非长相了。(Python node.js 容器化来处理)在容器化部署的项目架构中是不使用tomcat的,都是用jar包直接运行,包括k8s

3.tomcat的核心组件

1.web容器:完成web功能 处理请求也是nginx转发的http(s)请求,处理动态页面(基于java代码编译的页面) 处理后端的请求(转发到数据库的请求)

2、servlet:catalina是整个tomcat处理的底层逻辑,处理web请求的动态页面,也处理后端请求(数据库)

3.jsp:jsp会把动态页面翻译成serlvet的代码,用编译后的规则,显示代码的静态页面

4.tomcat的核心功能

功能部分有两个块组成:

接收和响应外部请求的连接器 connector

负责处理请求的 container

Engine:引擎 管理多个虚拟主机 一个tomcat里面只能有一个Engine

host:代表站点,也就是虚拟主机,一个Engine可以有多个host

context:一个context指向一个web应用

wrapper:最底层,处理和编译代码,运行结果。

5.tomcat的文件内容

bin:存放启动或者关闭tomcat的脚本文件 starup.sh shoutdow.sh

conf存放的是配置文件,sever.xml就是tomcat的主配置文件

webapps:tomcat默认的web应用的部署目录

work:tomcat的工作目录,存放jsp编译之后产生的class文件,清缓存会用到。

6.安装tomcat

systemctl stop firewalld.service

setenforce 0

rpm -ivh jdk-8u201-linux-x64.rpm

java -version

vim /etc/profile.d/java.sh

source /etc/profile.d/java.sh

java -version

tar -xf apache-tomcat-9.0.16.tar.gz

mv apache-tomcat-9.0.16 /usr/local/tomcat

netstat -antp | grep 8080

/usr/local/tomcat/bin/shutdown.sh

/usr/local/tomcat/bin/startup.sh

netstat -antp | grep 8080

7.配置虚拟主机

1.创建 kgc 和 benet 项目目录和文件

mkdir /usr/local/tomcat/webapps/kgc

mkdir /usr/local/tomcat/webapps/benet

echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp

echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp

2.修改 Tomcat 主配置文件 server.xml

vim /usr/local/tomcat/conf/server.xml

--165行前--插入

<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

<Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />

</Host>

<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />

</Host>

/usr/local/tomcat/bin/shutdown.sh

/usr/local/tomcat/bin/startup.sh

3.客户端浏览器访问验证

echo "192.168.233.71 www.kgc.com www.benet.com" >> /etc/hosts

浏览器访问 http://www.kgc.com:8080/ 页面显示This is kgc page\!

浏览器访问 http://www.benet.com:8080/ 页面显示This is benet page\!

8.tomcat的优化

默认配置并不适合生产环境,频繁出现假死

需要通过压力测试不断优化,提高稳定

1.配置文件优化

2.jvm优化

3.操作系统优化(内核优化)

8.1配置文件优化

vim /usr/local/tomcat/conf/server.xml

71行

maxThreads="200"

#tomcat使用线程来处理接受的每个请求,可以创建的最大线程数,支持的最大并发连接数200

minSpareThreads="200"

#最小空闲线程数,tomcat启动时的初始化的线程数,表示没人请求,也要打开这些空的线程等待请求 10

maxSpareThreads="-1"

#最大备用线程数,创建线程的超过这个值,tomcat会关闭不再需要的线程,默认是-1(不做限制)

connectionTimeout="20000"

#网络连接超时,设置为20000ms

enableLookups="faise"

#是否反向解析域名,不解析,提高处理效率

disableUploadTimeout="true"

#上传文件时,是否启用超时限制

connectionUploadTimeout="15000"

#上传比下载要耗时,根据需求自定

acceptCount="100"

#所有的可以使用的线程都被占用,可以传入的队列长度的最大值

compression="on"

#是否对响应的数据进行gzip压缩 force#所有情况下都进行压缩 压缩之后页面大小可以减少1/3

noCompressionUserAgents="gozilla chrom"

#对指定访问的浏览器,不进行压缩

8.2 优化内存

vim /usr/local/tomcat/bin/catalina.sh

-server :一定要作为第一个参数

-Xms2048m: java初始化堆的大小,是分配vm的最小内存。cpu性能高,可以值再设高一点

-Xmx2048m:最大java堆的大小,是分配ym的最大内存,取决于物理内存有多大。建议-xms和xmx的值,设置成一样,推荐是你物理的内存的一般。

目的: java的垃圾回收机制清理完堆区后,不需要重新分隔计算堆区的大小。

-Xmn768m :新生代内存的大小。官方推荐整个堆大小的3/8.

-XX:ParallelGCThreads=2

配置并行收集器的线程数,有多少个线程一起进行垃圾回收,官方推荐:与cpu数量相同。

-XX:PermSize=1024m

设置非堆内存的初始值,持久代内存的大小,一般设置为物理内存的1/4.

-XX:MaxPermSize=1024m

最大非堆内存的大小,持久代内存的最大值,一般设置成物理内存的1/4.

-Djava.awt.headless=true

避免在linux环t境下,web不能展示图片

-XXK:+DisableExplicitGc

禁止调用system.gc(),误调用了gc方法,会导致整个jvm的响应速度降低.

8.3 内核优化

Linux内核优化中主要针对两个配置文件 /etc/security/limits.conf 和/etc/sysctl.conf

[root@www opt]# sysctl -a |grep fs.file-max

永久配置:

注意:设置保存后,需要重新ssh连接才会看到配置更改的变化

vim /etc/security/limits.conf

65535 为Linux系统最大打开文件数

* soft nproc 65535

* hard nproc 65535

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535: 最大进程数软限制为 65535,即可以使用 ulimit -u 命令查看和修改的值。

* hard nproc 65535: 最大进程数硬限制为 65535,即最大可分配的进程数。

* soft nofile 65535:最大打开文件数软限制为 65535,即可以使用 ulimit -n 命令查看和修改的值。

* hard nofile 65535:最大打开文件数硬限制为 65535,即最大可分配的文件数。

这里使用的通配符 * 表示对所有用户生效。

其他调试内核参数的查看: sysctl -a

kernel.sysrq = 0: 禁用了内核的SysRq功能,SysRq允许在系统崩溃或出现问题时执行一些调试操作。

kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。

kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。

kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。

net.ipv4.ip_forward = 0: 禁用IP数据包的转发功能,通常用于不充当路由器的系统。

net.ipv4.conf.default.rp_filter 和 net.ipv4.conf.all.rp_filter: 控制反向路径过滤,提高网络安全性。

net.ipv4.icmp_echo_ignore_all: 允许或禁止系统响应ping请求。

net.ipv4.icmp_echo_ignore_broadcasts: 禁止系统对广播和多播地址的ICMP回显和时间戳请求作出响应。

net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,保护系统免受TCP SYN 攻击。

net.ipv4.tcp_max_tw_buckets = 6000: 设置允许的TIME_WAIT套接字最大数量,避免服务器性能下降。

net.ipv4.tcp_sack = 1: 启用有选择的应答(SACK)来提高TCP性能。

net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 调整TCP套接字读取和写入缓冲区大小。

net.ipv4.tcp_mem: 设置TCP缓冲区的最小、默认和最大值。

net.core.wmem_default, net.core.rmem_default, net.core.rmem_max, net.core.wmem_max: 调整网络核心

缓冲区的大小。

net.core.netdev_max_backlog: 控制网络接口接收数据包的排队队列大小。

net.ipv4.tcp_max_orphans: 设置系统允许的孤立TCP连接最大数量。

net.ipv4.tcp_max_syn_backlog: 控制系统允许的三次握手队列长度。

net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries: 设置SYN-ACK和SYN请求的重试次数。

net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。

net.ipv4.tcp_fin_timeout: 设置TCP连接FIN(关闭连接)的超时时间。

net.ipv4.tcp_keepalive_time: 设置TCP keepalive探测包发送频率,以检测连接状态。

net.ipv4.ip_local_port_range: 设置本地端口范围,用于分配本地应用程序端口。

net.ipv6.conf.all.disable_ipv6 和 net.ipv6.conf.default.disable_ipv6: 禁用IPv6。

net.netfilter.nf_conntrack_max 和其他 net.netfilter.nf_conntrack_*: 控制连接跟踪和防火墙相关设置。

net.nf_conntrack_max: 设置最大连接跟踪项数。

vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。

vm.swappiness = 0: 设置内存交换行为,降低内存交换。

fs.file-max = 999999: 设置进程可以同时打开的最大文件句柄数。

net.ipv4.tcp_max_tw_buckets = 6000: 设置操作系统允许的TIME_WAIT套接字最大数量。

net.ipv4.ip_local_port_range = 1024 65000: 设置系统允许的本地端口范围。

net.ipv4.tcp_tw_recycle = 1: 启用TIME_WAIT套接字快速回收。

net.ipv4.tcp_tw_reuse = 1: 允许TIME-WAIT套接字重用。

net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,防止TCP SYN 攻击。

net.core.somaxconn = 40960: 设置最大监听队列长度,用于控制最大并发连接数。

net.core.netdev_max_backlog = 262144: 设置每个网络接口接收数据包队列的最大大小。

net.ipv4.tcp_max_syn_backlog = 262144: 设置接受SYN请求队列的最大长度。

net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 设置TCP套接字读取和写入缓冲区的最小、默认和最大大小。

net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max: 设置内核套接字接收和

发送缓冲区大小。

net.ipv4.tcp_syncookies = 1: 设置启用SYN Cookies,用于解决TCP SYN 攻击。

相关推荐
Jason-河山3 分钟前
利用 Python 爬虫采集 1688商品详情
java·http
计算机源码社3 分钟前
分享一个餐饮连锁店点餐系统 餐馆食材采购系统Java、python、php三个版本(源码、调试、LW、开题、PPT)
java·python·php·毕业设计项目·计算机课程设计·计算机毕业设计源码·计算机毕业设计选题
Zww08917 分钟前
idea插件市场安装没反应
java·ide·intellij-idea
夜雨翦春韭9 分钟前
【代码随想录Day31】贪心算法Part05
java·数据结构·算法·leetcode·贪心算法
计算机学姐9 分钟前
基于微信小程序的调查问卷管理系统
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
problc20 分钟前
Android 组件化利器:WMRouter 与 DRouter 的选择与实践
android·java
程序员南飞2 小时前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
弥琉撒到我2 小时前
微服务swagger解析部署使用全流程
java·微服务·架构·swagger
一颗花生米。3 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼3 小时前
Java基础-单例模式的实现
java·开发语言·单例模式