Nginx로 서브도메인을 EC2의 특정 포트 어플리케이션으로 연결하기

조예진·2021년 10월 25일
0
post-thumbnail

이 포스트에서는 어떤 도메인의 서브도메인에 접속했을 때 서버의 특정 포트에 실행되고 있는 어플리케이션으로 연결하는 방법에 대하여 정리합니다. 개인 프로젝트 중 문제를 해결한 방법을 기록하기 위하여 작성하였으며, 부정확한 부분은 댓글로 알려주시면 수정하겠습니다.

상황 설명

현재 EC2 포트 상황

  • 8080: 메인 웹 서비스
  • 8000: API 서버
  • 8082: 어드민 웹 서비스

하고 싶은 것

  • www.domain.com -> 메인 웹 서비스(8080)로 연결
  • api.domain.com -> API 서버(8000)로 연결
  • admin.domain.com -> 어드민 웹 서비스(8082)로 연결
  • 모든 서비스는 https 연결되어야 함

전체적인 흐름

  1. 사용자가 도메인 이름을 입력합니다.
  2. Route53이 [www/api/admin].domain.com에 해당하는 도메인을 받으면, 로드밸런서로 라우팅합니다.
  3. 로드밸런서는 80번 포트로 들어온 요청(http)은 443번 포트(https)로 Redirect 시킵니다.
  4. 로드밸런서는 443번 포트로 들어온 요청은 타겟 EC2 인스턴스의 80번 포트로 전달합니다.
    • 이 때, 로드밸런서에서 443번 포트의 리스너는 HTTPS 리스너이며 SSL 보안 정책이 적용되어 있습니다.
  5. 타겟 인스턴스에는 Nginx가 실행되고 있습니다. Nginx는 다음과 같이 Proxy Pass를 진행합니다.

아래의 구체적인 설정 방법에서는 아래의 설정이 이미 되어 있음을 전제로 합니다.

  • 인스턴스 생성 및 각 포트에서 어플리케이션 실행
  • ELB 생성 (예시에서는 Application Load Balancer 사용함)
  • 호스팅 중인 도메인을 Route53에 등록
  • nginx 설치

1. Route53에 서브도메인 추가하기

AWS 콘솔의 Route53 관리 페이지에서, 호스팅 중인 도메인을 선택하고 새 레코드를 생성합니다.

  1. 레코드 이름에 서브도메인 이름을 입력합니다.
  2. 레코드 유형을 A - IPv4…를 선택합니다.
  3. 트래픽 라우팅 대상의 별칭 스위치를 켜고, Application/Classic Load Balancer와 Region을 선택한 다음 사용할 로드밸런서를 선택합니다.

2. 로드밸런서 설정하기

AWS 콘솔의 EC2 페이지에서 로드밸런서 메뉴로 들어간 후, 로드밸런서 선택하고 하단 메뉴에서 리스너를 선택합니다.

  1. 80번 포트에 HTTP 리스너를 추가합니다. 규칙은 443번 포트로 리디렉션되도록 합니다.
  2. 443번 포트에 HTTPS 리스너를 추가합니다. 호스팅 중인 도메인의 SSL 인증서를 추가합니다.
  3. 타겟 그룹을 생성합니다. 타겟 그룹 관리에서 Register Instance 버튼을 누르고 어플리케이션이 실행되고 있는 인스턴스를 선택한 후 Ports for the selected instances에 80을 설정합니다. Include as pending below 버튼을 눌러야 합니다.

3. Nginx 설정하기

  1. 서버 속성 파일을 엽니다.

    • sudo vi /etc/nginx/conf.d/default.conf
  2. 기본으로 있는 설정 아래에 도메인별 서버 설정을 추가합니다.

// 위에 localhost 관련 기본 설정...

server {
    listen 80;
    listen [::]:80;
    server_name api.domain.com;
    location / {
        proxy_pass http://localhost:8000;
    }
}
server {
    listen 80;
    listne [::]:80;
    server_name admin.domain.com;
    location / {
        proxy_pass http://localhost:8082;
    }
}

// 아래에 www.domain.com 설정...

Nginx를 실행합니다.
sudo systemctl start nginx

  • 혹시 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 에러가 발생한다면
    sudo systemctl restart nginx
profile
https://oooooroblog.com 으로 이사갔어요

0개의 댓글