개발 과정에서 Redis를 사용하다 보면 누구나 한 번쯤은 마주치게 되는 “Could not connect to Redis at 127.0.0.1:6379: Connection refused” 에러. 이 에러가 발생하면 웹 애플리케이션의 성능이 급격히 저하되거나 아예 동작하지 않는 상황이 발생할 수 있습니다.
특히 캐싱, 세션 관리, 실시간 분석 등 중요한 기능에 Redis를 활용하는 현대 웹 애플리케이션에서는 이런 연결 문제가 치명적일 수 있죠. 다행히 이 문제는 원인을 정확히 파악하고 체계적으로 접근하면 충분히 해결할 수 있습니다.
이번 포스트에서 Redis 연결 거부 에러가 발생하는 다양한 원인들을 살펴보고, 각각에 대한 확실한 해결방법을 단계별로 제시해드리겠습니다.
1. Redis ‘Connection refused’ 에러란?
Redis 연결 거부 에러는 클라이언트 애플리케이션이 Redis 서버에 연결을 시도했지만, 서버가 해당 연결을 거부할 때 발생합니다. 이 에러는 네트워크 문제, 설정 오류, 또는 서버 문제 등 여러 가지 이유로 발생할 수 있습니다.
가장 일반적으로 나타나는 에러 메시지들은 다음과 같습니다:
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
Error establishing a Redis connection
이런 에러가 발생하면 Redis에 의존하는 애플리케이션의 캐싱, 세션 관리, 메시지 큐 등의 기능이 모두 중단되어 심각한 서비스 장애로 이어질 수 있습니다.
2. 주요 원인은?
Redis 서버 미실행
가장 일반적인 원인은 Redis 서버가 실행되지 않는 것입니다. 서버 재부팅, 크래시, 또는 수동으로 서비스를 중지한 경우에 발생합니다.
방화벽 및 포트 차단
방화벽 제한은 Redis 연결 거부를 일으키는 또 다른 일반적인 원인입니다. 기본적으로 Redis 서버는 TCP 포트 6379에서 수신 대기합니다. 다른 애플리케이션이 이 포트를 사용하거나 방화벽에서 차단하면 연결이 거부됩니다.
설정 파일 문제
Redis 3.2.0 버전부터는 기본 설정으로 실행될 때 ‘protected mode’라는 특별한 모드로 진입합니다. 이 모드에서는 Redis가 루프백 인터페이스의 쿼리에만 응답하고, 다른 주소에서 연결하는 클라이언트에게는 에러를 반환합니다.
네트워크 및 DNS 문제
잘못된 네트워크 설정이나 DNS 문제로 인해 애플리케이션이 Redis 서버에 도달하지 못할 수 있습니다.
시스템 리소스 부족
Redis는 메인 메모리를 사용하여 데이터를 저장합니다. 서버의 리소스가 프로세스 실행에 충분하지 않으면 갑작스럽게 종료될 수 있습니다.
3. 빠른 원인 진단 방법
문제 해결에 앞서 현재 상황을 정확히 파악해야 합니다. 다음 명령어들로 Redis 상태를 확인해보세요.
Redis 서버 상태 확인
# Redis 서비스 상태 확인 (Ubuntu/Debian)
sudo systemctl status redis-server
# CentOS/RHEL
sudo systemctl status redis
# Redis 프로세스 확인
ps aux | grep redis
연결 테스트
# Redis CLI로 연결 테스트
redis-cli ping
# 특정 호스트/포트로 연결 테스트
redis-cli -h 127.0.0.1 -p 6379 ping
# Telnet으로 포트 연결 확인
telnet 127.0.0.1 6379
포트 사용 상태 확인
# 6379 포트 사용 상태 확인
netstat -tulpn | grep 6379
lsof -i :6379
4. 운영체제별 해결 방법
Ubuntu/Debian 계열
Redis 설치 및 서비스 시작:
# Redis 설치
sudo apt update
sudo apt install redis-server
# 서비스 시작 및 자동 시작 설정
sudo systemctl start redis-server
sudo systemctl enable redis-server
# 설정 파일 위치
sudo nano /etc/redis/redis.conf
방화벽 설정:
# UFW 방화벽에서 Redis 포트 허용
sudo ufw allow 6379
# 방화벽 상태 확인
sudo ufw status
CentOS/RHEL 계열
Redis 설치 및 서비스 시작:
# EPEL 저장소 활성화
sudo yum install epel-release
# Redis 설치
sudo yum install redis
# 서비스 시작 및 자동 시작 설정
sudo systemctl start redis
sudo systemctl enable redis
# 설정 파일 위치
sudo nano /etc/redis.conf
방화벽 설정:
# firewalld에서 Redis 포트 허용
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload
macOS (Homebrew)
macOS에서 Homebrew를 사용하는 경우 다음과 같이 해결할 수 있습니다:
# Redis 설치
brew install redis
# Redis 서비스 시작
brew services start redis
# 수동으로 시작 (데몬 모드)
redis-server --daemonize yes
# 연결 테스트
redis-cli ping
Windows
# Windows에서 Redis 다운로드 후 실행
redis-server.exe
# 다른 터미널에서 연결 테스트
redis-cli.exe ping
5. 설정 파일 수정을 통한 처리방법
Protected Mode 비활성화
Redis 설정 파일에서 protected mode를 비활성화하려면 다음과 같이 설정합니다:
# redis.conf 파일 편집
sudo nano /etc/redis/redis.conf
# 다음 라인을 찾아 수정
protected-mode no
# 서비스 재시작
sudo systemctl restart redis-server
Bind 설정 수정
# 모든 인터페이스에서 연결 허용
bind 0.0.0.0
# 또는 특정 IP만 허용
bind 127.0.0.1 192.168.1.100
# 주석 처리하여 모든 연결 허용 (보안 주의)
# bind 127.0.0.1
포트 변경
# 기본 포트 6379를 다른 포트로 변경
port 6380
# 서비스 재시작 후 새 포트로 연결 테스트
redis-cli -p 6380 ping
6. Docker 환경에서의 해결방법
Docker 환경에서는 네트워크 설정이 특히 중요합니다. 다음과 같은 방법으로 해결할 수 있습니다:
Docker Compose 설정
version: '3.8'
services:
redis:
image: redis:7-alpine
ports:
- "6379:6379"
command: redis-server --appendonly yes --protected-mode no
volumes:
- redis-data:/data
app:
build: .
depends_on:
- redis
environment:
- REDIS_URL=redis://redis:6379
volumes:
redis-data:
네트워크 설정
# Docker 네트워크 생성
docker network create redis-network
# Redis 컨테이너 실행
docker run -d --name redis --network redis-network redis:7-alpine
# 애플리케이션에서 연결할 때
# 호스트명을 컨테이너 이름(redis)으로 사용
7. 그래도 안된다면, 추가적인 해결 방법!
로그 파일 분석
# Redis 로그 확인
sudo tail -f /var/log/redis/redis-server.log
# 시스템 로그에서 Redis 관련 정보 확인
sudo journalctl -u redis-server -f
메모리 및 리소스 확인
시스템 리소스 문제는 Redis 연결 거부의 원인이 될 수 있습니다:
# 메모리 사용량 확인
free -h
# CPU 및 프로세스 상태 확인
top
htop
# Redis 메모리 사용량 확인
redis-cli info memory
최대 클라이언트 수 조정
# 현재 연결된 클라이언트 수 확인
redis-cli client list
# 최대 클라이언트 수 설정 (redis.conf)
maxclients 10000
# 런타임에 설정 변경
redis-cli config set maxclients 10000
8. 관련하여 보안성을 강화하는 방법
인증 설정
# redis.conf에서 비밀번호 설정
requirepass yourpassword
# 클라이언트에서 인증
redis-cli -a yourpassword ping
# 애플리케이션 연결 문자열
redis://username:password@localhost:6379
네트워크 보안
네트워크 레이어에서 Redis를 보안을 강화하는 방법입니다:
# iptables로 특정 IP만 허용
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP
# 기본 포트 변경으로 보안 강화
port 16379
9. 자주 범하는 실수와 그 해결책
환경별 연결 문자열 실수
환경 | 올바른 연결 문자열 | 잘못된 예시 |
---|---|---|
로컬 개발 | redis://127.0.0.1:6379 |
redis://localhost:6380 |
Docker | redis://redis-container:6379 |
redis://localhost:6379 |
원격 서버 | redis://192.168.1.100:6379 |
redis://127.0.0.1:6379 |
권한 문제 해결
# Redis 사용자 권한 확인
sudo chown redis:redis /var/lib/redis
sudo chown redis:redis /var/log/redis
# Redis 프로세스 권한으로 실행
sudo -u redis redis-server /etc/redis/redis.conf
Redis 연결 거부 에러는 처음에는 복잡해 보일 수 있지만, 체계적인 접근으로 충분히 해결할 수 있습니다. 중요한 것은 당황하지 말고 단계별로 원인을 찾아가는 것입니다.
문제가 발생했을 때는 먼저 Redis 서버 상태를 확인하고, 네트워크 연결을 테스트한 다음, 설정 파일을 점검하는 순서로 접근하시기 바랍니다. 또한 정기적인 모니터링과 적절한 보안 설정으로 문제를 미리 예방하는 것이 가장 좋은 방법입니다. 이 가이드가 Redis 연결 문제로 고생하시는 모든 개발자분들에게 도움이 되기를 바랍니다. 🙂