如何通过域名访问Redis服务器 有无适配PostgreSQL等数据库的通用方案
术语说明
你需要的技术是四层(传输层)反向代理,用于原生TCP/UDP协议的流量转发,不解析应用层内容,可通用适配Redis、PostgreSQL等所有基于TCP协议的服务。如果仅需要域名映射服务IP、不需要端口转换/高可用/负载均衡能力,直接配置DNS A记录解析即可实现需求。
Nginx 适用性说明
你此前配置失败是因为用错了模块:redis2模块是七层HTTP协议转Redis协议的适配组件,用于支持HTTP请求操作Redis,无法实现原生Redis TCP协议的透明转发。
Nginx本身完全支持你的需求,需要启用stream模块(默认编译未开启,可执行nginx -V查看编译参数中是否携带--with-stream确认,无该参数需要重新编译Nginx添加)。
通用解决方案(同时适配Redis、PostgreSQL)
以下两种方案都支持直接使用域名访问,无需手动填写端口:
方案1:Nginx Stream 四层代理
在nginx.conf主配置文件中,和原有http块平级的位置新增如下stream配置块:
stream { # Redis 代理配置,监听默认6379端口 server { listen 6379; proxy_pass 实际Redis服务内网地址:6379; # 长连接保活配置 proxy_timeout 300s; proxy_connect_timeout 10s; } # PostgreSQL 代理配置,监听默认5432端口 server { listen 5432; proxy_pass 实际PostgreSQL服务内网地址:5432; } }
配置完成后执行nginx -s reload重载配置,将redis.example.org、postgresql.example.org等域名解析到Nginx代理服务器的公网IP即可直接使用。
方案2:HAProxy 四层代理(更适合高并发、多节点负载场景)
HAProxy默认原生支持四层代理,对数据库长连接的适配性更好,编辑haproxy.cfg添加如下配置:
# Redis 代理配置 frontend redis_front bind *:6379 default_backend redis_back backend redis_back server redis_node 实际Redis服务地址:6379 check inter 3000 rise 2 fall 3 # PostgreSQL 代理配置 frontend pg_front bind *:5432 default_backend pg_back backend pg_back server pg_node 实际PostgreSQL服务地址:5432 check inter 3000 rise 2 fall 3
配置完成后重启HAProxy服务,将域名解析到HAProxy服务器公网IP即可使用。
特殊场景简化方案
如果所有服务都部署在同一台公网服务器,不需要做流量转发、高可用能力,无需部署代理服务:直接将对应域名的DNS A记录指向该服务器公网IP,开放服务器公网的6379、5432端口,即可直接用域名访问服务。
安全提示
数据库类服务直接开放公网访问必须开启强密码验证,建议额外配置IP白名单限制访问来源,避免数据泄露。
内容的提问来源于stack exchange,提问作者typicallearner

