Tomcat服务部署和优化-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

一、Tomcat

1、Tomcat作用

2、Tomcat的核心组件

3、servlet作用

4、Tomcat的核心功能

二、tomcat配置


一、Tomcat

是一个开源的web应用服务器nginx主要处理静态页面那么静态请求连接数据库动态页面并不是nginx的强项鼎泰的请求会交给Tomcat进行处理

nginx——转发动态请求——Tomcat

1、Tomcat作用
  1. 处理动态页面基于http的请求
  2. 处理后端请求调用数据库服务
  3. 易部署Tomcat会自动识别配置文件。自动部署运行

Tomcat的缺点是一个轻量级的服务软件处理中小架构的网站可以满足需要大型的交互需求Tomcat就非长相了

可以替换为Python和node.js、容器化来处理大型架构网站

在容器化部署的项目架构中是不使用Tomcat的都是jar包直接运行包括k8s

2、Tomcat的核心组件

1、web容器完成web功能处理的请求也是nginx转发的httphttps请求处理的是动态页面基于Java代码编译的页面

也可以处理后端的请求转发到数据库的请求

  1. servletcataline是整个Tomcat处理的底层逻辑。处理web请求的动态页面也处理后端请求数据库
  2. jspjsp会把动态翻译成serlvet的代码。用编译后的规则显示代码的静态页面。

静态页面html

动态页面php index.php

                  jsp index.jsp    ——由java格式写成的代码靠jsp翻译servlet执行编译后的代理最后在展示结果

容器容器通常指的是一种虚拟化技术允许在当前的操作系统中虚拟化的运行多个独立的环境。独立运行的环境就是我们说的容器彼此之间相互隔离拥有自己的系统资源。宿主容器寄生在宿主中使用的是宿主的资源。

servlet容器用于开发web应用程序的关键组件

处理http请求生成动态内容以及与客户端之间的交互、和前端交互 、后端数据库服务器交互、和redis缓存交互

类Java当中调用各种方法由开发人员自定义

3、servlet作用

根据类中的方法处理http请求

生成动态页面内容

会话管理处理用户对话跟踪用户在互通请求之间的状态。servlet可以在用户访问不同页面时保持用户的状态信息购物车同步用户同步登录

JSPjava server pages 动态网页的开发技术使用JSP的标签可以在html的网页当中插入java代码。

<% 开头

%> 结尾

实现一个基于Java web应用程序的访问界面。用户界面。或者访问数据库生成页面内容

4、Tomcat的核心功能

功能部分由两个块组成

由接收和响应外部请求的连接器connector和负责处理请求的 container组成

engine引擎管理多个虚拟主机一个Tomcat里面只能有一个engine

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

context一个context指向一个web应用

wrapper最底层处理和编译代码运行结果。运行出来的结果在往上层反馈到连接器最后到用户

java组件

JDK开发工具包开发Java的应用程序。jdk包括编译器、调试器、等等以及java的类库

是开发者用来创建、编译、运行java程序的重要组件

JVMjava的虚拟机负责编译后的java字节码编程本地的机器码。主要就是运行java的代码

运行完之后jvm提供内存管理、垃圾回收机制、线程管理。

二、tomcat配置

安装Tomcat先安装java环境

安装rpm软件rpm -ivh 包名

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

rpm -ql | tail -n 1

查找rpm安装软件的安装路径

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

java -version

查看java版本

安装Tomcat解压即可

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

将软件剪切到local目录下面去

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

进入/usr/local/tomcat

目录文件

bin存放启动或者关闭Tomcat的脚本文件startup.sh shoutdow.sh

conf配置文件目录server.xml主配置文件

webappsTomcat默认的web应用的部署目录

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

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

或者./startup.sh 启动Tomcat

如何对Tomcat配置虚拟主机
1、配置工作目录

在公司中运行多个项目一台部署Tomcat太多会浪费资源所以会在Tomcat中配置多个主机

通过不同域名访问不通的内容

www.test.com

www.koeda.com

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

然后conf server.xml中配置

148行 host 默认主机删除

160行重新添加host

Host name="www.test.com" 指定站点虚拟主机的域名

appBase="webapps" 站点的工作目录在webapps 存放web应用的目录

unpackWARs="true" 启动webapps时对WAR包进行展开

autoDeploy="true" 放置在默认应用目录的程序文件自动进行部署

xmIValidation="false" 是否验证xml文件执行的有效性标志false不检查

xmINamespaceAware="false" 是否启用xml文件的命令空间false不启用

docBase="/usr/local/tomcat/webapps/kgc":  web应用程序的具体部署位置也就是Context所属的Host中具体的工作目录

path为空默认就是webapps

reloadable="true"  允许重新加载Context相关的web应用程序的类。

这里和nginx的虚拟主机配置方法一样只不过换了一个写法

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>

开启关闭Tomcat

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

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

每次重启之后都要检查端口8080

netstat -antp | grep 8080

端口没起重启

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\!

启动

去虚拟机浏览器访问
www.test/koeda.com:8080         访

总结

  1. 请求到连接器连接器端口8080连接器接收请求
  2. 虚拟主机的host www.test.com 引擎engine管理虚拟主机———找host——www.test.com——找Context 访问的该主机的工作目录——webapps/test/index.jsp——wrapper——servlet来解析index.jsp内容
  3. 响应的内容返回到客户端

Tomcat的优化

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

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

  1. 配置文件优化
  2. jvm Java虚拟机优化
  3. 操作系统优化内核优化

  1. 配置文件优化面试题记3-5个

在71行左右

maxThreads="200"

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

miniSpareThreads="200"

#最小空闲线程数Tomcat启动时初始化的线程数表示即使每人请求也要打开这些空的线程等待请求默认10配置200足矣

maxSpareThreads

#最大备用线程数创建的线程如果超过这个值Tomcat会关闭不再需要的线程默认是-1对创建的线程不做限制不需要更改默认就好

connectionTimeout="20000"

#网络连接超时。设置为20000毫秒

enableLookups="false"

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

disableUploadTimeout="true"

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

connectionUploadTimeout=

#上传文件的超时时间没有固定的值根据需求自定

accpetCount="100"

#如果所有的可以使用的线程都被占用可以传入的队列长度的最大值默认100超过100个排队之后后面的进不来了

compression="on"  (offfalse是所有的情况下都进行压缩

#是否对响应的数据进行gzip压缩一般来说打开on就可以了压缩之后大小减小1/3

noCompressionUserAgents="gozilla/chrom"

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

以上配置位置

先shutdown再startup 重启之后一定要看端口

2、jvm优化

要把server status打开

/usr/local/tomcat/webapps/manager/META-INF/context.xml

进入/usr/local/tomcat/conf/tomcat-users.xml

<role rolename="manager-gui"/>

<user username="tomcat" password="tomcat" roles="manager-gui"/>

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2046m -Xx:PermSize-1024

m -XX:MaxPermSize=1024m -Xmn768m -Djava.awt.headless=true -XX:Disab

leExplicitGC"

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

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

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

目的java的垃圾回收机制清理完堆区之后必须要重新分隔计算堆区的大小

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

新生代java中每新建一个新的对象占用的内存就是新生代

中生代对象创建完毕之后占用的内存就是中生代

老年代java垃圾回收机制进行资源回收之后中生代中剩余的部分就是老年代

-XX:ParallelGCThreads=2 配置并行收集器的线程数有多少个线程一起进程垃圾回收官方推荐与cpu的数目相同

-XX:PermSize=1024m 设置非堆内存的初始值也就是java中的持久代内存的大小一般设置为物理内存的1/4

-XX:MaxPermSize=1024m最大非堆内存的大小持久代内存的最大值一般设置成物理内存的1/4

-Djava.awt.headless=true 避免在nginx环境下web页面不能展示图片

-XX:+DisableExplicitGC"禁止调用system.gc()误调用gc方法会导致整个jvm响应的速度降低

堆存储新创建的对象。

非堆存储编译之后的代码或者是压缩后的类或者是类的元数据

如何配置上面的配置

进入/usr/local/tomcat/bin/catalina.sh

重启 看端口

ajp-nio-8009

连接器当中的一种类型: ajp : 协议名称就叫ajp。nio: 异步非阻塞通信

8009是ajp协议的监听端口

ajpTomcat服务器和前端web服务器Apache nginx进行连接

提供负载均衡和高效的请求转发提高并发处理能力

http-nio-8080

用于处理http协议的网络请求

端口: 8080

内核优化

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

通常是利用调用内核参数的程序sysctl -a 查询出最优内核参数然后写入 /etc/sysctl.conf 文件内的。

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

fs.file-max = 197221     #查询出的文件句柄数量上限。

sysctl: reading key "net.ipv6.conf.all.stable_secret"

sysctl: reading key "net.ipv6.conf.default.stable_secret"

sysctl: reading key "net.ipv6.conf.ens33.stable_secret"

sysctl: reading key "net.ipv6.conf.lo.stable_secret"

sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"

sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"

文件句柄File Handle是操作系统用于跟踪和管理打开的文件或资源的数据结构。

在操作系统中每个打开的文件、网络连接、设备等都会被分配一个唯一的句柄

操作系统通过这个句柄来标识和访问这些资源。

句柄数是指操作系统能够同时管理的句柄的数量。在一个计算机系统中

许多应用程序和进程需要打开和使用文件、网络连接等资源。每个资源都需要一个句柄来进行操作。

如果系统的句柄数限制太低就可能导致应用程序无法打开足够的文件、网络连接或其他资源

从而影响系统的性能和可用性。

因此调整句柄数的设置是确保系统能够处理并发连接和资源请求的重要一环。

在高负载的服务器环境中适当地增加句柄数的限制可以提高系统的并发能力和性能。

但是过于激进地增加句柄数可能会消耗过多的系统资源因此需要根据实际需求和硬件配置进行调整。

永久配置

注意设置保存后需要重新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 攻击。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Tomcat