web中间件——tomcat

文章目录

Java

  • java代码
  • 根据开发人员使用选择

Java Web中间件选型

java web 中间件 说明 应用场景
tomcat 开源免费、轻量级、启动速度快、资源占用少 中小型 web 应用、开发测试环境
jetty 高性能、模块化设计,可嵌入到应用程序中;适合高并发和低延迟场景,支持异步 IO 嵌入式系统、微服务架构;云原生应用(如 kubernetes、Docker 环境)
jboss 开源、提供企业级功能(如集群、事务管理) 复杂企业级应用;金融、电信行业的大型分布式系统
weblogic 商业软件,功能全面(高可用、负载均衡、热部署);稳定性强,但配置复杂,成本高 大型企业关键业务系统(如银行核心系统);需要 Oracle 数据库深度集成的场景
国产:东方通(TongWeb) 国产中间件,符合国内安全及行业标准(如等保);支持国产化软硬件生态(麒麟 OS、龙芯 CPU) 政府、军工、金融等对自主可控要求高的领域

JVM-JDK-JRE

  • Java:可移植性强,一份代码处处运行,其他语言一般无法做到这点

  • Jvm:java虚拟机,java代码运行在虚拟机中

    java一般占用系统资源更多.内存,OOM故障(内存不足,内存溢出)

  • JRE:Java运行时环境,Java 运行时环境,提供了 JVM 和 Java 程序运行所需的必备依赖。如果只是想运行 Java 程序,安装 JRE 即可。

  • JDK:Java 开发工具包,包含了JRE,还额外提供了编译、调试、排障等开发用的命令工具。开发者需要 JDK 来编写、编译 Java 代码。

JDK选型

JDK选型 说明 补充
jdk(oracle jdk) 商业版(企业使用收费,个人测试免费) jdk 8 202 之前免费,211之后收费
openjdk 开源版本(yum,apt有)
厂商jdk 华为 毕昇 jdk 根据厂商选择

oracle jdk下载地址:Java Downloads | Oracle 中国

openjdk下载地址:Archived OpenJDK GA Releases

JDK长期支持版本

官网地址:Oracle Java SE Support Roadmap

版本 正式发布日期 主要支持截止时间 扩展支持截止时间 持续支持
8(LTS,长期支持版) 2014 年 3 月 2022 年 3 月 2030 年 12 月 无限期
9 - 10(非 LTS 版) 2017 年 9 月 - 2018 年 3 月 2018 年 3 月 - 2018 年 9 月 无此阶段 无限期
11(LTS,长期支持版) 2018 年 9 月 2023 年 9 月 2032 年 1 月 无限期
12 - 16(非 LTS 版) 2019 年 3 月 - 2021 年 3 月 2019 年 9 月 - 2021 年 9 月 无此阶段 无限期
17(LTS,长期支持版) 2021 年 9 月 2026 年 9 月 2029 年 9 月 无限期
18 - 20(非 LTS 版) 2022 年 3 月 - 2023 年 3 月 2022 年 9 月 - 2023 年 9 月 无此阶段 无限期
21(LTS,长期支持版) 2023 年 9 月 2028 年 9 月 2031 年 9 月 无限期
22(非 LTS 版) 2024 年 3 月 2024 年 9 月 无此阶段 无限期
23(非 LTS 版) 2024 年 9 月 2025 年 3 月 无此阶段 无限期
24(非 LTS 版) 2025 年 3 月 2025 年 9 月 无此阶段 无限期
25(LTS,长期支持版) 2025 年 9 月 2030 年 9 月 2033 年 9 月 无限期
26(非 LTS 版) 2026 年 3 月 2026 年 9 月 无此阶段 无限期
27(非 LTS 版) 2026 年 9 月 2027 年 3 月 无此阶段 无限期

具体使用哪个JDK版本,根据代码要求

TOmcat基础功能

支持JDK版本

官方文档:Apache Tomcat® - Which Version Do I Want?

Apache Tomcat 版本 支持的 Java 版本
11.0.x 版本 17 及以后
10.1.x 11 及更高版本
9.0.x 版本 8 及更高版本

安装Tomcat(yum/apt安装/二进制安装)m

部署各种服务_凤凰战士芭比Q的博客-CSDN博客

tomcat的文件结构和组成

目录结构

目录 文件 说明
bin tomcat的管理脚本 startup.sh shutdown.sh catalina.sh 做jvm优化修改这个文件
conf server.xml 主要配置文件 logging.properties日志功能配置文件 server.xml主要配置
lib lib(library)tomcat依赖的目录 一般是.jar结尾
logs 日志目录 一般看业务/应用日志 关键字:error,failed,exception(异常)
webapps 站点目录
work 加载jvm中的文件信息

范例:

配置文件

注意:配置文件大小写敏感

文件名 说明
server.xml 主配置文件
web.xml 每个 webapp 只有 "部署" 后才能被访问,它的部署方式通常由 web.xml 进行定义,其存放位置为 WEB-INF / 目录中;此文件为所有的 webapps 提供默认部署相关的配置,每个 web 应用也可以使用专用配置文件,来覆盖全局文件
context.xml 用于定义所有 web 应用均需加载的 Context 配置,此文件为所有的 webapps 提供默认配置,每个 web 应用也可以使用自已专用的配置,它通常由专用的配置文件 context.xml 来定义,其存放位置为 WEB-INF / 目录中,覆盖全局的文件
tomcat-users.xml 用户认证的账号和密码文件
catalina.policy 当使用 security 选项启动 tomcat 时,用于为 tomcat 设置安全策略
catalina.properties Tomcat 环境变量的配置,用于设定类加载器路径,以及一些与 JVM 调优相关参数
logging.properties Tomcat 日志系统相关的配置,可以修改日志级别和日志路径等

组件分层和分类

顶级组件

Server,代表整个Tomcat容器,一台主机可以启动多tomcat实例,需要确保端口不要产生冲突

服务类组件

Service,实现组织Engine和Connector,建立两者之间关联关系, service 里面只能包含一个Engine

连接器组件

Connector,有HTTP(默认端口8080/tcp)、HTTPS(默认端口8443/tcp)、AJP(默认端口8009/tcp)协议的连接器,AJP(Apache Jserv protocol)是一种基于TCP的二进制通讯协议

容器类

Engine、Host(虚拟主机)、Context(上下文件,解决路径映射)都是容器类组件,可以嵌入其它组件,内部配置如何运行应用程序

内嵌类

可以内嵌到其他组件内,valve、logger、realm、loader、manager等。以logger举例,在不同容器组件内分别定义。

集群类组件

listener、cluster

名称 说明
Server 服务器,Tomcat 运行的进程实例,一个 Server 中可以有多个 service,但通常就一个
Service 服务,用来组织 Engine 和 Connector 的对应关系,一个 service 中只有一个 Engine
Connector 连接器,负责客户端的 HTTP、HTTPS、AJP 等协议连接。一个 Connector 只属于某一个 Engine
Engine 即引擎,用来响应并处理用户请求。一个 Engine 上可以绑定多个 Connector
Host 即虚拟主机,可以实现多虚拟主机,例如使用不同的主机头区分
Context 应用的上下文,配置特定 url 路径映射和目录的映射关系:url => directory

日志文件格式(tomcat vs nginx)

日志(logs/) 说明
catalina.日期.log 当天tomcat服务日志
catalina.out tomcat服务日志
host-manager.日期 host manager管理日志
localhost.日期.log 默认主机日志
localhost_access_log.日期.txt 当天主机访问日志
manager.日期.log 当天manager管理日志

官方文档:Apache Tomcat 9 Configuration Reference (9.0.111) - The Valve Component

说明 tomcat nginx
定义访问日志的格式 Host 部分的 pattern 定义 http 区域 log_format 部分
客户端 ip 地址 %h $remote_addr
访问的时间 %t $localTime
请求起始行 (请求方法,URL,HTTP) %r $request
状态码 %s $status
大小 %b $body_bytes_sent
从哪里跳转来的 (用户如何访问网站) %{Referer} i 新增 $http_referer
客户端类型,浏览器 %{User-Agent} i 新增 $http_user_agent
XFF 头记录 %{X-Forwarded-For} i 新增 $http_x_forwarded_for

Nginx和tomcat对比

tomcat vs ngx 对比 tomcat ngx
web 端口 Connector=8080 listen 80/443
站点 / 虚拟主机 部分 server {} 部分
域名 name="localhost" server_name
站点目录 appBase="webapps" root
自动解压 (war 包解压目录) zip 压缩包 unpackWARs="true"
自动部署 (加载 vm) autoDeploy="true"

tomcat处理用户请求流程

shell 复制代码
①连接建立
用户通过浏览器访问 http://www.example.com:8080/api/data,请求到达 Tomcat 的 Connector(监听 8080 端口)。

②协议处理
Connector 解析 HTTP 协议,生成 Request 和 Response 对象。

③虚拟主机匹配
请求被传递到 Engine,根据 Host 头匹配 <Host name="www.example.com">。

④应用路径路由
在匹配的 Host 中,根据 URL 路径 /api/data 查找 <Context path="/api">,定位到 /data/webapps/api 目录下的应用。

⑤Servlet 处理
应用内部的 web.xml 或注解配置的 Servlet 根据剩余路径 /data 处理请求。

⑥响应返回
处理结果通过 Connector 返回客户端。

Tomcat应用部署

tomcat的根目录结构

nginx

Nginx 部署多个网站应用(如 eshop、forum)的核心逻辑:以统一网站根目录(如 /data/nginx/html)为基础,主应用(eshop)直接部署到根目录,其他应用(forum)部署到根目录下的对应子目录,实现多应用共存

tomcat

Tomcat 部署多 Web 应用(如 eshop、forum)的核心规则是 "目录即应用",以 webapps 为基础目录,ROOT 目录对应默认主站,其他子目录对应独立应用,支持虚拟主机自定义站点目录

tomcat部署规则

  • 主应用(eshop):解压文件放入 $CATALINA_BASE/webapps/ROOT/,对应访问路径 http://localhost/
  • 其他应用(forum):解压文件放入 $CATALINA_BASE/webapps/[应用名]/(如 forum/),对应访问路径 http://localhost/[应用名]/(如 http://localhost/forum/

tomcat自动部署

  • Tomcat 的 自动部署(Auto-Deploy)功能 ,默认开启,会自动监测 webapps 目录下的 WAR 包并解压为同名目录,旧目录若存在则覆盖

一般业务代码部署流程

war或jar如何部署

war处理

shell 复制代码
war包一般需要tomcat(webapps)。jdk,tomcat+war

例如:memtest.war
把war包移动到webapp下
查看日志catalina.out
浏览器访问 http://ip:8080/memtest/meminfo.jsp

jar包处理

shell 复制代码
jar包直接运行(jar包内部塞了一个tomcat或jetty)。jdk+jar
java -jar xxx.jar 启动应用(业务)或其他选项

jar包 运行时候在jar包所在目录(相对路径)
#前台运行(测试)
java -jar -Dfile.encoding=UTF-8 nginxWebUI-3.4.0.jar --server.port=8848 --project.home=/app/code/nginx/

#后台运行(正式)或交给systemctl运行
nohup java -jar -Dfile.encoding=UTF-8 nginxWebUI-3.4.0.jar --server.port=8848 --project.home=/app/code/nginx/ &

##开机自启动
#方案01 最简单启动命令写道/etc/rc.local

#方案02 书写jar包管理脚本,systemctl调用脚本
1.写脚本(核心case语句)
bash /xxx/xxx/nginxwebui.sh start   运行
bash /xxx/xxx/nginxwebui.sh stop    关闭指定的服务
bash /xxx/xxx/nginxwebui.sh restart 先关闭然后启动
bash /xxx/xxx/nginxwebui.sh status  检查是否允许,如果允许显示pid
2.写服务启动配置文件
cat /lib/systemd/system/tomcatwebui.service
[Unit]
Descripton=nginx webui
Afer=network.target

[Service]
Type=forking
ExecStart=bash /xxx/xxx/nginxwebui.sh start
ExecStop=bash /xxx/xxx/nginxwebui.sh stop

[Install]
WantedBy=multi-user.target

后端打包编译全流程

Jar包

(1)安装tomcat、jdk、maven

tomcat和jdk安装:部署Tomcat11(Kylinv10sp3、Ubuntu2204、Rocky9.3)_ubuntu部署tomcat11-CSDN博客

maven下载地址:Download Apache Maven -- Maven

maven镜像_maven下载地址_maven安装教程-阿里巴巴开源镜像站

shell 复制代码
#1.安装tomcat和jdk
#2.安装maven软件包
yum install -y wget;wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz -P /download

#3.解压maven二进制包
tar -zxvf /download/apache-maven-3.9.11-bin.tar.gz -C /usr/local/

#4.设置软链接简化路径
ln -s /usr/local/apache-maven-3.9.11/ /usr/local/maven

#5.配置环境变量,并查看maven版本
echo 'export PATH=$PATH:/usr/local/maven/bin' >> /etc/profile
mvn --version

#6.配置maven编译加速
#mvn编译本质下载代码需要的jar包依赖,整合依赖生成war包/jar包
#mvn默认从官网下载,速度很慢
#配置maven阿里云加速
#打开 Maven 的配置文件(在maven安装目录的conf/settings.xml)
#在<mirrors></mirrors>标签中添加 mirror 子节点:
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

(2)编译nginxwebui

官网gitee仓库:nginxWebUI.

shell 复制代码
#1.下载nginxWebUI-master.zip源码包
#2.解压
unzip nginxWebUI-master.zip
cd nginxWebUI-master
#2.使用mvn编译
mvn clean package
#3.运行编译的文件with assembly file: /root/nginxWebUI-master/target/nginxWebUI-4.3.4.jar
#前台测试运行
java -jar -Dfile.encoding=UTF-8 nginxWebUI-4.3.4.jar --server.port=8848 --project.home=/app/code/nginx/
#4.使用curl测试访问
curl http://10.0.0.108:8848

(3)设置开机自启动

shell 复制代码
#1.把jar包移动到站点目录
mv nginxWebUI-4.3.4.jar /app/code/nginx/
#2.编写脚本
cat > /server/scripts/nginxwebui.sh <<'EOF'
#!/bin/bash
#############################################################################
# File Name: /server/scripts/nginxwebui.sh
# Version: V1.0
# Author: csq
# Organization: blog.chenshiquan.xyz
# Desc: 
#############################################################################
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk21/bin:/usr/local/maven/bin:/root/bin

#1.vars
service=nginxWebUI-4.3.4.jar
dir=/app/code/nginx/
choose=$1
port=8848
log_file=${dir}nginxwebUI.log
time=`date +%F_%T`

#2.函数部分
##日志函数
function logsng() {
    msg="$*"
    echo "$*" >> ${log_file}
}

##开启服务脚本
function srv_start() {
    # 目录检查:目录不存在则记录日志并退出
    if [ ! -d "${dir}" ]; then
        logsng "start [Failed] [${time}] 目录 ${dir} 不存在"
        echo "错误:目录 ${dir} 不存在"
        return 1
    fi

    # jar文件检查:文件不存在则记录日志并退出
    if [ ! -f "${dir}${service}" ]; then
        logsng "start [Failed] [${time}] 文件 ${dir}${service} 不存在"
        echo "错误:文件 ${dir}${service} 不存在"
        return 1
    fi

    # 检查服务是否已运行
    pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')
    if [ -z "${pid}" ]; then  # 服务未运行(pid为空),执行启动
        cd ${dir} || return 1  # 切换目录失败则退出
        nohup java -jar -Dfile.encoding=UTF-8 ${service} \
        --server.port=${port} --project.home=${dir} >/dev/null 2>&1 &
        # 检查启动结果
        if [ $? -eq 0 ]; then
            logsng "start [OK] [${time}] ${service} 启动成功"
            echo "${service} 启动成功"
        else
            logsng "start [Failed] [${time}] ${service} 启动失败"
            echo "${service} 启动失败"
        fi
    else  # 服务已运行(pid非空),提示已运行
        logsng "start [Failed] [${time}] ${service} 已运行(pid: ${pid})"
        echo "${service} 已运行(pid: ${pid})"
    fi
}

##关闭服务脚本
function srv_stop() {
    #1.pid
    pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')
    #2.是否存在pid
    if [ -n "${pid}" ]; then
        #3.存在则关闭kill pid
        kill -9 ${pid}
        if [ $? -eq 0 ];then
            logsng stop [OK] [${time}] ${service}
        else
            logsng stop [Failed] [${time}] ${service}
        fi
    fi
}

##重启
function srv_restart() {
    srv_stop
    sleep 1
    srv_start
}

##状态
function srv_status() {
    #1.pid
    pid=$(ps -ef | grep -w "${service}" | grep -v grep | awk '{print $2}')
    pid_cnt=$(ps -ef | grep -w "${service}" | grep -v grep | wc -l)
    #2.是否存在pid
    if [ ${pid_cnt} -ge 1 ];then
        echo "running [OK] [${pid}] ${service}"
        logsng "running [OK] [${pid}] [${time}] ${service}"
    else
        echo "stopped [Failed] [${time}] ${service}"
        logsng "stopped [Failed] [${time}] ${service}"
    fi
}

#3.case语句部分
case "$choose" in
    start)    srv_start   ;;
    stop)     srv_stop    ;;
    restart)  srv_restart ;;
    status)   srv_status  ;;
    *)        echo "input error" ;;
esac
EOF

#3.配置启动文件
cat > /usr/lib/systemd/system/nginxwebui.service <<EOF
[Unit]
Description=nginx webui
After=network.target
[Service]
Type=forking
#EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/bin/bash /server/scripts/ngxwebui.sh start
ExecStop=/bin/bash /server/scripts/ngxwebui.sh stop
[Install]
WantedBy=multi-user.target
EOF

#4.设置开机自启动并开启服务,查看状态
systemctl daemon-reload && systemctl enable --now nginxwebui && systemctl status nginxwebui

#5.放行8848端口
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --reload

(4)浏览器访问

设置完用户名密码,登陆

war包

shell 复制代码
#1.war包移动到tomcat根目录下的webapps中
mv memtest.war /usr/local/tomcat/webapps/
#2.查看war包解压内容
cd /usr/local/tomcat/webapps/
ls memtest
meminfo.jsp  META-INF
#3.访问测试
curl http://10.0.0.108:8080/memtest/meminfo.jsp

tomcat多虚拟主机(多站点)

Tomcat 的 "多虚拟主机(多站点)" 是指在同一台 Tomcat 服务器上,通过配置多个Host组件,实现同时部署多个独立网站(站点),并通过不同的域名(或端口)区分访问。

多虚拟机配置说明

  • name 必须是主机名,用主机名来匹配
  • appBase 当前主机的网页根目录,是相对于$CATALINA_HOME,也可以使用绝对路径
  • unpackWARs 是否自动解压war格式
  • autoDeploy 热部署,自动加载并运行应用

虚拟主机配置过程(使用配置文件)

  • 再添加和配置一个新的虚拟主机
bash 复制代码
#1.添加虚拟主机
vim /usr/local/tomcat/conf/server.xml
#在默认的<Host>
.....
.....
#</Host>下面添加
        <Host name="test.chenshiquan.xyz" appBase="csqwebapp"
                unpackWARs="true" autoDeploy="true">
                
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access" suffix=".log"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{Referer}i&quot;
                &quot;%{User-Agent}i&quot; &quot;%{X-Forwarded-For}i&quot;" />
        </Host> 

虚拟机主机配置过程(复制二进制包)

shell 复制代码
#思路:将tomcat安装包解压多份进行配置
#默认tomcat安装目录还有一个虚拟主机主机
#第二个虚拟主机主机
mkdir -p /app/code
tar -zxvf /download/apache-tomcat-9.0.111.tar.gz -C /app/code/
mv /app/code/apache-tomcat-9.0.111/ /app/code/tomcat8081
sed -i 's/8080/8081/g' /app/code/tomcat8081/conf/server.xml 
sed -i 's/8005/8006/g' /app/code/tomcat8081/conf/server.xml 
echo "8081" > /app/code/tomcat8081/webapps/ROOT/index.jsp
/app/code/tomcat8081/bin/startup.sh
#第三个虚拟主机主机
tar -zxvf /download/apache-tomcat-9.0.111.tar.gz -C /app/code/
mv /app/code/apache-tomcat-9.0.111/ /app/code/tomcat8081
sed -i 's/8080/8082/g' /app/code/tomcat8082/conf/server.xml 
sed -i 's/8005/8007/g' /app/code/tomcat8082/conf/server.xml 
echo "8082" > /app/code/tomcat8082/webapps/ROOT/index.jsp
/app/code/tomcat8082/bin/startup.sh

#测试访问
[root@web04 ~]# curl 10.0.0.109:8081
8081
[root@web04 ~]# curl 10.0.0.109:8082
8082

JVM相关工具

JVM

命令 说明
jps 查看所有 jvm 进程
jinfo 查看进程的运行环境参数,主要是 jvm 命令行参数
jstat 对 jvm 应用程序的资源和性能进行实时监控
jstack 查看所有线程的运行状态
jmap 查看 jvm 占用物理内存的状态
jhat +UseParNew (注:jhat 用于分析 jmap 生成的堆转储文件,UseParNew 是垃圾收集器参数)
jconsole 图形工具
jvisualvm 图形工具

jps

查看java进程信息

shell 复制代码
jps -lvm
#根据业务名字(jar包名字过滤,目录名字,产品名字)
#选项
jps [-q] [-mlvV] [<hostid>]
-q:静默模式;
-v:显示传递给jvm的命令行参数;
-m:输出传入main方法的参数;
-l:输出main类或jar完全限定名称;
-v:显示通过flag文件传递给jvm的参数;

jstack

查看指定的java进程的线程栈的相关信息

shell 复制代码
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
#选项
-l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项
-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息
-F:当使用"jstack -l PID"无响应,可以使用-F强制输出信息
  • ps aux进程有L标记 线程的意思
  • top -Hp pid 显示线程信息
  • pstree -pu
  • ps -efL
线程状态 描述
NEW 线程已创建但尚未启动(未调用 start() 方法)。
RUNNABLE 线程正在运行或准备运行,等待 CPU 调度。
BLOCKED 线程被阻塞,等待获取监视器锁(例如,进入同步块或方法)。
WAITING 线程无限期等待,直到被其他线程显式唤醒(例如,调用 Object.wait())。
TIMED_WAITING 线程在指定时间内等待(例如,调用 Thread.sleep()Object.wait(timeout))。
TERMINATED 线程已执行完毕,终止状态。

jmap

用于查看堆内存的使用状态

shell 复制代码
(1)导出jvm信息 使用情况
jmap -heap pid #导出jvm信息 使用率。<==jdk8之前
jhsdb jmap --heap --pid xxx   #jdk8之后

(2)保存jvm文件(类似于windows蓝屏信息)。然后使用MAT(memory ana tools)分析
jmap -dump:format=b,file=/root/xxx.hprof  pid
	windows安装MAT进行分析,MAT依赖jdk

系统负载高完整排查流程

流程

先排查与解决故障

后续:

  • 根因分析
    • 故障现象
    • 故障排查流程
    • 故障如何解决
    • 预防故障

动静分离

什么是动态资源?什么是静态资源?

shell 复制代码
静态资源:
是什么:静态内容是固定不变的资源,内容不会因为用户请求、时间等条件变化而改变,本质是"预先生成的固定文件"
怎么来的:静态资源通常是由开发者预先创建并保存为具体文件
         比如前端开发编写的 CSS 样式表、JS 脚本、纯 HTML 页面
         比如用户上传的图片、视频、音频等
静态资源由nginx自行处理

动态资源:
是什么:动态资源是内容随请求条件动态生成的资源,其内容依赖用户身份、请求参数、数据库数据、时间等因素,每次请求可能返回不同结果,本质是 "服务器实时计算的动态内容"
怎么来的:当用户发送请求(如访问 "我的订单" 页面、搜索商品),服务器接收请求后,通过后端语言(如 PHP、Python、Java)或框架(如 Django、Spring)处理逻辑;
可能需要查询数据库(如获取用户的订单数据、商品库存)、解析请求参数(如搜索关键词)、结合时间或用户身份(如登录状态);
最终动态生成内容(如 HTML 页面、JSON 数据),并返回给用户

动态资源的核心作用是提供个性化、实时性的内容,满足交互和动态需求

LNMP部署zrlog个人博客(动静分离高可用集群)

LNMT部署zrlog个人博客(动静分离集群)-CSDN博客

前后端分离

前后端分离部署学之思在线考试系统-CSDN博客

前后端

  • 前端:看到页面(小程序,app,网站)框架vue
  • 后端:业务逻辑(登陆,注册,下单,购物,打赏...)java(springboot)
  • 前后端源代码->编译->生成可以部署的内容(前端html页面,后端java(war,jar))

部署node.js

官网:Node.js --- Download Node.js®

shell 复制代码
#1.下载node.js  v16.19.1
#2.解压到/usr/local/下
tar -xf https://nodejs.org/dist/v24.11.0/node-v24.11.0-linux-x64.tar.xz  -C /usr/local/
#3.软链接简化路径
ln -s /usr/local/node-v24.11.0-linux-x64/ /usr/local/node
#4.修改所有者
chown -R root:root /usr/local/node-v24.11.0-linux-x64/
#5.配置PATH环境变量
echo 'export PATH=$PATH:/usr/local/node/bin' >> /etc/profile
source  /etc/profile
#6.配置npm国内下载源
npm config set registry https://registry.npmmirror.com
cat ~/.npmrc  #源存放路径
#7.检查node.js版本和npm版本
npm --version && node --version

简易使用前端编译

编译部署中国制霸生成器

官网:github.com/itorr/china-ex

shell 复制代码
#1.下载中国制霸生成器的前端包
wget https://github.com/itorr/china-ex/archive/refs/heads/main.zip -P /download/
#2.解压进行编译
unzip /download/main.zip -d /download/
cd /download/china-ex-main/

#3.package.json 配置文件
#下载前端依赖各种js文件。很大 下载到代码目录的node_modules目录下
npm install #简写npm i
#4.打包编译
npm run build
#5.生成在dist目录(未来不一定都是这个目录)
[root@web03 /download/china-ex-main]# ll dist/
总用量 16
-rw-r--r-- 1 root root 2385 11月  5 03:34 脚本.js
-rw-r--r-- 1 root root 2314 11月  5 03:34 样式.css
-rw-r--r-- 1 root root    0 11月  5 03:34 字体.woff
-rw-r--r-- 1 root root 5501 11月  5 03:34 index.html
#6.传输到web nginx站点目录
cp -rf dist/* /app/code/china/
#7.配置nginx站点配置文件
cat > /etc/nginx/conf.d/china.chenshiquan.xyz.conf <<EOF
server {
	listen 80;
	server_name china.chenshiquan.xyz;
	root /app/code/china/;
	location / {
		index index.html;
	}
}
EOF
#8.重启加载nginx配置文件
systemctl reload nginx

浏览器访问windows 添加hosts解析,10.0.0.108 china.chenshiquan.xyz

Tomcat优化

线程池调整

shell 复制代码
#server.xml 8080部分
maxThreads="500"  #最大线程数200-400之间,具体的数值需要进行压力测试(ab)
acceptCount="500" #当启动线程满了之后,等待队列的最大长度,队列长度acceptCount一般与maxThreads一致
minSpareThreads="10"  #最小空闲线程数(使用ps -efL |grep java查看)
maxSpareThreads       #最大空闲线程数

acceptorThreadCount="2"   #请求分成几队伍进行,数值上与CPU核心总数一致或2倍默认是1

JVM内存空间优化

catalina.sh文件中的内容

  • 设置jvm内存大小
  • 配置GC日志(垃圾回收)
  • 配置自动dump功能

配置JVM内存大小

shell 复制代码
#1.设置jvm初始化内存大小 一般登录jvm最大内存大小(默认物理内存1/4)
#同样也适用于启动jar包(java命令添加)
#修改 catalina.sh 文件(大约125行)
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log'
#2.修改完后重启
systemctl restart tomcat
#3.命令行查看
jps -lvm
jhsdb jmap --heap --pid 7484 | grep 1024

配置GC日志

shell 复制代码
#配置方法:添加到JAVA_OPTS中即可,或java命令添加
-Xloggc:/var/log/tomcat_gc.log

配置自动DUMP功能(jvm发生异常,自动导出jvm内存镜像)

shell 复制代码
#配置方法:添加到JAVA_OPTS中即可,或java命令添加
-XX:+HeapDumpOnOutOfMemoryError  #OOM故障
-XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof

-XX:+HeapDumpOnOutOfMemoryError  #开启导出jvm镜像功能,用于java/tomcat加载应用故障,内存不足oom out of memory
-XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof

JVM内存空间优化汇总

shell 复制代码
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof'

io模型优化

  • 类似于nginx同步,异步模型
  • 决定了tomcat如何处理数据
IO模型 说明
BIO Blocked IO,阻塞,同步模型.tomcat7及以前版本默认是BIO
NIO New IO,非阻塞,异步模型,tomcat8开始默认就是NIO
APR 应对高并发场景

什么是同步,什么是异步

同步:同步指的是多个操作按顺序执行,前一个操作未完成时,后一个操作必须等待,就像 "排队办事"------ 前一个人没结束,下一个人只能等着

异步:异步指的是多个操作可以同时进行,前一个操作未完成时,后一个操作无需等待,可直接开始,就像 "多线程办事"------ 多个任务各自执行,互不阻塞。

简单来说,同步串行,异步并行

DNS压缩

shell 复制代码
#server.xml 8080部分配置
#禁用DNS反向解析功能,加速访问。域名--->ip   ip--->域名
enableLookups="false"

#类似于nginx gzip压缩(推荐在nginx配置)
compression="on"    #开启tomcat压缩功能,静态文件资源html js css
compressionMinSize="2048"  #大于2048字节的文件才会被压缩
compressableMimeType="text/html,text/css,application/javascript..."#定义启用压缩功能的MIME类型

java测试工具

JMeter

图形化界面,支持模拟复杂场景(如阶梯式并发、混合接口请求、登录态保持),适合测试 Tomcat 承载的完整 Web 应用(如登录→浏览→提交订单的流程)

相关推荐
a123560mh4 小时前
国产信创操作系统银河麒麟常见软件适配(MongoDB、 Redis、Nginx、Tomcat)
linux·redis·nginx·mongodb·tomcat·kylin
少卿4 小时前
React Compiler 完全指南:自动化性能优化的未来
前端·javascript
广州华水科技4 小时前
水库变形监测推荐:2025年单北斗GNSS变形监测系统TOP5,助力基础设施安全
前端
广州华水科技4 小时前
北斗GNSS变形监测一体机在基础设施安全中的应用与优势
前端
七淮4 小时前
umi4暗黑模式设置
前端
8***B4 小时前
前端路由权限控制,动态路由生成
前端
军军3605 小时前
从图片到点阵:用JavaScript重现复古数码点阵艺术图
前端·javascript
znhy@1235 小时前
Vue基础知识(一)
前端·javascript·vue.js
terminal0075 小时前
浅谈useRef的使用和渲染机制
前端·react.js·面试
我的小月月5 小时前
🔥 手把手教你实现前端邮件预览功能
前端·vue.js