Redis 在 VPS 上连接不上,不能只看“端口有没有开”。它可能卡在服务没启动、6379 没监听、bind 只绑定本机、protected-mode 拦截、密码或 ACL 不匹配,也可能是防火墙、安全组、Docker 端口映射和持久化文件权限问题。
更重要的是:Redis 不应该直接裸奔在公网。排查连接问题时,目标不是把 0.0.0.0:6379 放给所有人访问,而是在最小暴露前提下确认应用能稳定连接。
常见报错可以先粗分:
| 现象 | 更可能的问题 |
|---|---|
Connection refused | Redis 没启动、端口没监听、监听地址不对 |
Connection timed out | UFW、安全组、网络路径拦截 |
NOAUTH Authentication required | 已开启密码/ACL,但客户端没带认证 |
DENIED Redis is running in protected mode | protected-mode 拦截远程访问 |
| 服务反复重启 | 配置错误、权限错误、内存或持久化文件问题 |
先在 VPS 本机执行:
redis-cli ping
sudo systemctl status redis-server --no-pager
如果本机 PING 都不返回 PONG,先排服务本身;如果本机正常但应用或远程连不上,再排监听地址、防火墙和认证。
Ubuntu / Debian 常见服务名是 redis-server:
sudo systemctl status redis-server --no-pager
sudo journalctl -u redis-server -n 100 --no-pager
如果服务启动失败,重点看这些信号:
- 配置文件语法错误;
- 端口 6379 被占用;
- RDB / AOF 文件目录权限错误;
- 磁盘满导致无法写入;
- 内存不足或 OOM;
- Docker volume 挂载目录权限不对。
确认 Redis 版本和配置文件位置:
redis-server --version
redis-cli CONFIG GET dir
redis-cli CONFIG GET dbfilename
Redis 官方文档也提醒:Redis 可以无配置文件启动,但正式使用应通过 redis.conf 管理配置;运行时 CONFIG SET 的修改不一定会写回配置文件,重启后可能失效。
sudo ss -lntup | grep 6379
常见结果:
127.0.0.1:6379
0.0.0.0:6379
如果只监听 127.0.0.1:6379,说明只有本机能连。对于同机应用,这是推荐状态;对于远程应用,就需要通过内网、隧道或受控白名单访问。
本机测试:
redis-cli -h 127.0.0.1 -p 6379 ping
如果这里正常,而远程不通,问题通常在 bind、protected-mode、防火墙、安全组或客户端认证。
常见配置文件:
/etc/redis/redis.conf
查看关键项:
grep -E '^(bind|protected-mode|requirepass|port)' /etc/redis/redis.conf
安全推荐:
bind 127.0.0.1 ::1
protected-mode yes
如果应用和 Redis 在同一台 VPS,不要改成 0.0.0.0。如果确实需要跨机器访问,优先使用内网 IP 或 VPN 网络,例如:
bind 127.0.0.1 10.0.0.8
protected-mode yes
修改后重启:
sudo systemctl restart redis-server
再检查监听:
sudo ss -lntup | grep 6379
如果 Redis 开启了密码,客户端必须带认证。旧配置常见:
requirepass 强密码
Redis 6+ 还可能使用 ACL。查看 ACL:
redis-cli ACL LIST
带密码测试:
redis-cli -a '你的密码' ping
更安全的方式是避免把密码留在 shell history 中,可以临时用环境变量或交互输入。
应用连接串常见格式:
redis://:[email protected]:6379/0
如果应用日志里出现 NOAUTH,说明 Redis 要认证但客户端没带;如果出现 WRONGPASS,就是密码或用户不匹配。
本机防火墙:
sudo ufw status verbose
如果只允许固定来源 IP:
sudo ufw allow from 203.0.113.10 to any port 6379 proto tcp
不要随手执行:
sudo ufw allow 6379/tcp
除非你已经在云安全组里限制了来源,并且确认业务必须远程访问。
从客户端测试端口:
nc -vz VPS公网IP 6379
端口不通,先排网络层;端口通但认证失败,再排 Redis 配置。
如果 Redis 跑在 Docker 里:
docker ps
看 PORTS 是否包含:
127.0.0.1:6379->6379/tcp
生产环境更推荐绑定本机:
services:
redis:
image: redis:7-alpine
ports:
- "127.0.0.1:6379:6379"
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis-data:/data
如果容器反复重启,看日志:
docker logs --tail=100 容器名
volume 权限、AOF/RDB 写入失败、内存限制过低,都可能让 Redis 起不来。
建议按这个顺序:
redis-cli ping本机测试;systemctl status redis-server看服务;journalctl -u redis-server -n 100看日志;ss -lntup | grep 6379看监听地址;- 检查
bind、protected-mode、requirepass、ACL; - 检查 UFW 和云安全组;
- Docker 场景检查
ports和 volume; - 最后再改应用连接串。
Redis 适合放在应用旁边,不适合直接暴露公网。更安全的连接方式:
- 同机应用:监听
127.0.0.1; - 同云内网:监听内网 IP;
- 远程管理:SSH 隧道;
- 多机访问:WireGuard / Tailscale / ZeroTier;
- 临时排障:安全组只放行固定 IP,用完关闭。
延伸阅读:
VPS 上 Redis 连接不上,最常见不是一个原因,而是监听地址、protected-mode、认证、防火墙和应用连接串同时叠加。先从本机 redis-cli ping 开始,再逐层排到远程访问。不要为了“连上”就把 6379 放给全网,Redis 一旦裸露公网,风险远高于一次连接失败。
