개발일지/TIL(Today I Learned)

2024-12-20 <트러블 슈팅>

프린스 알리 2024. 12. 20.

트러블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

댓글