Nginx+Tomcat负载均衡
目录
Tomcat简介
Tomcat 的核心功能
Tomcat架构
Tomcat 的特点
Tomact配置
关闭防火墙及系统内核
Tomcar 主要文件信息
配置文件说明
案例一:Java的Web站点
案例二:Nginx+Tomcat负载均衡、动静分离
Tomcat简介
Tomcat 是由 Apache 软件基金会(ASF)开发的一款开源的 Servlet 容器 和 Web 服务器,主要用于运行基于 Java 的 Web 应用程序(如 JSP、Servlet)。它实现了 Java Servlet、JavaServer Pages(JSP)、Java Expression Language(EL)和 WebSocket 等 Java EE 规范,是轻量级、高性能的 Java Web 应用服务器,广泛应用于开发和生产环境。
Tomcat 的核心功能
- Servlet 容器
- 解析和执行 Java Servlet 代码,处理 HTTP 请求和响应。
- 管理 Servlet 的生命周期(初始化、服务、销毁)。
- JSP 引擎
- 将 JSP 文件动态编译为 Servlet,生成 HTML 响应。
- 静态资源服务
- 支持直接提供 HTML、CSS、JavaScript、图片等静态文件。
- 会话管理
- 提供
HttpSession
接口,支持用户会话跟踪。
- 提供
- 安全与认证
- 支持基于角色的访问控制(RBAC)、SSL/TLS 加密等。
- 集群与负载均衡
- 通过插件支持多节点部署,实现高可用性。
Tomcat架构
Tomcat 采用模块化设计,主要组件包括:
组件 | 作用 |
---|---|
Server | 顶层容器,代表整个 Tomcat 实例。 |
Service | 连接 Connector 和 Engine ,提供服务(如 HTTP、AJP)。 |
Connector | 处理客户端连接(如 HTTP 请求),将请求转发给 Engine 。 |
Engine | 处理请求的核心组件,管理多个 Host (虚拟主机)。 |
Host | 虚拟主机,如 localhost ,管理多个 Context (Web 应用)。 |
Context | 单个 Web 应用(如 /myapp ),对应一个 WAR 文件或目录。 |
Tomcat 的特点
- 轻量级
- 相比 WebLogic、WebSphere 等商业服务器,Tomcat 体积小、启动快。
- 开源免费
- 遵循 Apache 许可证,无商业使用限制。
- 跨平台
- 支持 Windows、Linux、macOS 等操作系统。
- 易于集成
- 可与 Spring Boot、Struts 等框架无缝集成。
- 社区活跃
- 长期维护,版本更新频繁,支持最新 Java 特性
Tomact配置
关闭防火墙及系统内核
[root@localhost ~]# systemctl stop firewalld #关闭防火墙
[root@localhost ~]# setenforce 0 #关闭系统内核
在安装Tomcat之前需要安装Tomcat依赖环境
[root@localhost ~]# dnf -y install java
将Tomcat的安装包压缩(压缩就能用 绿色安装)
[root@localhost ~]# tar zxf apache-tomcat-9.0.8.tar.gz
移动至别的目录并重置名字
[root@localhost ~]# mv apache-tomcat-9.0.8 /usr/local/tomcat
Tomcar 主要文件信息
- bin/:存放 Windows 或 Linux 平台上启动和关闭 Tomcat 的脚本文件。
- conf/: 存放 Tomcat 服务器的各种全局配置文件,其中最重要的是 server.xml 和web. xml.
- lib/:存放 Tomcat 运行需要的库文件(JARS)
- -logs:存放 Tomcat 执行时的 LOG 文件
- -webapps:Tomcat 的主要 Web 发布目录(包括应用程序示例)
- work:存放 JSP 编译后产生的 class 文件。
配置文件说明
- catalina.policy:权限控制配置文件。
- catalina.properties:Tomcat 属性配置文件。
- context.xml:上下文配置文件。
- logging.properties: 日志 log 相关配置文件。
- server.xml:主配置文件。
- tomcat-users.xml:manager-gui管理用户配置文件(Tomcat 安装后提供-个 manager-gui 的管理界面,通过配置该文件可以开启访问)。
- web.xml:Tomcat 的 servlet、servlet-mapping、filter、MIME 等相关配置。
启动Tomcat
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh #启动
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh #关闭
检测是否运行
[root@localhost ~]# netstat -anpt |grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 2387/java
tcp6 0 0 :::8080 :::* LISTEN 2387/java
tcp6 0 0 :::8009 :::* LISTEN 2387/java
验证测试网页
案例一:Java的Web站点
关闭防火墙及系统内核
[root@localhost webapp1]# systemctl stop firewalld
[root@localhost webapp1]# setenforce 0
在安装Tomcat之前需要安装Tomcat依赖环境
[root@localhost ~]# dnf -y install java
将Tomcat的安装包压缩(压缩就能用 绿色安装)
[root@localhost ~]# tar zxf apache-tomcat-9.0.8.tar.gz
移动至别的目录并重置名字
[root@localhost ~]# mv apache-tomcat-9.0.8 /usr/local/tomcat
创建测试页面区分两个网站
[root@localhost bin]# mkdir -p /web/webapp1
[root@localhost bin]# cd /web/webapp1/
[root@localhost bin]# vim index.jsp
02
<%@ 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> <body> <div>动态页面的图片 1</div><br><img src="logo.png"> </body>
</html>两个网站
03
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>JSP test2 page</title> </head><body><% out.println("动态页面 2,http://www.test2.com");%></body> <body> <div>动态页面的图片 2</div><br><img src="logo.png"> </body>
</html>
修改Tomcat配置文件
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
忽略以上所有信息
148行
<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><Context docBase="/web/webapp1" path="" /> #只添加这一行
关闭Tomcat在启动
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh #启动
[root@localhost ~]# /usr/local/tomcat/bin/shutdown.sh #关闭
102验证
103验证
可以看到的是并没有图片
案例二:Nginx+Tomcat负载均衡、动静分离
跟案例一操作基本上是一样的,只是配置不一样 这里不再演示如何安装Nginx
101Nginx 102Tomcat1 103Tomcat2
修改Nginx配置文件
忽略以上信息
添加真实服务器的ip、端口、权重
#gzip on;upstream my_tomcat{server 192.168.10.102:8080 weight=1;server 192.168.10.103:8080 weight=2;}
忽略以下信息server {listen 80;server_name localhost;charset utf-8; #在server中开启utf-8,要不然会乱码#access_log logs/host.access.log main;在location下写我们自己的locationlocation ~ .*\.jsp$ {proxy_set_header HOST $host;#proxy_set_header Client-IP $remote_addr; #这三条是之后,查看日志信息的时候查看真实IP访问Tomcat服务器的#proxy_set_header X-Real-IP $remote_addr;#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://my_tomcat;}location ~ .*\.(gif|jpg|png)$ {root /usr/local/nginx/html/img;expires 30d;}
配置完后 检查配置是否有误
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重启
[root@localhost img]# systemctl restart nginx
验证:
因为网站2的权重比一高,所以3次刷新网站二会显示较多
后续查看日志并不能看到真实的ip访问Tomcat
需要给上面的配置#号去掉
忽略以上信息
添加真实服务器的ip、端口、权重
#gzip on;upstream my_tomcat{server 192.168.10.102:8080 weight=1;server 192.168.10.103:8080 weight=2;}
忽略以下信息server {listen 80;server_name localhost;charset utf-8; #在server中开启utf-8,要不然会乱码#access_log logs/host.access.log main;在location下写我们自己的locationlocation ~ .*\.jsp$ {proxy_set_header HOST $host;proxy_set_header Client-IP $remote_addr; #这三条是之后,查看日志信息的时候查看真实IP访问Tomcat服务器的proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://my_tomcat;}location ~ .*\.(gif|jpg|png)$ {root /usr/local/nginx/html/img;expires 30d;}
配置完后 检查配置是否有误
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重启
[root@localhost img]# systemctl restart nginx
修改Tomcat文件
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%{X-Real-IP}i %h %l %u %t "%r" %s %b" /> #只有%{X-Real-IP}i 需要添加
访问nginx刷新并查看Tomcat日志信息
相关文章:

Nginx+Tomcat负载均衡
目录 Tomcat简介 Tomcat 的核心功能 Tomcat架构 Tomcat 的特点 Tomact配置 关闭防火墙及系统内核 Tomcar 主要文件信息 配置文件说明 案例一:Java的Web站点 案例二:NginxTomcat负载均衡、动静分离 Tomcat简介 Tomcat 是由 Apache 软件基金会&am…...
JVM——JVM中的字节码:解码Java跨平台的核心引擎
引入 在Java的技术版图中,字节码(Bytecode)是连接源代码与机器世界的黄金桥梁。当开发者写下第一行public class HelloWorld时,编译器便开始了一场精密的翻译工程——将人类可读的Java代码转化为JVM能够理解的字节码指令。这些由…...

【论文解读】ReAct:从思考脱离行动, 到行动反馈思考
认识从实践开始,经过实践得到了理论的认识,还须再回到实践去。 ——《实践论》,毛泽东 1st author: About – Shunyu Yao – 姚顺雨 paper [2210.03629] ReAct: Synergizing Reasoning and Acting in Language ModelsReAct: Synergizing Reasoning and…...
数据解析:一文掌握Python库 lxml 的详细使用(处理XML和HTML的高性能库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、lxml 概述1.1 lxml 介绍1.2 安装和第一个案例1.3 性能优化技巧二、XML处理2.1 解析XML2.2 访问元素2.3 遍历XML树2.4 修改XML2.5 写入XML三、HTML处理3.1 解析HTML3.2 XPath查询3.3 CSS选择器四、高级功能4.1 使用命…...
react native webview加载本地HTML,解决iOS无法加载成功问题
在react native中使用 “react-native-webview”: “^13.13.5”,加载HTML文件 Android: 将HTML文件放置到android/src/main/assets目录,访问 {uri: file:///android_asset/markmap/index.html}ios: 在IOS中可以直接可以直接放在react native项目下,访问…...

简单配置RHEL9.X
切换默认运行级别 将系统默认启动模式从多用户的图形界面调整为多用户的文本界面,适用于优化系统资源占用或进行远程服务器管理的场景。 注意:安装选择“带GUI的服务器”部分常用命令默认安装;如果选择“最小安装”时,部分常用命…...
默认网关 -- 负责转发数据包到其他网络的设备(通常是路由器)
✅ 默认网关概括说明: 默认网关(Default Gateway)是网络中一台负责转发数据包到其他网络的设备(通常是路由器)。当一台主机要访问不在本地子网内的设备时,会将数据包发给默认网关,由它继续转发…...
python调用硅基流动的视觉语言模型
参考: https://docs.siliconflow.cn/cn/userguide/capabilities/vision import base64 import json from openai import OpenAI from PIL import Image import io# 初始化OpenAI客户端 client OpenAI(api_key"sk-**********", # 替换为实际API密钥b…...

下载并运行自制RAG框架
项目部署 https://github.com/huangjia2019/rag-project01-framework git clone https://github.com/huangjia2019/rag-project01-framework.git 一 、 前端分部分部署 在 Ubuntu 系统 上安装 Node.js 和 npm(Node Package Manager),并初始…...

Rust 学习笔记:Cargo 工作区
Rust 学习笔记:Cargo 工作区 Rust 学习笔记:Cargo 工作区创建工作区在工作区中创建第二个包依赖于工作区中的外部包向工作区添加测试将工作区中的 crate 发布到 crates.io添加 add_two crate 到工作区总结 Rust 学习笔记:Cargo 工作区 随着项…...

颈部的 “异常坚持”
生活中,有些人的颈部会突然变得 “异常坚持”—— 头部不受控制地偏向一侧,或是不自主地旋转、后仰,仿佛被无形的力量牵引着。这种情况不仅影响外观,还会带来强烈的不适感,颈部肌肉紧绷、酸痛,像被一根绳索…...

Ubuntu22.04安装MinkowskiEngine
MinkowskiEngine简介 Minkowski引擎是一个用于稀疏张量的自动微分库。它支持所有标准神经网络层,例如对稀疏张量的卷积、池化和广播操作。 MinkowskiEngine安装 官方源码链接:GitHub - NVIDIA/MinkowskiEngine: Minkowski Engine is an auto-diff neu…...

【计算机网络】第2章:应用层—应用层协议原理
目录 1. 网络应用的体系结构 2. 客户-服务器(C/S)体系结构 3. 对等体(P2P)体系结构 4. C/S 和 P2P 体系结构的混合体 Napster 即时通信 5. 进程通信 6. 分布式进程通信需要解决的问题 7. 问题1:对进程进行编址…...

【Zephyr 系列 6】使用 Zephyr + BLE 打造蓝牙广播与连接系统(STEVAL-IDB011V1 实战)
🧠关键词:Zephyr、BLE、广播、连接、GATT、低功耗蓝牙、STEVAL-IDB011V1 📌适合人群:希望基于 Zephyr 实现 BLE 通信的嵌入式工程师、蓝牙产品开发人员 🧭 前言:为什么选择 Zephyr 开发 BLE? 在传统 BLE 开发中,我们大多依赖于厂商 SDK(如 Nordic SDK、BlueNRG SD…...

利用 Scrapy 构建高效网页爬虫:框架解析与实战流程
目录 前言1 Scrapy 框架概述1.1 Scrapy 的核心优势1.2 Scrapy 的典型应用场景 2 Scrapy 工作原理解析2.1 框架结构图2.2 Spider:定义数据采集策略2.3 Scheduler:调度请求与去重2.4 Downloader:网页下载器2.5 Item:结构化数据容器2…...

RPG20.创建敌人的初始能力和加载武器
1. 基于StartUpAbilitiy基类创建专门用于敌人数据的DAStartUpABility,然后再基于新创建的DA再创建一个蓝图 2.打开 DataAsset_EnemyStartUpData.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "Cor…...
P5684 [CSP-J2019 江西] 非回文串 题解
https://www.luogu.com.cn/problem/P5684 /* 比较简单的组合计数 题目没有以文字去描述,而是用下标来形式化题意,给我们一个关键信息:判定两个串是否相同不是看字符是否相同,而是看下标 换言之就是相同的字符,如果下标…...

自适应移动平均(Adaptive Moving Average, AMA)
文章目录 1. 考夫曼自适应移动平均 (KAMA)算法推导及Python实现2. 对 (KAMA)算法参数进行优化及实现 自适应移动平均(Adaptive Moving Average, AMA)由Perry Kaufman在其著作《Trading Systems and Methods》中提出,它通过动态调整平滑系数来…...
Java密码加密存储算法,SpringBoot 实现密码安全存储
文章目录 一、写在前面二、密码加密存储方式1、基于MD5加盐方式2、SHA-256 Salt(不需要第三方依赖包)3、使用 BCrypt 进行哈希4、使用 PBKDF2 进行哈希5、使用 Argon2 进行哈希6、SCrypt 一、写在前面 日常开发中,用户密码存储是严禁明文存…...
使用 Version Catalogs统一配置版本 (Gradle 7.0+ 特性)
1.在 gradle/libs.versions.toml 文件中定义: [versions] compileSdk "34" minSdk "21" targetSdk "34" 2. 在 build.gradle 中使用: android {compileSdkVersion libs.versions.compileSdk.get().toInteger()defaul…...

涨薪技术|0到1学会性能测试第95课-全链路脚本开发实例
至此关于系统资源监控、apache监控调优、Tomcat监控调优、JVM调优、Mysql调优、前端监控调优、接口性能监控调优的知识已分享完,今天学习全链路脚本开发知识。后续文章都会系统分享干货,带大家从0到1学会性能测试。 前面章节介绍了如何封装.h头文件,现在通过一个实例来介绍…...
C++文件和流基础
C文件和流基础 1. C文件和流基础1.1 文件和流的概念1.2 标准库支持1.3 常用文件流类ifstream 类ofstream 类fstream 类 2.1 打开文件使用构造函数打开文件使用 open() 成员函数打开文件打开文件的模式标志 2.2 关闭文件使用 close() 成员函数关闭文件关闭文件的重要性 3.1 写入…...

Spring AI Alibaba + Nacos 动态 MCP Server 代理方案
作者:刘宏宇,Spring AI Alibaba Contributor 文章概览 Spring AI Alibaba MCP 可基于 Nacos 提供的 MCP server registry 信息,建立一个中间代理层 Java 应用,将 Nacos 中注册的服务信息转换成 MCP 协议的服务器信息,…...

MCP:让AI工具协作变得像聊天一样简单 [特殊字符]
想象一下,你正在处理一个项目,需要从A平台查看团队讨论,从B平台获取客户信息,还要在GitHub上检查代码进度。传统做法是什么?打开三个不同的网页,在各个平台间来回切换,复制粘贴数据,最后还可能因为信息分散而遗漏重要细节。 听起来很熟悉?这正是当前工作流程的痛点所…...
C++ Learning string类模拟实现
string类模拟实现 std::string 类作为 C 标准库中非常重要的一个类型,它封装了字符串的动态分配、内存管理以及其他字符串操作。 基本构思与设计 一个简化版的 string 类需要满足以下基本功能: 存储一个字符数组(char*)。记录…...
Message=“HalconDotNet.HHandleBase”的类型初始值设定项引发异常
该异常通常与HalconDotNet库的版本冲突或环境配置问题有关,以下是常见解决方案: 版本冲突处理 检查项目中是否同时存在多个HalconDotNet引用(如NuGet安装和本地引用混用),需删除所有冲突引用并统一版本2确保工具…...

AI炼丹日志-27 - Anubis 通过 PoW工作量证明的反爬虫组件 上手指南 原理解析
点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…...

阿姆达尔定律的演进:古斯塔夫森定律
前言 在上一篇文章《使用阿姆达尔定律来提升效率》中提到的阿姆达尔定律前提是假设问题的规模保持不变,并且给定一台速度更快的机器,目标是更快地解决问题。然而,在大多数情况下,这并不完全正确。当有一台更快的机器时࿰…...

JavaScript极致性能优化全攻略
JavaScript性能优化深度指南 1 引言 JavaScript性能优化在现代Web开发中至关重要。随着Web应用日益复杂,性能直接影响用户体验、搜索引擎排名和业务转化率。研究表明,页面加载时间每增加1秒,转化率下降7%,跳出率增加32%。通过优化JavaScript性能,开发者可以: 提升用户满…...
批量大数据并发处理中的内存安全与高效调度设计(以Qt为例)
背景 在批量处理大型文件(如高分辨率图片、视频片段、科学数据块)时,开发者通常希望利用多核CPU并行计算以提升处理效率。然而,如果每个任务对象的数据量很大,直接批量并发处理极易导致系统内存被迅速耗尽,出现程序假死、崩溃,甚至系统级“死机”。 Qt自带的线程池(Q…...