高可用笔记(3)nginx+tomcat+redis

https://yq.aliyun.com/articles/68644?spm=5176.100239.blogcont68575.12.zDFH6W

在《高可用笔记(1)nginx》中已经使用过nginx反向代理tomcat的http服务,本文将介绍如何用nginx+tomcat+redis的组合实现负载均衡。

首先来看负载均衡需要解决的2个问题

  • 多个tomcat的部署的web应用怎么实现统一出口?
    答:用nginx代理多个tomcat,可以根据实际情况设置不同的权重weight。

  • 多个tomcat的session共享问题怎么解决?
    答:将session的数据保存到同一个redis数据库中。将会用到tomcat-redis-session-manager插件。

准备测试环境

还是这三台测试主机

  • host1 192.168.3.21 (redis/master, nginx, tomcat)
  • host2 192.168.3.22 (redis/slave, tomcat)
  • host3 192.168.3.23 (redis/slave, tomcat)

安装tomcat

经过前面两个笔记,host1的redis、nginx和tomcat均已安装好,host2和host3的redis也已经安装好。
还需要在host2和host3安装tomcat:

$ yum install tomcat -y
$ systemctl enable tomcat

部署tomcat测试项目

拷贝host1的hellonginx项目到host2和host3的相应目录,稍作修改:

$ scp -r root@192.168.3.21:/var/lib/tomcat/webapps/hellonginx /var/lib/tomcat/webapps/
……
#将index.html的“host1”分别改为“host2”和“host3”
……
$ systemctl start tomcat

nginx代理多个tomcat

修改host1的配置文件/etc/nginx/conf.d/http_proxy.conf:

upstream tomcat_server {
    server 192.168.3.21:8080 weight=1; #weight是权重
    server 192.168.3.22:8080 weight=1;
    server 192.168.3.23:8080 weight=1;
}

server {
    listen       80;
    server_name  localhost;


    location /hellonginx{
        proxy_pass http://tomcat_server/hellonginx;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  Host $http_host;

    }
}
$ nginx -s reload

用浏览器打开http://192.168.3.21/hellonginx
第一次:
screenshot

第二次:
screenshot

第三次:
screenshot

第四次:
screenshot

......

如果host2宕机了,那么第一次是host1,第二次是host3,第三次又是host1。
显然host1是不能宕机的,整个环境的高可用还必须借助keepalived+vip,后面的笔记会讲到。

tomcat的session共享

redis的高可用在上一个笔记中已经部署好了,在这里也仅仅是保存session的作用,就不在赘述了。
那么如何将tomcat的session保存到redis中呢?
该tomcat-redis-session-manager出场了。

准备几个jar包:
  • commons-pool2-2.4.2.jar
  • jedis-2.9.0.jar
  • tomcat-redis-session-manager-2.0.0.jar
将三个jar包分别放入三台主机的/usr/share/tomcat/lib/目录下
修改三个tomcat的配置文件/etc/tomcat/context.xml
……
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    maxInactiveInterval="60"
    sentinelMaster="mymaster"
    sentinels="192.168.3.21:7000,192.168.3.22:7000,192.168.3.23:7000"/>
……

重启三个tomcat,完成!

注意:
这里使用的tomcat-redis-session-manager是v2.0.0,配合的另外两个jar是commons-pool2-2.4.2和jedis-2.9.0的。这个版本支持redis-sentinels配置。
小于v2.0.0版本的tomcat-redis-session-manager需要配合commons-pool-1.x和jedis-2.1.0。并且不支持redis-sentinels,只能配置单个redis的host和ip。

附件是上面三个jar包。


### 前后端分离项目的开发文档、接口文档及安全文档 #### 开发文档模板及示例 开发文档通常分为以下几个部分: 1. **项目概述** - 描述整个系统的功能目标以及架构设计思路。 ```markdown ### 项目概述 本项目采用前后端分离模式,前端基于 Vue.js 构建单页应用 (SPA),后端使用 Spring Boot 提供 RESTful API 接口服务[^1]。系统通过 Nginx 实现负载均衡和静态资源托管,利用 Redis 缓存高频访问的数据,MySQL 存储核心业务数据,消息队列 Kafka 和 RocketMQ 负责异步处理任务流。 ``` 2. **技术选型** - 列举并解释所使用的框架和技术及其作用。 ```markdown ### 技术选型 | 组件 | 功能描述 | |--------------|------------------------------------------------------------------------| | Frontend | 使用 Vue.js 框架构建动态交互界面,配合 HTML/CSS/JS 完成页面渲染[^2] | | Backend | 后端选用 Spring Boot 微服务框架简化配置流程,集成 MyBatis 数据持久化层[^1] | | Cache | Redis 作为缓存中间件提升查询效率 | | Database | MySQL 主要负责存储结构化数据 | | Message Queue| Kafka/RocketMQ 承担高并发场景下的解耦与削峰 | ``` 3. **模块划分** - 明确各个子模块的功能范围及其相互关系。 4. **部署方案** - 阐述如何将应用程序发布到生产环境。 ```markdown ### 部署方案 应用程序运行于 Docker 容器之上,借助 Kubernetes 或者 Swarm 管理集群实例规模变化。网关由 Spring Cloud Gateway/Nginx 提供统一入口管理,并支持跨域请求控制策略设置[^1]。 ``` --- #### 接口文档模板及示例 API 文档应清晰定义每一个 HTTP 请求的具体参数要求、返回值格式等内容。 ```json { "title": "用户登录", "description": "验证用户名密码正确性。", "method": "POST", "url": "/api/auth/login", "headers": { "Content-Type": "application/json" }, "requestBody": { "username": "string", "password": "string" }, "responses": [ { "status": 200, "body": "{ \"token\": \"JWT_TOKEN\" }" } ] } ``` 或者更简洁的形式如下所示: ```markdown ### 用户注册接口 - URL: `/api/user/register` - Method: POST - Request Body: ```json { "email":"test@example.com", "password":"securePassw0rd!" } ``` - Response Example(成功响应): Status Code: 201 Created ```json {"message":"User registered successfully."} ``` ``` --- #### 安全文档模板及示例 安全性是现代 Web 应用不可忽视的一环,在此提供一些常见措施说明。 1. **身份认证机制** - JWT Token 认证方式被广泛应用于无状态会话保持中[^2]。 2. **输入校验** - 对所有外部提交的数据执行严格的正则匹配或其他形式的合法性检验以防 SQL 注入攻击等问题发生。 3. **敏感信息保护** - 敏感字段加密传输并通过 HTTPS 协议保障链路层面的安全性。 4. **日志审计** - 关键操作记录至文件或数据库以便后续追踪分析异常行为轨迹。 5. **权限管控** - RBAC(Role-Based Access Control)模型实现细粒度授权管理确保不同角色拥有恰当的操作权限集合[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值