Cloud/AWS

[AWS] EC2 포트포워딩, nohub 적용하기

쉬지마 이굥진 2024. 8. 4. 05:59

<이전 글>

 

[Spring/AWS] EC2, RDS를 이용해 배포하기 2 - EC2 서버 구매 및 배포 편

[Spring/AWS] EC2, RDS를 이용해 배포하기 1 - RDS 설정 및 인텔리제이와 연결 편* 사전에 (윈도우의 경우)Git Bash 설치 및 AWS 회원가입이 선행됐다고 가정 후 쓰는 글입니다!환경Windows, Git Bash, Spring Boot 3.1

developer-jinnie.tistory.com


이전 글에서는 EC2를 이용해서 서버를 구매 후 배포하는 방법을 공유했다. 이번 글에서는 배포 후 URL의 뒤에 매번 딸려오는 포트 번호를 없애서 URL을 더 간단히 만드는 포트포워딩과, SSH 접속을 끊어도 서버가 계속 돌게 하는 nohub을 적용시켜보는 포스팅을 작성해보려고 한다. 

 

0. 포트포워딩(port forwarding)이란?

http://내 public 아이피:8080
현재 상태는 8080 포트에서 웹 서비스가 실행되고 있는 상태이다.
그래서 매번 위와 같이 ~:8080 이라고 URL 뒤에 명시해줘야 한다. 뒤에 붙는 포트 번호는 어떻게 없앨 수 있을까?

 

👉  HTTP 요청에서는 80포트가 기본이기 때문에, 굳이 :80을 붙이지 않아도 자동으로 연결된다.

👉 포트 번호를 입력하지 않아도 자동으로 접속되기 위해, 우리는 80포트로 오는 요청을 8080 포트로 전달하게 하는 포트포워딩을 사용해보겠다.

 

1. 포트포워딩 적용하기

1-1. 일단 먼저 돌아가고 있는 서비스는 끄고 다시 새 설정을 적용하자.

현재 실행 중인 프로세스 중단 명령 :

ctrl + c

 

1-2. '포트포워딩 룰' 입력

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

 

  • iptables:
    • Linux 시스템에서 패킷 필터링과 NAT를 설정하는 유틸리티
  • -t nat:
    • iptables는 다양한 테이블을 사용하여 패킷을 처리한다.
    • -t nat는 NAT(Network Address Translation) 테이블을 지정한다. NAT 테이블은 패킷의 주소 변환을 관리한다.
  • -A PREROUTING:
    • -A는 규칙을 추가하는 옵션.
    • PREROUTING은 패킷이 라우팅 결정 전에 규칙이 적용되는 체인이다. 이 체인에서는 패킷의 목적지 주소를 수정하거나 패킷을 리디렉션할 수 있다.
  • -i eth0:
    • -i는 패킷이 들어오는 인터페이스를 지정한다.
    • eth0은 네트워크 인터페이스의 이름이다. 이 경우, eth0 인터페이스를 통해 들어오는 패킷을 대상으로 한다.
  • -p tcp:
    • -p는 프로토콜을 지정한다. (여기서는 TCP 프로토콜을 의미)
    • 이 규칙은 TCP 프로토콜을 사용하는 패킷에 적용된다.
  • --dport 80:
    • --dport는 목적지 포트를 지정한다. (여기서는 80번 포트를 의미)
    • 즉, 이 규칙은 목적지 포트가 80인 패킷에 적용된다.
  • -j REDIRECT:
    • -j는 패킷을 어떻게 처리할지를 지정하며, 이 명령어는 즉 패킷을 '리디렉션' 함을 의미한다.
  • --to-port 8080:
    • --to-port는 리디렉션할 목적지 포트를 지정한다. 즉, 여기서는 8080번 포트로 리디렉션하라는 뜻.
▪️정리
이 명령어는eth0 네트워크 인터페이스를 통해 들어오는 TCP 패킷의 목적지 포트가 80번인 경우, 해당 패킷을 포트 8080으로 리디렉션하도록 설정한다. 즉, 외부에서 HTTP 요청을 포트 80으로 보내면, 이 요청이 포트 8080으로 전달된다. 주로 웹 서버가 포트 8080에서 실행되고 있을 때, 포트 80으로 들어오는 요청을 포트 8080으로 전달하여 외부 사용자가 포트 80으로 접근할 수 있도록 하는 데 사용된다.

 

1-3. 다시 서비스 시작

java -jar JAR파일명.jar

 

1-4. 포트번호 떼고 접속해보기

http://내AWS아이피/

 

여기까지 잘 접속됐다면 포트포워딩 성공. 🎇

 

2. nohub 적용 (= SSH 접속을 끊어도 서버가 계속 돌게 하기)

▪️nohup
"no hang up"의 약자로, 사용자가 로그아웃하거나 터미널 세션이 종료되더라도 명령어가 계속 실행되도록 한다. 기본적으로
nohup으로 실행된 명령어의 출력은 nohup.out 파일로 리디렉션된다.
▪️현재 상황 및 해결책
Git bash 또는 맥의 터미널을 종료하면 (=즉, SSH 접속을 끊으면) 프로세스가 종료되면서, 서버가 돌아가지 않고 있을 것이다. 그러나! 우리가 원격접속을 끊어도 서버는 계속 동작해야한다.
👉 그렇게 하기 위해선 백그라운드에서 java 애플리케이션이 실행되게 하면 된다.

 

2-1. 명령어 입력

nohup java -jar JAR파일명.jar &

 

명령어를 백그라운드에서 실행하도록 하는 '&' 를 덧붙여 명령어를 실행해주자.

 

2-2. 서버 강제종료 하기

서버를 강제종료 시킨 후, 다시 켜 줘야 한다.

# 아래 명령어로 미리 pid 값(프로세스 번호)을 본다
ps -ef | grep java

# 아래 명령어로 특정 프로세스를 죽인다
kill -9 [pid값]

 

2-3. 서버 다시 켜기 (백그라운드에서)

nohup java -jar JAR파일명.jar &

 

2-4. git bash를 끄고, 접속했을 때 잘 접속되면 성공!!

http://내AWS아이피/

 


마치며

이렇게 AWS EC2와 RDS를 이용해서 배포를 마친 후 포트포워딩과 nohub 까지 진행해봤다. 하다가 잔잔바리(?) 에러가 git bash 명령어 쪽에서 조금 나서 약간 애먹긴 했지만 그렇게 어렵지는 않았고, 이번 기회로 웹사이트 배포를 경험해봐서 너무 기쁘다! 다음 프로젝트 때는 Docker 등을 이용해서 CI/CD 까지 경험해보고 싶다.

깃허브에 스택 추가! 뿌 ㅡㅡㅡ듯