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
相关产品推荐
相关产品推荐

