IORedis连接被拒绝:带密码认证的Redis配置故障排查
我正在开发一个后端Demo项目,用Docker整合MongoDB、Redis和Express服务。原本所有功能正常,但给Redis设置密码认证后,IORedis无法连接Redis服务器,报错connect ECONNREFUSED <ip>。
以下是我的配置和代码:
docker-compose.yml配置
version: '3.8' volumes: portfolio-data: portfolio-cache: services: database: image: mongo restart: always environment: - MONGO_INITDB_ROOT_USERNAME=$MONGODB_ROOT_USERNAME - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD volumes: - portfolio-data:/data/db ports: - 27017:27017 redis: image: redis restart: always ports: - 6379:6379 volumes: - ./config/redis.conf:/etc/redis/redis.conf - portfolio-cache:/data command: ["redis-server", "/etc/redis/redis.conf"] portfolio-api: image: portfolio-api depends_on: - database - redis env_file: ./.env environment: - API_PORT=8000 - DB_HOST=$MONGO_HOST - DB_PORT=27017 - DB_USER=$MONGO_USER - DB_PASSWORD=$MONGO_PASSWORD - REDIS_HOST=$REDIS_HOST - REDIS_PASSWORD=$REDIS_PASSWORD - REDIS_PORT=6379 - REDIS_SECRET=$REDIS_SECRET volumes: - .:/app ports: - 8000:8000
IORedis连接代码
const redis = new Redis({ host: redisConfig.host, port: redisConfig.port, password: redisConfig.password }); redis.on('error', (err: Error) => { backendLogger.error(err.message); }); redis.on('connect', () => { backendLogger.info('Connected successfully to redis'); });
错误日志
2022-09-28T06:46:29.707Z error: connect ECONNREFUSED <ip>
补充说明:我可以通过Redis客户端用密码正常连接Redis;不使用自定义配置文件时,IORedis能正常连接。
解决方案
检查redis.conf的bind配置
默认redis.conf中bind 127.0.0.1会限制Redis只监听本地回环地址,Docker内部容器无法访问。需要将其修改为bind 0.0.0.0,允许所有IP地址访问Redis服务。验证配置文件是否正常加载
进入Redis容器执行命令,确认密码配置是否生效:
docker exec -it <redis-container-name> redis-cli 127.0.0.1:6379> CONFIG GET requirepass
如果返回""或(nil),说明配置文件未被正确加载,检查挂载路径是否正确,或者启动命令是否指定了正确的配置文件路径。
确认REDIS_HOST的配置值
在Docker Compose环境中,容器之间通过服务名通信,所以portfolio-api的REDIS_HOST应该设置为redis(即Redis服务的名称),而不是localhost或外部IP。检查.env文件中的REDIS_HOST是否正确。检查配置文件权限
挂载的redis.conf文件可能存在权限问题,导致Redis进程无法读取。可以修改本地文件权限为644,或者在docker-compose.yml中为Redis服务添加user: "redis"指令,确保Redis进程有读取配置文件的权限。
内容的提问来源于stack exchange,提问作者theGoerner

