tomcat-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
内存Tomcat是一个开源的web应用服务器。区别去nginxnginx主要处理静态页面那么动态请求连接数据库动态页面并不是nginx处理的长相动态的请求会交给tomcat进行处理。
Nginx-----转发动态请求-----tomcat
tomcat1.处理动态页面http请求
2.处理后端请求调用数据库服务器
3.易部署tomcat会自动识别配置文件自动部署运行
4.轻量级的服务软件处理中小架构的网站可以满足大型的交互需求tomcat就非长相了。Python node.js容器化来处理在容器化部署的项目架构中是不使用tomcat的都是用jar包直接运行包括k8s
tomcat的核心组件
- web容器完成web功能 处理请求也是nginx转发的http(s)请求处理动态页面java代理编译的页面处理后端的请求转发到数据库的请求
- servletcatalina是整个tomcat处理的底层逻辑。处理web请求的动态页面也处理后端请求数据库
- Jspjsp会把动态翻译成serlvet的代码。用编译后的规则显示代码的静态页面
静态页面html
动态页面php index.php
jsp index.jsp ----- java格式写成的代码靠jsp翻译servlet执行编译后的代码
最后展示结果
容器通常指的是一种虚拟化的技术允许在当前的操作系统当中虚拟化的运行多个独立的环境独立运行的环境就是我们说的容器。彼此之间相互隔离拥有自己的一套系统资源。宿主容器寄生在宿主上实际使用的是宿主的资源。docker
servlet容器用于开发web应用程序的关键组件
处理http请求
生成动态内容与客户端之间的交互 前端交互 后端数据库服务器交互和redis缓存交互
类java当中调用各种方法开发人员自定义的。
处理http请求
生成动态页面内容
会话管理处理用户会话跟踪用户在不同请求之间的状态。servlet可以在用户访问不同页面时保持用户的状态信息用户同步登录等等
Jspjava server pages 动态网页的开发技术使用jsp的标签在HTML的网页中插入JAVA代码
<% 开头
%> 结尾
实现java web应用程序的访问界面用户界面或者访问数据库生成页面内容。
tomcat的核心功能
功能部分由两个块组成
接收和响应外部请求的连接器connector默认端口8080
负责处理请求的 container
Engine引擎管理多个虚拟主机。一个tomcat里面只能有一个Engine
host代表站点也就是虚拟主机。一个Engine可以有多个host
context一个context执行一个web应用
wrapper最底层处理和编译代码运行结果
JDK开发工具包开发java的应用程序jdk包括编译器调试器等等以及java的类库
开发者用来创建编译运行java程序的重要组件
JVMjava的虚拟机负责编译后的java字节码编程本地的机器码运行java的代码
Jvm内存管理垃圾回收机制线程管理
bin存放启动或关闭tomcat的脚本文件 startup.sh shoutdown.sh
conf存放的是配置文件 server.xml就是tomcat的主配置文件
Webappstomcat默认的web应用的部署目录
Worktomcat的工作目录存放jsp编译之后产生的class文件。清缓存会用到
tomcat服务部署
1.关闭防火墙安装tomcat所需软件包到/opt目录下
2.安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm
3.设置JDK环境变量
vim /ect/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
suorce /etc/profile.d/java.sh
java -version 查看jdk版本
3.部署tomcat
tar -xf apache-tomcat-9.0.16.tar.gz 解压
mv apache-tomcat-9.0.16/ /usr/local/tomca
4.创建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
5.修改tomcat主配置文件
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>
添加用户和密码
vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
vim /usr/local/tomcat/conf/tomcat-users.xml
cd /usr/local/tomcat/bin/
./shutdown.sh
./startup.sh
tomcat的优化
默认配置并不适合生产环境频繁出现假死
需要通过压力测试不断优化提高稳定
- 配置文件优化
- jvm优化
- 操作系统优化内核优化
配置文件优化
maxThreads=”200”
tomcat使用线程来处理接受的每个请求可以创建的最大线程数。支持的最大并发连接数200
minSpareThreads
最小空闲线程数tomcat启动时的初始化的线程数表示没人请求也要打开这些空的线程等待请求10
maxSpareThreads
最大备用线程数 创建线程的超过这个值tomcat会关闭不再需要的线程默认是-1不做限制
connectionTimeout
网络连接超时 设置为20000毫秒
enableLookups=”false”
是否方向解析域名 不解析提高效率
disableUploadTimeout
上传文件时是否启用超时限制
connectionUploadTimeout=”15000”
上传比下砸要耗时根据需求自定义
(华为需求15000
accpetCount=”100”
所有的可以使用的线程都被占用可以传入的队列长度的最大值
默认100
compression=”on” off force所有的情况下都进行压缩 on压缩之后的页面大小可以减少1/3
是否对响应的数据进行gzip压缩
noCompressionUserAgents=”gozilla chrom”
对指定访问的浏览器不进行压缩
jvm优化
vim /usr/local/tomcat/bin/catalina.sh
ajp-nio-8009
连接器当中的一种类型ajp协议名称就叫ajip.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 攻击。