이 포스트에서는 어떤 도메인의 서브도메인에 접속했을 때 서버의 특정 포트에 실행되고 있는 어플리케이션으로 연결하는 방법에 대하여 정리합니다. 개인 프로젝트 중 문제를 해결한 방법을 기록하기 위하여 작성하였으며, 부정확한 부분은 댓글로 알려주시면 수정하겠습니다.
상황 설명
현재 EC2 포트 상황
- 8080: 메인 웹 서비스
- 8000: API 서버
- 8082: 어드민 웹 서비스
하고 싶은 것
- www.domain.com -> 메인 웹 서비스(8080)로 연결
- api.domain.com -> API 서버(8000)로 연결
- admin.domain.com -> 어드민 웹 서비스(8082)로 연결
- 모든 서비스는 https 연결되어야 함
전체적인 흐름
- 사용자가 도메인 이름을 입력합니다.
- Route53이 [www/api/admin].domain.com에 해당하는 도메인을 받으면, 로드밸런서로 라우팅합니다.
- 로드밸런서는 80번 포트로 들어온 요청(http)은 443번 포트(https)로 Redirect 시킵니다.
- 로드밸런서는 443번 포트로 들어온 요청은 타겟 EC2 인스턴스의 80번 포트로 전달합니다.
- 이 때, 로드밸런서에서 443번 포트의 리스너는 HTTPS 리스너이며 SSL 보안 정책이 적용되어 있습니다.
- 타겟 인스턴스에는 Nginx가 실행되고 있습니다. Nginx는 다음과 같이 Proxy Pass를 진행합니다.
아래의 구체적인 설정 방법에서는 아래의 설정이 이미 되어 있음을 전제로 합니다.
- 인스턴스 생성 및 각 포트에서 어플리케이션 실행
- ELB 생성 (예시에서는 Application Load Balancer 사용함)
- 호스팅 중인 도메인을 Route53에 등록
- nginx 설치
1. Route53에 서브도메인 추가하기
AWS 콘솔의 Route53 관리 페이지에서, 호스팅 중인 도메인을 선택하고 새 레코드를 생성합니다.
- 레코드 이름에 서브도메인 이름을 입력합니다.
- 레코드 유형을 A - IPv4…를 선택합니다.
- 트래픽 라우팅 대상의 별칭 스위치를 켜고, Application/Classic Load Balancer와 Region을 선택한 다음 사용할 로드밸런서를 선택합니다.
2. 로드밸런서 설정하기
AWS 콘솔의 EC2 페이지에서 로드밸런서 메뉴로 들어간 후, 로드밸런서 선택하고 하단 메뉴에서 리스너를 선택합니다.
- 80번 포트에 HTTP 리스너를 추가합니다. 규칙은 443번 포트로 리디렉션되도록 합니다.
- 443번 포트에 HTTPS 리스너를 추가합니다. 호스팅 중인 도메인의 SSL 인증서를 추가합니다.
- 타겟 그룹을 생성합니다. 타겟 그룹 관리에서 Register Instance 버튼을 누르고 어플리케이션이 실행되고 있는 인스턴스를 선택한 후 Ports for the selected instances에 80을 설정합니다. Include as pending below 버튼을 눌러야 합니다.
3. Nginx 설정하기
-
서버 속성 파일을 엽니다.
- sudo vi /etc/nginx/conf.d/default.conf
-
기본으로 있는 설정 아래에 도메인별 서버 설정을 추가합니다.
// 위에 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