🌈 我是“没事学AI”,meishixueai, 欢迎咨询、交流,共同学习:
👁️ 【关注】我们一起挖 AI 的各种门道,看看它还有多少新奇玩法等着咱们发现
👍 【点赞】为这些有用的 AI 知识鼓鼓掌,让更多人知道学 AI 也能这么轻松
🔖 【收藏】把这些 AI 小技巧存起来,啥时候想练手了,翻出来就能用
💬 【评论】说说你学 AI 时的想法和疑问,让大家的思路碰出更多火花
👉 关注获取更多AI技术干货,点赞/收藏备用,欢迎评论区交流学习心得! 🚀
一、集群架构设计与组件定位
1.1 整体架构概述
Nginx-Tomcat-MySQL集群是典型的三层架构模式,通过Docker容器化部署可实现环境一致性与快速扩缩容。该架构中各组件分工明确:
- Nginx:作为前端反向代理服务器,处理静态资源请求并分发动态请求至Tomcat集群
- Tomcat:作为应用服务器,运行Java Web应用程序,处理业务逻辑
- MySQL:作为关系型数据库,存储应用产生的结构化数据
- Docker:提供容器化运行环境,通过容器编排实现组件间通信与生命周期管理
1.2 组件间数据流向
- 客户端请求首先到达Nginx服务器
- Nginx根据请求类型进行分发:
- 静态资源(CSS/JS/图片)直接由Nginx返回
- 动态请求转发至后端Tomcat集群
- Tomcat处理业务逻辑时,通过JDBC连接MySQL数据库进行数据读写
- 处理结果经Tomcat→Nginx→客户端的路径返回
二、Docker容器化核心技术
2.1 Docker ***pose编排原理
Docker ***pose通过YAML文件定义多容器应用的服务、网络和存储配置,实现一键部署。其核心优势在于:
- 声明式配置:通过yaml文件描述整个应用栈
- 服务依赖管理:自动处理容器启动顺序
- 网络隔离:为集群创建独立网络环境
- Volume持久化:确保数据不随容器销毁而丢失
2.1.1 基础配置案例
# docker-***pose.yml 基础结构
version: '3.8' # ***pose版本
services: # 定义服务集合
nginx:
image: nginx:latest # 使用官方镜像
ports:
- "80:80" # 端口映射
***works:
- app-***work # 加入自定义网络
depends_on: # 依赖关系
- tomcat1
- tomcat2
***works: # 定义网络
app-***work:
driver: bridge # 桥接模式
volumes: # 定义数据卷
mysql-data:
2.2 容器网络通信机制
Docker为容器间通信提供三种网络模式:
- bridge模式:默认模式,容器通过虚拟网桥通信
- host模式:容器直接使用宿主机网络
- overlay模式:适用于跨主机容器通信
在本集群中采用bridge模式,通过自定义网络实现组件隔离与通信:
# 网络配置示例
***works:
app-***work:
driver: bridge
ipam:
config:
- sub***: 172.20.0.0/16 # 自定义子网
三、各组件容器化实现
3.1 MySQL容器配置
MySQL容器需重点配置数据持久化与初始化脚本,确保数据不丢失且应用启动时自动创建所需表结构。
3.1.1 配置示例
# docker-***pose.yml 中MySQL配置
services:
mysql:
image: mysql:8.0
container_name: mysql-server
restart: always # 自动重启
environment:
MYSQL_ROOT_PASSWORD: root123 # root密码
MYSQL_DATABASE: appdb # 自动创建数据库
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql # 数据持久化
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化脚本
***works:
- app-***work
volumes:
mysql-data:
3.1.2 初始化脚本示例(init.sql)
-- 创建用户表
CREATE TABLE IF NOT EXISTS `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入测试数据
INSERT INTO `user` (username, password) VALUES ('test', '123456');
3.2 Tomcat容器配置
Tomcat容器需部署Web应用,并配置数据库连接参数,通过环境变量实现配置外部化。
3.2.1 配置示例
# docker-***pose.yml 中Tomcat配置
services:
tomcat1:
image: tomcat:9.0
container_name: tomcat-1
restart: always
environment:
- DB_HOST=mysql # 数据库主机名(容器名)
- DB_PORT=3306
- DB_NAME=appdb
- DB_USER=appuser
- DB_PASS=apppass
volumes:
- ./tomcat/webapps:/usr/local/tomcat/webapps # 部署应用
- ./tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml # 自定义配置
depends_on:
- mysql
***works:
- app-***work
# 可配置多个Tomcat实例实现负载均衡
tomcat2:
image: tomcat:9.0
container_name: tomcat-2
# 配置与tomcat1相同
3.2.2 数据库连接配置(Java示例)
// 从环境变量获取数据库配置
String dbHost = System.getenv("DB_HOST");
String dbPort = System.getenv("DB_PORT");
String dbName = System.getenv("DB_NAME");
String dbUser = System.getenv("DB_USER");
String dbPass = System.getenv("DB_PASS");
// 构建连接URL
String url = String.format("jdbc:mysql://%s:%s/%s?useSSL=false&serverTimezone=UTC",
dbHost, dbPort, dbName);
// 获取数据库连接
Connection conn = DriverManager.getConnection(url, dbUser, dbPass);
3.3 Nginx容器配置
Nginx主要负责请求转发与负载均衡,需配置反向代理规则与静态资源路径。
3.3.1 配置示例
# docker-***pose.yml 中Nginx配置
services:
nginx:
image: nginx:latest
container_name: nginx-server
restart: always
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # 配置文件
- ./nginx/html:/usr/share/nginx/html # 静态资源
- ./nginx/logs:/var/log/nginx # 日志
depends_on:
- tomcat1
- tomcat2
***works:
- app-***work
3.3.2 Nginx配置文件(app.conf)
# 负载均衡配置
upstream tomcat_servers {
server tomcat1:8080; # 指向tomcat1容器
server tomcat2:8080; # 指向tomcat2容器
# 可添加权重配置: server tomcat1:8080 weight=2;
}
server {
listen 80;
server_name localhost;
# 静态资源处理
location ~* \.(html|css|js|jpg|jpeg|png|gif)$ {
root /usr/share/nginx/html;
expires 1h; # 缓存1小时
}
# 动态请求转发
location / {
proxy_pass http://tomcat_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
四、集群部署与验证
4.1 部署步骤
- 创建项目目录结构:
mkdir -p docker-cluster/{nginx/conf.d,nginx/html,tomcat/webapps,mysql}
cd docker-cluster
-
编写各组件配置文件(如上述示例)
-
启动集群:
# 后台启动
docker-***pose up -d
# 查看启动状态
docker-***pose ps
# 查看日志
docker-***pose logs -f
4.2 功能验证
- 访问静态资源:
http://宿主机IP/test.html,验证Nginx静态资源服务 - 访问动态应用:
http://宿主机IP/app,验证Tomcat应用部署 - 数据库连接测试:通过应用操作数据,验证MySQL连接
- 负载均衡测试:多次访问动态应用,查看Tomcat日志确认请求分发
# 查看Tomcat1日志
docker logs -f tomcat-1
# 查看Tomcat2日志
docker logs -f tomcat-2
五、集群扩展与优化
5.1 水平扩展Tomcat节点
通过Docker ***pose可快速扩展应用服务节点:
# 扩展为3个Tomcat实例
docker-***pose up -d --scale tomcat1=3
5.2 性能优化建议
-
Nginx优化:
- 启用gzip压缩
- 配置合理的缓存策略
- 调整工作进程数:
worker_processes auto;
-
Tomcat优化:
- 调整线程池参数
- 启用APR库提升性能
- 配置JVM参数:
JAVA_OPTS="-Xms512m -Xmx1024m"
-
MySQL优化:
- 配置连接池
- 优化索引与SQL语句
- 启用查询缓存(适用于读多写少场景)
以上为基于Docker的Nginx-Tomcat-MySQL集群部署核心内容,通过容器化部署可大幅简化环境配置与部署流程,提高系统可移植性与扩展性。