Redis connection refused: 흔한 원인과 해결 순서
Dev
마지막 업데이트

Redis connection refused: 흔한 원인과 해결 순서


Redis에서 connection refused가 나오면 먼저 물어야 할 것은 “Redis가 죽었나?”보다 “어떤 host, port, access rule이 이 연결을 거절하고 있나?”입니다. 많은 incident가 Redis 장애처럼 보이지만 실제로는 잘못된 target, loopback-only listener, container networking 실수인 경우가 많습니다.

이 글은 가장 빠른 점검 순서부터 갑니다. Redis가 실제로 listening 중인지, 클라이언트가 올바른 주소를 보고 있는지, bind와 protected mode 때문에 원격 접근이 막힌 것은 아닌지부터 확인합니다.


connection refused는 보통 무엇을 뜻하나

TCP 관점에서 connection refused는 그 host와 port에서 연결을 받아줄 listener가 없거나, 현재 위치에서 그 listener에 도달하지 못한다는 뜻에 가깝습니다.

Redis에서는 보통 아래 같은 원인으로 좁혀집니다.

  • Redis 프로세스가 실행 중이 아님
  • Redis가 기대한 인터페이스에 listen하지 않음
  • 클라이언트가 잘못된 host나 port를 사용
  • container나 VM 네트워크가 다른 곳을 가리킴

그래서 첫 점검은 네트워크 경계 가까이에서 하는 편이 좋습니다.

Redis가 실제로 listening 중인지 확인하세요

가장 기본적인 확인은 아래입니다.

redis-cli -h 127.0.0.1 -p 6379 PING

서버 로컬에서는 되는데 애플리케이션 위치에서는 안 된다면 Redis 프로세스 자체보다 reachability, bind address, firewall 쪽 문제일 가능성이 큽니다.

bind와 protected mode를 보세요

Redis 보안 문서는 loopback에만 bind하면 로컬 클라이언트만 접근할 수 있다고 설명합니다. protected mode도 적절한 인증이나 네트워크 보호 없이 노출된 인스턴스 접근을 제한합니다.

흔한 패턴은 이렇습니다.

  1. Redis는 로컬에서 잘 된다
  2. 앱이 Docker, 다른 VM, 다른 node로 옮겨간다
  3. 같은 host와 port를 계속 쓴다
  4. Redis가 여전히 loopback에만 열려 있어 connection refused가 난다

앱이 같은 머신에서만 붙는다면 여기부터 의심해야 합니다.

환경 변수 이름보다 실제 target을 보세요

Redis incident 중 적지 않은 비율은 단순한 주소 실수입니다.

  • container 안의 localhost는 container 자신을 가리킴
  • 앱은 내부 port를 보는데 host는 다른 port를 노출함
  • connection string이 여전히 dev 인스턴스를 가리킴
  • staging이나 preview의 DNS가 local과 다름

Redis 설정을 바꾸기 전에 앱이 실제로 어떤 host와 port로 붙는지 로그로 먼저 확인하세요.

흔한 원인

1. Redis가 기대 포트에서 떠 있지 않다

앱은 6379를 보지만 서비스는 꺼져 있거나 다른 포트로 옮겨졌습니다.

2. Redis가 loopback에만 열려 있다

로컬 shell에서는 되지만 원격 앱에서는 안 됩니다.

3. container networking이 잘못됐다

앱이 service name 대신 localhost를 보고 있습니다.

4. protected mode나 주변 네트워크 정책이 막는다

의도적으로 위험한 원격 접근 패턴을 거절하는 상황일 수 있습니다.

실전 점검 순서

  1. 서버 로컬에서 PING 확인
  2. 앱이 실제로 보는 host와 port 확인
  3. 앱과 같은 네트워크 문맥에서 재현
  4. bind와 protected mode 확인
  5. container, VM, firewall, cloud network rule 확인

이 순서가 Redis 설정을 무작정 건드리는 것보다 훨씬 빨리 원인에 닿게 해줍니다.

첫 분기에 좋은 shortcut

앱에서 connection refused가 날 때는 아래처럼 먼저 갈라보세요.

  • 로컬 PING도 안 된다: Redis 프로세스나 listener부터
  • 로컬 PING는 되는데 앱만 안 된다: target host와 network context부터
  • host는 맞는데 원격 path만 실패: bind, protected mode, firewall부터
  • containerized app이 localhost를 쓴다: service discovery나 port mapping부터

이 분기만으로도 Redis 설정을 잘못된 방향으로 바꾸는 실수를 줄일 수 있습니다.

증상별 진입 힌트

  • 앱이 Redis에 아예 연결되지 못하고 connection refused를 받으면 여기서 시작하면 됩니다.
  • 연결은 되는데 command가 느리면 latency 가이드가 더 맞습니다.

바로 확인할 명령

redis-cli -h <host> -p 6379 ping
netstat -ano | findstr 6379
redis-cli INFO server

이 명령으로 Redis listener 유무, host와 port 도달 여부, 서버 기동 상태를 먼저 확인할 수 있습니다.

listener가 없는지, bind address가 잘못됐는지, 앱이 Redis가 실제 있는 host와 다른 곳을 보고 있는지 보세요.

FAQ

Q. 서버에서 redis-cli는 되는데 앱은 왜 connection refused일까요?

앱이 다른 네트워크 문맥에서 돌거나, 다른 host를 보거나, 원격 노출되지 않은 listener를 치고 있을 수 있습니다.

Q. localhost는 항상 안전한가요?

클라이언트가 같은 머신이나 같은 network namespace 안에 있을 때만 그렇습니다.

Q. protected mode를 꺼서라도 연결해야 하나요?

주변 네트워크 경계와 보안 영향을 이해하지 못했다면 권장하지 않습니다.

Sources:

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.