트러블1) EC2 서버에서 Redis가 구동되지 않아요!
코드의 로직과 관련된 트러블은 아니었으나, EC2로 IP를 배포하고 Redis를 연동하는 과정에서 수많은 난관이 있었다. 아무리 시도해봐도 갱신되지 않는 데이터들. 분명 로컬에서는 아무 문제 없었는데 왜인지 알 수 없어 고민스러웠다. 그래서 구글링과 AI를 이용해 그 답을 찾아냈다.
우선, Ubuntu 환경으로 가정하고 설명을 진행하겠다. Redis가 설치되어 있지 않다면 설치부터 진행하자.
1. Redis 설치
sudo apt update
sudo apt install redis-server
다음과 같은 명령어로 Redis 설치 후 Redis 서버가 실행 중인지 확인할 수 있다.
sudo systemctl status redis
2. Redis 설정 파일 찾기
Redis 설정 파일은 보통 /etc/redis/redis.conf
경로에 있다. 이 파일을 수정해야 한다.
설정 파일을 편집하려면 관리자 모드(sudo)에서 nano 명령어를 이용하자.
sudo nano /etc/redis/redis.conf
그럼 이런 화면이 우릴 반겨줄 것이다.(화살표를 이용해 밑으로 이동할 수 있다.)
3. redis.conf 파일 수정
redis.conf
파일에서 다음 설정을 변경하자.
(1) bind
설정 변경
- 기본적으로 Redis는
127.0.0.1
(로컬)에서만 접속을 허용한다. 외부에서 접속할 수 있도록 다음과 같이 수정하자.bind 0.0.0.0
(2) protected-mode
설정 변경
- Redis는
protected-mode
가 활성화된 상태에서는 외부 접근이 차단된다. 이 설정을 비활성화해야 한다.protected-mode no
(3) 비밀번호 설정 (선택 사항)
- 보안을 위해 Redis 접속 시 비밀번호를 설정하려면 다음과 같이 설정하면 된다.
requirepass <your_password>
예:
requirepass my_secure_password
수정이 끝났으면 Ctrl + O
→ Enter → Ctrl + X
를 눌러 저장하고 편집기를 닫을 수 있다.
4. Redis 서버 재시작
설정을 적용하려면 Redis 서버를 재시작해야 한다.
sudo systemctl restart redis
5. 보안 그룹 설정
EC2 보안 그룹에서 Redis 포트(기본: 6379)가 열려 있는지 확인하자.
6. Redis 연결 테스트
클라이언트에서 Redis에 접속을 테스트
redis-cli -h <EC2_PUBLIC_IP> -p 6379 -a <your_password>
정상적으로 접속되면 Redis 명령어를 사용할 수 있다.
PING
응답:
PONG
트러블2) Error: listen EADDRINUSE: address already in use :::3000 오류
산 넘어 산이라고 했던가. 분명 Redis는 잘 작동하는데 이번엔 코드가 실행되는 도중에 연달아 에러가 발생했다.
에러 메시지를 읽고 처음 의심한 건 서버와 클라이언트가 다른 시간대에 속해있는지 여부였다. 하지만 확인해본 결과, Date.now()와 EC2 서버는 모두 UTC를 Asia/Seoul 시간대를 사용 중이었다. 그러다 힌트를 얻게 된 건 pm2 list를 확인했을 때였다.
서버를 열고 10초 정도 지났을 때, 우연찮게도 status가 errored로 변경되는 모습을 목격하게 되었다. 그렇다는 건 문제가 시간대가 아닌 네트워크에 있을 가능성이 높다는 것. 그러다 문득, 이전에 3306 포트를 이용하다가 로컬에 깔려있던 MySQL 포트 번호와 충돌했던 기억이 났다. 그 기억을 되살려서 혹시 3000번 포트를 다른 프로그램이 사용 중인지 살펴보았다.
그러자 node\x20이라는 프로그램이 이미 3000번 포트를 사용 중이란 걸 발견할 수 있었다. 구글링을 해보았더니 해결법은 크게 두 가지였는데, 하나는 해당 프로그램을 강제로 종료시키는 것이었고 다른 하나는 내가 열려는 서버의 포트를 바꾸는 것이었다. node\x20에 대한 정보가 부족하기도 했고, 아무리 종료시켜도 계속 재실행되는 걸 확인했기에 결국 서버의 포트를 바꾸는 식으로 진행하게 되었다.
참고로 강제 종료하는 방법에 대해서도 소개하겠다. lsof -i :3000 명령어로 확인한 PID를 다음과 같은 명령어를 통해 중지시키는 게 가능하다.
kill -9 <PID>
(참고) 윈도우 기준:
taskkill /F /PID <PID 번호>
위 방법은 로컬에서 포트 번호가 충돌했을 때도 가능하기에 유용하게 써먹었던 기억이 있다.(그러나 충돌이 날 때마다 매번 강제 종료로 해결하는 건 너무 위험한 것 같아서 MySQL의 포트 번호를 변경하는 것으로 타협을 봤다.)
'개발일지 > TIL(Today I Learned)' 카테고리의 다른 글
2024-12-23 <복잡한 IOCP 쉽게 이해하기> (4) | 2024.12.23 |
---|---|
2024-12-22 <전송 계층> (1) | 2024.12.22 |
2024-12-19 (3) | 2024.12.19 |
2024-12-18 (4) | 2024.12.18 |
2024-12-17 (0) | 2024.12.17 |
댓글