You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx流反向代理mongos启动时后端不可用配置报错问题

嘿,我来帮你搞定这个Nginx stream代理的问题~

首先说你遇到的set指令报错:这是因为Nginx的stream模块里,set不能直接放在server块的最外层上下文里。和http模块不一样,stream里的set只能用在preread阶段或者配合map指令使用,直接在server块里定义变量是不允许的,所以才会抛出那个错误。

接下来给你用upstream的解决方案,完全适配你需要代理1-4个mongos、且Nginx启动时后端可能未运行的场景:

解决方案:用upstream配合容错配置实现流代理

1. 单mongos节点基础配置

如果只需要代理一个mongos节点,同时保证Nginx不管后端是否运行都能正常启动,可以这么写:

stream {
    upstream stream_mongo_backend {
        # 配置后端节点,加上容错参数很重要
        server mongo_dev:27017 max_fails=3 fail_timeout=10s;
        # 解释下参数:10秒内连接失败3次,就把这个节点标记为不可用;10秒后会再次尝试连接
    }

    server {
        listen 123;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        # 把请求转发到上面定义的upstream组
        proxy_pass stream_mongo_backend;
    }
}

2. 多mongos节点配置(支持1-4个节点)

如果要同时代理多个mongos,直接在upstream里加多个server就行,还能选负载均衡策略(默认是轮询):

stream {
    upstream stream_mongo_backends {
        # 逐个添加你的mongos节点,每个都带上容错参数
        server mongo_dev1:27017 max_fails=3 fail_timeout=10s;
        server mongo_dev2:27017 max_fails=3 fail_timeout=10s;
        server mongo_dev3:27017 max_fails=3 fail_timeout=10s;
        server mongo_dev4:27017 max_fails=3 fail_timeout=10s;
        
        # 可选:如果想让请求优先发给连接数最少的节点,加上这句
        # least_conn;
    }

    server {
        listen 123;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass stream_mongo_backends;
    }
}

3. 动态域名解析适配(如果mongo_dev是域名)

要是mongo_dev是动态域名(IP可能变),或者担心启动时域名解析失败导致Nginx启动不了,可以加上resolve参数,让Nginx动态解析域名:

stream {
    upstream stream_mongo_backend {
        server mongo_dev:27017 resolve max_fails=3 fail_timeout=10s valid=30s;
        # resolve:开启动态域名解析,不用重启Nginx就能更新IP
        # valid:解析结果缓存30秒,避免频繁解析
    }

    server {
        listen 123;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass stream_mongo_backend;
    }
}

几个关键要点

  • Nginx启动兼容性:只要upstream的server配置格式正确,就算后端mongos没运行、或者域名暂时解析失败(加了resolve的情况),Nginx都能正常启动。它会在运行过程中自动尝试连接后端,标记不可用的节点,到时间再重试。
  • 容错参数的作用:max_fails和fail_timeout能让Nginx自动跳过挂掉的节点,避免请求一直卡在失败的连接上。
  • stream模块的优势:本来就是用来做四层TCP/UDP代理的,完美适配MongoDB这种基于TCP的服务。

内容的提问来源于stack exchange,提问作者Flo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:24:10