宽心。 2025-10-17 18:38 采纳率: 50%
浏览 12
已结题

redis使用nginx代理

问题遇到的现象和发生背景

有四个环境192.168.1.44,192.168.1.45,192.168.1.46,192.168.1.47;其中192.168.1.44,192.168.1.46这两台机器部署的mvc项目做双活,192.168.1.46,192.168.1.47这两台部署了微服务和redis做冷备只启动其中一台,微服务已经做了代理在192.168.1.44部署nginx代理192.168.1.46,192.168.1.47这两台的微服务,192.168.1.45部署一个nginx代理192.168.1.46,192.168.1.47这两台微服务保证在切换的时候正常访问微服务但是redis这块儿怎么使用nginx代理使切换redis的时候应用能够正常登录

操作环境、软件版本;等信息

LINUX麒麟

尝试过的解决方法

使用nginx的stream配置

我想要达到的结果

可以配置192.168.1.44,192.168.1.45,这两个环境的nginx可以再redis切换的时候正常登录应用

  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-10-17 18:54
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:努力的意义,在于当机会来临时,你有能力抓住它。
    .

    根据您的需求,我来为您提供Redis通过Nginx代理的解决方案。您需要在192.168.1.44和192.168.1.45上配置Nginx的stream模块来实现Redis代理。

    解决方案概述

    使用Nginx的stream模块实现TCP/UDP代理,将Redis的6379端口通过Nginx代理,实现Redis主从切换时的透明访问。

    配置步骤

    1. 检查Nginx是否支持stream模块

    nginx -V 2>&1 | grep -o with-stream
    

    如果输出with-stream,说明已支持。如果没有,需要重新编译Nginx。

    2. 配置Nginx的stream代理

    在192.168.1.44和192.168.1.45的Nginx配置中增加stream配置:

    # 在nginx.conf的http块之外添加
    stream {
        upstream redis_backend {
            # 主Redis服务器(当前活跃的)
            server 192.168.1.46:6379 max_fails=3 fail_timeout=30s;
            # 备Redis服务器
            server 192.168.1.47:6379 backup;
        }
        
        server {
            listen 6379;
            proxy_pass redis_backend;
            proxy_timeout 3s;
            proxy_connect_timeout 2s;
            
            # 健康检查
            health_check interval=10 passes=2 fails=3;
        }
    }
    

    3. 完整的nginx.conf配置示例

    # 主配置文件结构
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    
    # 加载stream模块
    load_module modules/ngx_stream_module.so;
    
    
    events {
        worker_connections 1024;
    }
    
    
    # Redis TCP代理配置
    stream {
        upstream redis_cluster {
            server 192.168.1.46:6379 weight=1 max_fails=3 fail_timeout=30s;
            server 192.168.1.47:6379 weight=1 max_fails=3 fail_timeout=30s backup;
        }
        
        server {
            listen 6379;
            proxy_pass redis_cluster;
            proxy_timeout 5s;
            proxy_connect_timeout 3s;
            proxy_buffer_size 256k;
        }
    }
    
    
    # HTTP代理配置(您现有的微服务代理)
    http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        
        # 您的微服务upstream配置
        upstream microservices {
            server 192.168.1.46:8080;
            server 192.168.1.47:8080 backup;
        }
        
        server {
            listen 80;
            server_name localhost;
            
            location / {
                proxy_pass http://microservices;
                # 其他HTTP代理配置...
            }
        }
    }
    

    4. 应用配置修改

    将您的MVC项目和微服务中的Redis连接配置修改为指向Nginx代理:

    // MVC项目和微服务中的Redis连接字符串
    "RedisConnection": "192.168.1.44:6379,password=your_password,abortConnect=false"
    

    或者

    // Java微服务配置
    spring.redis.host=192.168.1.44
    spring.redis.port=6379
    

    5. 手动切换配置(备选方案)

    如果自动故障转移不够稳定,可以使用手动切换配置:

    stream {
        # 手动切换配置 - 默认指向46
        upstream redis_manual {
            server 192.168.1.46:6379;
            # server 192.168.1.47:6379; # 注释掉备机
        }
        
        server {
            listen 6379;
            proxy_pass redis_manual;
            proxy_timeout 5s;
            proxy_connect_timeout 3s;
        }
    }
    

    需要切换时,修改配置并重载Nginx:

    # 修改配置后重载
    nginx -s reload
    

    6. 验证配置

    测试Redis连接:

    # 测试Nginx代理的Redis连接
    redis-cli -h 192.168.1.44 -p 6379
    
    
    # 在Redis中执行命令测试
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set test "hello"
    OK
    127.0.0.1:6379> get test
    "hello"
    

    7. 监控和日志

    添加访问日志监控:

    stream {
        log_format basic '$remote_addr [$time_local] '
                         '$protocol $status $bytes_sent $bytes_received '
                         '$session_time';
        
        access_log /var/log/nginx/redis-access.log basic;
        
        upstream redis_backend {
            server 192.168.1.46:6379 max_fails=3 fail_timeout=30s;
            server 192.168.1.47:6379 backup;
        }
        
        server {
            listen 6379;
            proxy_pass redis_backend;
            proxy_timeout 5s;
            proxy_connect_timeout 3s;
        }
    }
    

    关键要点

    1. 双活配置:两个Nginx节点(44,45)配置相同,提供冗余
    2. 故障转移:当主Redis(46)不可用时,自动切换到备Redis(47)
    3. 会话保持:应用无需修改代码,只需连接Nginx代理地址
    4. 快速切换:Nginx能够快速检测后端Redis状态并切换

    这样配置后,当Redis主备切换时,您的应用通过Nginx代理可以继续正常访问Redis服务,保证登录功能的正常运行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月17日