Tomcat优化和动静分离

news2024/9/20 12:58:20

Tomcat优化和动静分离

一、Tomcat优化

Tomcat:自身优化内核优化jvm优化

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

1、自身优化

打开manager app

1.1 优化tomcat的启动速度

vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security

set nu------117行
把file:/dev/random改成file:/dev/urandom,重启tomcat
# urandom非阻塞的版本,不依赖系统的终端,进程忙也不会进入等待状态,所以处理速度相对较快,如果对应用的安全性要求较高,只能使用/dev/random

1.2 优化处理线程

默认配置不适合生产环境,可能频繁的出现假死,需要不停的重启(根据生产环境的实际情况,自行测试)

 vim /usr/local/tomcat/conf/server.xml
 
# set up----取消73行和78行注释,在redirectPort="8443"和/>的中间添加

maxThreads="500" 
minSpareThreads="20" 
enableLookups="false"
disableUplaodTimeout="false"
connectionUploadTimeout="20" 
/>

port 8080 http

8443 https 443 接收https的请求

1.3 优化线程配置的含义

maxThreads:tomcat使用线程来处理接收请求的个数,即tomcat最多可以创建多少个线程,默认200,500,1000
(根据实际情况写,看实际访问量)

minSpareThreads:最小空闲数线程,tomcat开启之后,没人使用也会有线程待命,默认值是10(根据实际情况写,看实际访问量)

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

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

enableLookups:是否支持反向解析,true,false。关闭(false),提高处理速度。

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

connectionUploadTimeout:上传的超时时间,一般设置成20s

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

compression:是否对响应数据进行压缩,on(开启),off(关闭)。开启压缩之后,可以有效的减少页面的大小(对文本无效),图片、音频、视频一般可以减少三分之一,默认是off,下面是compression=“on” 出现的情况

compression=“on”
compressionMinSize:表示响应压缩的最小值,只有响应的报文大于这个值才会压缩,如果开启了压缩,默认值是2048。
noCompressionUserAgents="浏览器名称" :对于这些浏览器,不启用压缩。

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

常用的压缩类型(多个之间使用逗号隔开)

文本类型:text/plain、text/html、text/css、text/javascript
图片类型:image/jpg、image/jpeg、image/gif
音频类型:audio/ogg.wav.mpeg
视频类型:video/mp4.webm.mvb.quicktime
应用程序:application/pdf.son.xml

例如:compressableMineType=“text/plain,video/mp4”

2、内核优化

系统安全的优化补齐

2.1 内核优化的配置文件

vim /etc/security/limits.conf
# 在51行添加一下代码

* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535

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

2.2 内核参数文件

vim /etc/sysctl.conf
# 介绍几个常用内核参数如下:

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包的探测包的发送频率,用于检测连接状态

3、jvm优化

举例: 
[root@localhost opt]# touch 123.jar
[root@localhost opt]# java -jar 123.jar &
# 一定要加&
vim cd /usr/local/tomcat/bin/catalina.sh

set nu-----118行下按o添加新的一行,写入以下代码

JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"

wq!

-Xms2048m:java初始化堆的大小,分配jvm的最小内存,cpu的性能比较高,可以分配的高一点
-Xmx2048m:java堆的最大值,也就是jvm的最大内存,主要取决于物理内存的大小,官方建议设置成与xms一样的值,设置成物理内存的一半
-Xmn768m:新生代内存的大小,官方推荐,设置成jvm内存最大值的3/8。
垃圾回收机制(java自带),java进行垃圾回收之后不需要重新计算堆区的大小
堆区:新生代、中生代、老年代
堆区产生:每生成一个新的对象,对下占用的内存空间就是新生代空间,垃圾回收对堆区当中的资源进行回收之后,新生代没有被回收 的资源就转移到了中生代,中生代就会转移到老年代
整个jvm堆的大小:新生代+老生代+永久代(系统自带)
-XX:ParallelGCThreads=2:配置并行收集器的线程数,同时有多少个线程一起进行垃圾回收,建议配置成cpu的一半
-XX:PermSize=1024m:设置非堆内存的初始值,持久代内存的大小,默认是物理内存的1/4,建议设置成真个jvm内存的一半(在非堆内存:是不会被java的垃圾回收机制处理的)
-XX:MaxPermSize=1024m:非堆内存的最大值,和初始值一致即可
-Djava.awt.headless=true:防止在linux访问的情况下,web页面的图片不能打开
-XX:+DisableExplicitGC:老年代的一个收集算法,可以缩短垃圾回收机制的回收时间

3.2 tomcat的manager app解释

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协议的作用:tomcat服务器和web服务器之间进行连接的协议可以提供负载均衡和高效转发,nio可以提高并发的处理能力
8009:ajp协议的默认端口

二、tomcat和nginx实现动静分离

访问nginx就是静态页面

nginx代理 index.jsp 可以访问tomcat的动态页面

实验1:nginx1和tomcat1、2

!在这里插入图片描述

客户端:谷歌浏览器

nginx1:192.168.100.11 静态页面加代理地址

tomcat1:192.168.100.15 动态1

tomcat2:192.168.100.16 动态2

systemctl stop firewalld
setenforce 0

tomcat1和tomcat2
cd /usr/local/tomcat/webapps
mkdir test
cd test


tomcat1
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>
wq!
# tomcat2把配置修改为2

vim /usr/local/tomcat/conf/server.xml
# 删除<Host>
# 添加
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
wq!

./shutdown.sh
./startup.sh

netstat -antp | grep 8080

页面测试访问
http://192.168.100.15:8080/test/index.jsp
http://192.168.100.16:8080/test/index.jsp
nginx1

systemctl restart nginx
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak.2024.07.08
vim /usr/local/nginx/conf/nginx.conf

#在gzip on;添加
upstream tomcat {

   server 192.168.100.15:8080 weight=1;
   server 192.168.100.16:8080 weight=1;
}

# location模块下添加
location ~ .*\.jsp$ {
    proxy_pass http://tomcat;
    proxy_set_header HOST $host;
    # 在转发动态请求时,把访问的主机名,传给后台服务器(在生产中一地要做,不做的话,后台服务器认为所有请求都是来自代理服务器,后端服务器可能会把代理服务器的地址屏蔽掉)
    proxy_set_header X-Real-IP $remote_addr;
    # 记录客户端的真实ip地址
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # nginx作为代理服务器时,设置一个ip列表,会把经过的ip和代理ip全部记录下来(记录)
}
wq!

systemctl restart nginx
cd html
vim index.html

页面访问
192.168.100.11/test/index.jsp

实验2:nginx1、2、3和tomcat1、2

在这里插入图片描述

客户端:谷歌浏览器

nginx1:192.168.100.11 静态页面加代理地址

nginx2:192.168.100.12 静态

nginx3:192.168.100.12 静态

tomcat1:192.168.100.15 动态1

tomcat2:192.168.100.16 动态2

1.1 修改tomcat配置

systemctl stop firewalld
setenforce 0

tomcat1和tomcat2
cd /usr/local/tomcat/webapps
mkdir test
cd test


tomcat1
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>
wq!
# tomcat2把配置修改为2

vim /usr/local/tomcat/conf/server.xml
# 删除<Host>
# 添加
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
wq!

./shutdown.sh
./startup.sh

netstat -antp | grep 8080

页面测试访问
http://192.168.100.15:8080/test/index.jsp
http://192.168.100.16:8080/test/index.jsp

1.2 修改nginx2和nginx3配置

nginx2和nginx3

systemctl restart nginx
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak.2024.07.08
vim /usr/local/nginx/conf/nginx.conf

#在gzip on;添加
upstream tomcat {

   server 192.168.100.15:8080 weight=1;
   server 192.168.100.16:8080 weight=1;
}

# location模块下添加
location ~ .*\.jsp$ {
    proxy_pass http://tomcat;
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
wq!

systemctl restart nginx
cd html
vim index.html

页面访问
192.168.100.12/test/index.jsp
192.168.100.13/test/index.jsp

1.3 修改nginx1、2、3配置(四层转发)

nginx2和nginx3

vim /usr/local/nginx/conf/nginx.conf
nginx2端口改8082,nginx3改端口为8083

nginx1
在events模块添加
stream {
 upstream test {
  server 192.168.100.12:8082;
  server 192.168.100.13:8083;
 }
 server {
  listen 81;
  proxy_pass test;
 }
}

nginx -t
systemctl restart nginx 

/index.jsp
192.168.100.13/test/index.jsp


1.3 修改nginx1、2、3配置(四层转发)

```bash
nginx2和nginx3

vim /usr/local/nginx/conf/nginx.conf
nginx2端口改8082,nginx3改端口为8083

nginx1
在events模块添加
stream {
 upstream test {
  server 192.168.100.12:8082;
  server 192.168.100.13:8083;
 }
 server {
  listen 81;
  proxy_pass test;
 }
}

nginx -t
systemctl restart nginx 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python功能制作之获取CSDN所有发布文章的对应数据

大家好&#xff0c;今天我要分享的是一个实用的Python脚本&#xff0c;它可以帮助你批量获取CSDN博客上所有发布文章的相关数据&#xff0c;并将这些数据保存到Excel文件中。此外&#xff0c;脚本还会为每篇文章获取一个质量分&#xff0c;并将这个分数也记录在Excel中。让我们…

探索IP形象设计:快速掌握设计要点

随着市场竞争的加剧&#xff0c;越来越多的企业开始关注品牌形象的塑造和推广。在品牌形象中&#xff0c;知识产权形象设计是非常重要的方面。在智能和互联网的趋势下&#xff0c;未来的知识产权形象设计可能会更加关注数字和社交网络。通过数字技术和社交媒体平台&#xff0c;…

Nuxt3封装网络请求 useFetch $fetch

前言&#xff1a; 刚接触、搭建Nuxt3项目的过程还是有点懵的&#xff0c;有种摸石头过河的感觉&#xff0c;对于网络请求这块&#xff0c;与之前的Vue3项目有所区别&#xff0c;在Vue项目通常使用axios这个库进行网络请求&#xff0c;但在Nuxt项目并不推荐&#xff0c;因为有内…

SAP SD销售寄售转销售订单简介

前面的几篇文章都演示了寄售模式下的系统操作的步骤和后台相关配置的演示,本文将演示客户寄售库存的消耗。 还是看下下图中的寄售四种的订单类型,我们演示的就是寄售的消耗,同样也可以理解为我们借出的东西转换成了销售订单买给客户的这的场景。 首先还是从创建销售订单开…

【刷题汇总 -- 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒】

C日常刷题积累 今日刷题汇总 - day0101、最长回文子串1.1、题目1.2、思路1.3、程序实现 2、买卖股票的最好时机(一)2.1、题目2.2、思路2.3、程序实现2.4、程序实现 -- 优化 3、[NOIP2002 普及组] 过河卒3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day0…

全球首款集成GPT-4o的智能眼镜AirGo Vision:AI眼镜的未来

引言 在人工智能和大模型技术迅猛发展的今天&#xff0c;AI硬件产品逐渐走入人们的生活。继Meta Ray-Ban智能眼镜之后&#xff0c;Solos公司在最近的香港智能眼镜峰会上发布了全球首款集成GPT-4o的智能眼镜AirGo Vision。本文将深入探讨这款AI智能眼镜的功能、技术特点以及其在…

Docker 使用基础(3)—容器

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 4:20 &#x1f504; ◀️ ⏸ …

轻松搭建 VirtualBox + Vagrant + Linux 虚拟机

一、准备工作 首先&#xff0c;我们来了解一下搭建 VirtualBox Vagrant Linux 虚拟机所需的软件准备工作。 VirtualBox 的下载地址&#xff1a;您可以通过访问https://www.virtualbox.org/wiki/Downloads获取适用于您系统的版本。 Vagrant 的下载地址&#xff1a;前往http…

麦克风领夹式的哪个牌子最好,无线领夹麦克风十大品牌

在直播和自媒体行业迅速崛起的今天&#xff0c;无线麦克风因其便携性和实用性成为了视频制作和直播带货中不可或缺的工具。面对市场上从几十元到几千元不等的无线麦克风&#xff0c;作为一位资深直播运营专家&#xff0c;我深知选择合适的设备对于提升直播质量和观众体验的重要…

【简历】南京某大学顶级211硕士:拿offer可能性低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这份简历的背景是南京的一所顶级211的硕士,从学校背景来讲呢,求职目标就是大厂的秋招&#xff0c;但是因为项目描述的亮点比较少&#x…

JavaScript青少年简明教程:为何学习JavaScript及JavaScript简介

JavaScript青少年简明教程&#xff1a;为何学习JavaScript及JavaScript简介 JavaScript最初是为web浏览器&#xff08;前端开发&#xff09;设计的。它可以在所有现代浏览器中运行&#xff0c;包括Chrome, Firefox, Safari, Edge等。 这意味着JavaScript代码可以在任何能运行…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …

STM32寄存器开发基础-点亮LED灯(讲解GPIO口输出)

文章目录 一、前言二、系列文章三、如何学习&#xff1f;四、STM32编程-控制LED灯4.1 STM32开发板4.2 原理图4.3 STM32的GPIO口4.4 开时钟4.5 配置GPIO模式的寄存器4.6 编写LED灯的初始化代码4.7 GPIO口控制输出寄存器4.8 一个完整的闪光灯程序代码 五、关于寄存器是问题 一、前…

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现&#xff0c;包括文档编辑器、在线思维导图、在线流程图等&#xff0c;前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文&#xff0c;分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…

iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息&#xff0c;据DigiTimes最新报道&#xff0c;苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称&#xff0c;目前苹果已经将模组订单交至大立光电和玉…

MC0246王国傀儡师

目录 题目描述 格式 样例 备注 运行限制 原题链接 代码思路 题目描述 在一个奇幻的王国中&#xff0c;存在着一个名叫小码哥的魔法师。小码哥手下收藏着 n 个傀儡&#xff0c;他靠着手下的傀儡演出赖以生存。因此&#xff0c;傀儡的魅力度与他的生存息息相关。他为每个…

(CVPR-2024)SwiftBrush:具有变分分数蒸馏的单步文本到图像扩散模型

SwiftBrush&#xff1a;具有变分分数蒸馏的单步文本到图像扩散模型 Paper Title&#xff1a;SwiftBrush: One-Step Text-to-Image Diffusion Model with Variational Score Distillation Paper 是 VinAI Research 发表在 CVPR 24 的工作 Paper地址 Code:地址 Abstract 尽管文本…

EXSI 实用指南 2024 -编译环境 Mac OS 安装篇(一)

1. 引言 在现代虚拟化技术的快速发展中&#xff0c;VMware ESXi 作为领先的虚拟化平台&#xff0c;凭借其高性能、稳定性和丰富的功能&#xff0c;广泛应用于企业和个人用户。ESXi 能有效地提高硬件资源利用率&#xff0c;并简化 IT 基础设施的管理。然而&#xff0c;如何在 V…

一个便捷的web截图库~【送源码】

随着时间的发展&#xff0c;前端开发的范围越来越广&#xff0c;能够实现的功能也越来越多&#xff0c;要实现的功能也五花八门&#xff0c;今天就给大家介绍一个web截图库,让前端也能实现截图功能—— js-web-screen-shot js-web-screen-shot js-web-screen-shot 是一个基于 …

8627 数独

为了判断数独解是否合法&#xff0c;我们需要遵循以下步骤&#xff1a; 1. **检查每一行**&#xff1a;确保1到9每个数字在每一行中只出现一次。 2. **检查每一列**&#xff1a;确保1到9每个数字在每一列中只出现一次。 3. **检查每个3x3的宫**&#xff1a;确保1到9每个数字在…