多个nginx共享值、缓存问题

背景

目前我在集成登录认证功能(cas),使用的架构是nginx+lua,由于我们有多个系统(全是前端项目),每套系统都采用nginx+lua的方式进行部署(即每个系统都是一个nginx),cas登录认证使用到了nginx缓存机制,现在的问题在于这么一个场景:

有两个项目A、B,两个使用的是同一个域名C,如下图:

在这里插入图片描述

问题所在:

用户的角度是:AB是一套系统,我登录了A,到B系统我就不会在登录了…

开发角度:因为A、B是两套nginx,登录认证又使用到了nginx缓存,这就造成一个问题,访问A的使用用的是A系统的缓存,访问B系统,使用的是B系统的缓存;即便在A系统登录了,但是到B系统,由于B系统没有缓存,就会造成在登录一次;

解决方案

对于上述的问题,目前我想到了下面这几种方案,各有优缺点,选择自己最合适的就行;

  1. 引入redis集中缓存;
  2. 使用共享磁盘,使用一个nginx缓存,路由的时候,路由到共享磁盘的绝对路径上;
  3. 更改路径,在使用缓存的地址上,分别路由到各自的缓存上,分别使用各自的缓存(缺陷,如果使用cookie的话,会频繁刷新cookie,并且会给服务带来性能压力)
  4. 将项目部署同一个nginx上(缺点:部署发布的时候,流程特别慢!nginx要是炸的话,项目全炸)

方案一:redis

统一使用redis缓存;

将缓存使用一个集中式的,就可以避免上述的问题,而且还顺带解决了单点登录问题!!

优点:

  • 解决了缓存共享值问题;
  • 解决单点登录问题;

缺点:

  • 引入了redis,系统复杂度变高
  • 维护成本也上升;

方案二:共享磁盘

这种方式是,使用一个nginx的缓存,在具体路由B项目的时候,路由到共享磁盘的绝对路径上;

相当于是B项目的部署只是为了将内容放到共享磁盘里面,真正走的只有A系统,通过location段路由到共享磁盘目录就行

A项目的nginx配置示例:

server {
    listen 8080;
    server_name ~^test-(?<subdomain>.+)\.aaaa\.com;
    # 禁止转发时携带端口
    port_in_redirect off;
    client_body_buffer_size 1024m;
    client_max_body_size    1024m;
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 2;
    gzip_types text/plain text/json application/javascript application/x-javascript text/css application/xml text/javascript font/ttf font/otf image/svg+xml;
    gzip_vary on;

    set $hpath '/usr/share/nginx/html/dist/$subdomain/';
    
    # 访问B项目的时候,在这里写死共享磁盘路径
    location /info {
        set $hpath '/home/dist/bdcInfo/';
     
        resolver 8.8.8.8;     
        # access_log /home/cc.log main;
        # error_log /home/ww.log;   
        access_by_lua_file /etc/nginx/cas.lua;
        default_type text/plain;
        alias $hpath;
        index index.html;
        try_files $uri $uri/  /index.html;
    }
    location / {
        resolver 8.8.8.8;     
        # access_log /home/cc.log main;
        # error_log /home/ww.log;   
        access_by_lua_file /etc/nginx/cas.lua;
        default_type text/plain;
        root $hpath;
        index index.html;
        try_files $uri $uri/  /index.html;
    }
    
    location /currentUser {
        default_type text/html;
        charset utf-8;
        # access_log /home/base-station-test11.log main;
        # error_log /home/qq.log;
        access_by_lua_file /etc/nginx/current_user.lua;
    }
    
    proxy_intercept_errors  on;
    error_page 404 400 403 500 502  = /404.html;
    location = /404.html {
        root /home/resource;
    }
}

优点:

  • 解决了上述问题;

缺点:

  • 需要运维引入共享磁盘,技术选型:nfs ,fastdfs,nas,增加运维成本

方案三:配置B的登录路由

需要前端配合请求权限的接口修改为B的前缀,我这里使用到的登录接口为currentUser

nginx示例配置

server {
    listen 8080;
    server_name ~^test-(?<subdomain>.+)\.aaaa\.com;
    # 禁止转发时携带端口
    port_in_redirect off;
    client_body_buffer_size 1024m;
    client_max_body_size    1024m;
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 2;
    gzip_types text/plain text/json application/javascript application/x-javascript text/css application/xml text/javascript font/ttf font/otf image/svg+xml;
    gzip_vary on;

    set $hpath '/usr/share/nginx/html/dist/$subdomain/';
    
    # 访问B项目的时候,在这里写死共享磁盘路径
    location /info {
        set $hpath '/home/dist/bdcInfo/';
     
        resolver 8.8.8.8;     
        # access_log /home/cc.log main;
        # error_log /home/ww.log;   
        access_by_lua_file /etc/nginx/cas.lua;
        default_type text/plain;
        alias $hpath;
        index index.html;
        try_files $uri $uri/  /index.html;
    }
    # 新增B请求登录的接口前缀
    location /info/currentUser {
        default_type text/html;
        charset utf-8;
        # access_log /home/base-station-test11.log main;
        # error_log /home/qq.log;
        access_by_lua_file /etc/nginx/lua/cas-auth/current_user.lua;
    }
    
    location / {
        resolver 8.8.8.8;     
        # access_log /home/cc.log main;
        # error_log /home/ww.log;   
        access_by_lua_file /etc/nginx/cas.lua;
        default_type text/plain;
        root $hpath;
        index index.html;
        try_files $uri $uri/  /index.html;
    }
    
    location /currentUser {
        default_type text/html;
        charset utf-8;
        # access_log /home/base-station-test11.log main;
        # error_log /home/qq.log;
        access_by_lua_file /etc/nginx/current_user.lua;
    }
    
    proxy_intercept_errors  on;
    error_page 404 400 403 500 502  = /404.html;
    location = /404.html {
        root /home/resource;
    }
}

这种方案成本比较低,但是缺点也很明显;

这种在请求A的时候,会走登录,请求B的时候,也会走登录,但是A,B域名一致,就导致A,B的cookie来回重刷,比较耗费性能!

这里还有个疑问点是:

为什么在登录了A之后,在请求B的时候为什么不跳登录页,而是直接走接口!!!(这里没弄懂)

就是我第一次登录的时候,访问A,A会跳转到登录页,然后输入用户名密码之后,走了一系列的登录接口,登录成功;

这个时候在访问B ,B没有跳转到登录页,跟A一样,走的一模一样的登录接口,然后登录成功!!

是因为同一域名的问题么?????没搞懂!!

方案四:将A,B部署在同一nginx上

这个就不用解释了,但缺点很明显,一旦nginx出现问题,A,B项目都不能访问,而且在部署的时候,需要拉两套代码,编译两套代码,时间会很长

遗留问题

方案三最后的那几行,确实没想通,如果大家有什么想法的话,欢迎沟通哈!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch读取tiny-imagenet-200的验证集(val)

ori_train torchvision.datasets.ImageFolder(root args.datadir /tiny-imagenet-200/train/, transformtransform)#可以获取class_idx的映射class_idx ori_train.class_to_idx val_annotations.txt中存储着每个图片对应的类别 获取验证集的标签 test_target []#读取val_…

java:jpa、Hibernate、Spring Data JPA、ORM以及和mybatis的区别

文章目录 Java连接数据库几种方式JPAHibernate和Spring Data JPAORM框架jpa和mybatis区别Spring Boot JPA使用例子1、创建库和表2、添加依赖3、配置数据源和Hibernate属性4、配置实体类5、创建一个继承JpaRepository的接口&#xff1a;6、创建一个控制器&#xff08;Controller…

汽车电子 -- 车载ADAS之FCTA/FCTB(前方横向来车碰撞预警/制动)

参看&#xff1a;功能定义-前方交通穿行提示&制动 1、前方横向来车碰撞预警/制动 FCTA/FCTB&#xff08; Front Cross Traffic Alert /Brake&#xff09; 前方横向来车碰撞预警FCTA&#xff08; Front Cross Traffic Alert &#xff09; 其功能表现为在车辆低速前进时&am…

解锁 ElasticJob 云原生实践的难题

发生了什么 最近在逛 ElasticJob 官方社区时发现很多小伙伴都在头疼这个 ElasticJob 上云的问题&#xff0c;ElasticJob 本就号称分布式弹性任务调度框架&#xff0c;怎么在云原生环境就有了问题了呢&#xff0c;这就要从 Kubenertes 和 ElasticJob 的一些状态化说起。 有意思的…

Java SE

目录 编程编的其实就是启动之后的内存⭐配置环境Java环境Windows配置Java环境变量Linux配置Java环境变量前言&#xff1a;常见Linux系统 Java基础类型八大基本数据类型数值型非数值型 void引用数据类型 运算符位运算符其他 基本结构表达式方法类实例&#xff08;对象&#xff0…

战略制定|竞争战略管理分析六大常用工具

企业战略可从多个角度理解&#xff0c;体现为著名的5P模型。首先&#xff0c;从未来发展视角看&#xff0c;战略是一种计划(Plan)&#xff0c;指导企业朝向既定目标前进。而从过去的发展历程看&#xff0c;它呈现为一种模式(Pattern)&#xff0c;反映了企业的历史行为趋势。在产…

【Apifox】测试工具自动编写接口文档

在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功能&#xff0c; 在接…

解决git action发布失败报错:Error: Resource not accessible by integration

现象&#xff1a; 网上说的解决方法都是什么到github个人中心setting里面的action设置里面去找。 可这玩意根本就没有&#xff01; 正确解决办法&#xff1a; 在你的仓库页面&#xff0c;注意是仓库页面的setting里面&#xff1a; Actions> General>Workflow permisss…

dart多线程双向通信的案例----【小学4年级课程】

下面是运行后的打印顺序 I/flutter (20170): 上班 I/flutter (20170): 这里是校长室:main I/flutter (20170): 这里是饭堂:fantang1 I/flutter (20170): 这里是收发室--检查小孩发回去给他妈妈的信息是&#xff1a;我是秘书的儿子&#xff0c;我来到在校长室了。校长今晚想吃羊…

Docker 概述与安装

文章目录 1. Docker简介2. 传统虚拟机和容器3. Docker运行速度快的原因4. Docker软件4.1 Docker镜像4.2 Docker容器4.3 Docker仓库 5. Docker架构6. CentOS安装Docker6.1 卸载旧版本6.2 配置yum资源库6.3 安装Docker引擎6.4 启动docker引擎6.5 设置开机自启 7. 卸载Docker8. 运…

DM8误删除操作恢复方案

达梦数据库三种在误删除操作后的回退方案 一、闪回表 当用户操作不慎导致错误的删改数据时&#xff0c;闪回方式可以恢复数据。闪回技术&#xff0c;就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原…

Java大型电商项目——品优购(一)

视频教程&#xff1a;【黑马程序员】Java大型电商项目—品优购【配套源码笔记】_哔哩哔哩_bilibili源码下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1fECz5In_XCB-aW6ed6ZTbA 提取码&#xff1a;27xa 技术选型&#xff1a; 后端框架&#xff1a;SpringSprin…

使用 watch+$nextTick 解决Vue引入组件无法使用问题

问题描述&#xff1a; 很多时候我们都需要使用第三方组件库&#xff0c;比如Element-UI&#xff0c;Swiper 等等。 如果我们想要在这些结构中传入自己从服务器请求中获取的数据就会出现无法显示的问题。 比如我们在下面的Swiper例子中&#xff0c;我们需要new Swiper 才能让…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程&#xff0c;包括开发主机环境与云平台的配置&#xff0c;视频编码程序的编写与理解&#xff0c;代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境&#xff0c;编译并运行编码…

软著项目推荐 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

图数据库HugeGraph:HugeGraph-Hubble基于Web的可视化图管理初体验

原创/朱季谦 一、HugeGraph-Hubble简介 关于HugeGraph&#xff0c;官方资料是这样介绍的&#xff0c;它是一款易用、高效、通用的开源图数据库系统&#xff08;Graph Database&#xff09;&#xff0c; 实现了 Apache TinkerPop3 框架及完全兼容 Gremlin 查询语言&#xff0c…

Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet&#xff08;简写rs&#xff09; 1.简介 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;rs较完整参数解释 2.创建和删除 &#xff08;1&#xff09;创建 &#xff08;2&#xff09;删除 3.扩容和缩容 &#xff08…

【Python】torch.exp()和 torch.sigmoid()函数详解和示例

本文对torch.exp&#xff08;&#xff09;和 torch.sigmoid&#xff08;&#xff09;函数进行原理和示例讲解&#xff0c;以帮助大家理解和使用。 目录 torch.exp函数原理运行示例 torch.sigmoid&#xff08;&#xff09;函数原理运行示例torch.sigmoid相关知识 结合运行 torc…

Leetcode 380. O(1) 时间插入、删除和获取随机元素

文章目录 题目代码&#xff08;11.28 首刷看解析&#xff09; 题目 Leetcode 380. O(1) 时间插入、删除和获取随机元素 代码&#xff08;11.28 首刷看解析&#xff09; 1.length:表示的是数组的长度 数组 2.length():表示的是字符串的长度 字符串 3.size():表示的是集合中有多…

Re55:读论文 Entities as Experts: Sparse Memory Access with Entity Supervision

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Entities as Experts: Sparse Memory Access with Entity Supervision 模型名称&#xff1a;Entities as Experts (EaE) ArXiv网址&#xff1a;https://arxiv.org/abs/2004.07202 本文…
最新文章