티스토리 뷰

 

 

Nginx를 사용하여 단일 인스턴스에서 여러 도메인에 로드밸런싱과 HTTPS 연결하여 안전하게 운영하는 법에 대해 알아보겠습니다.

 

 

1. 도메인 구입하기


가비아 사이트에서 1년 할인 받아서 15,000원에 구입하였습니다.

 

2. AWS route 연결


AWS route에서 호스팅을 생성합니다. 호스팅 이름은 도메인을 맞춰서 진행하였습니다. 

아래 사진을 보면 총 레코드가 5개인데 그 중 2개는 기존에 만들어져 있었고 3개 레코드를 생성합니다.

  1. 이름 : seolyu.com            유형 : A              값 : 퍼블릭 IPv4 주소
  2. 이름 : api.seolyu.com      유형 : A              값 : 퍼블릭 IPv4 주소
  3. 이름 : www.seolyu.com   유형 : CNAME   값 : 퍼블릭 IPv4 주소

 

이제 가비아 도메인의 네임 서버에 연결을 해야합니다. 네임 서버는 IP 주소와 도메인 주소를 연결해주는 역할을 합니다.
5개 레코드 중에서 유형이 NS인 레코드에서 "값/트래픽 라우팅 대상" 항목을 보면 4개의 값이 있습니다.
4개의 값을 복사합니다. 가비아의 해당 도메인의 관리 콘솔에서 네임 서버에 복사한 값을 추가합니다.
4개의 모두 다 값의 마지막에 점(.) 들어가 있는데 점은 빼고 넣으시면 됩니다. 

 

 

개발환경 : ubuntu 24, nginx 1.24.0

3. NGINX 설치 및 연결


운영 서버에 접속하여 Nginx 설치합니다.

sudo apt update
sudo apt install nginx

 

Nginx 설치했으니 설정 파일을 편집하여 도메인 seolyu.com과 api.seolyu.com를 로드밸런싱을 설정합니다.

sudo vi /etc/nginx/sites-available/seolyu.com

 

Nginx 설정 파일 내용은 다음과 같습니다.

# 첫 번째 도메인 solyu.com 연결
server {
    listen 80;
    server_name solyu.com;

    location / {
        proxy_pass http://localhost:3000; 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# 두 번째 도메인 api.solyu.com 연결
server {
    listen 80;
    server_name api.solyu.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

위 설정에서

  • listen 80은 HTTP 트래픽을 처리할 포트를 지정합니다.
  • server_name seolyu.com api.seolyu.com은 도메인을 지정합니다.
  • location은 지정한 도메인으로 들어오는 트래픽을 proxy_pass로 전달합니다.

 

설정을 완료한 후, 해당 설정 파일을 활성화합니다.

sudo ln -s /etc/nginx/sites-available/seolyu.com /etc/nginx/sites-enabled/ # 링크 복사
sudo nginx -t # 설정 테스트 
sudo systemctl restart nginx  # nginx 재시작

 

참고로 위 설정한 /etc/nginx/sites-enabled 경로는 /etc/nginx/nginx.conf 파일과 연결되어 있습니다.

nginx.conf

include로 /etc/nginx/sites-enabled 연결되어 있는 걸 확인할 수 있습니다.

 

 

4. HTTPS 설치 및 연결


HTTPS는 Let's Encrypt를 통해 무료 SSL 인증서를 발급받습니다. certbot을 사용하여 인증서를 설치할 수 있습니다.

sudo apt install certbot python3-certbot-nginx

 

이제 SSL 인증서를 발급받고 Nginx 설정을 수정해야 합니다.
아래 명령어를 실행하면 SSL 인증서가 발급되고, Nginx 설정이 자동으로 HTTPS를 처리하도록 수정됩니다.

sudo certbot --nginx -d seolyu.com -d api.seolyu.com

만약 seolyu.com, api.seolyu.com 도메인 응답이 없으면 발급받을 수 없으니, 서버와 도메인 연결이 되어있는 상태에서 발급받아야 합니다.

 

실제로 위에서 Nginx 설정한 파일을 다시 가보니, 자동으로 HTTPS 처리 되어있었습니다. (놀라웠습니다,,,)

cat /etc/nginx/sites-available/seolyu.com

seolyu.com 코드

server {
    server_name seolyu.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/seolyu.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/seolyu.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    server_name api.seolyu.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/seolyu.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/seolyu.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}


server {
    if ($host = seolyu.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name seolyu.com;
    return 404; # managed by Certbot
}

server {
    if ($host = api.seolyu.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name api.seolyu.com;
    return 404; # managed by Certbot
}

 

Https 연결하기 위해서 Nginx 설정 파일이 변경되어서 재시작 해야합니다.

sudo nginx -t
sudo systemctl restart nginx

 

 

5. 방화벽 설정


마지막으로, AWS 보안 그룹에서 80과 443 포트를 열어 웹 트래픽을 허용해야 합니다. AWS 관리 콘솔에서 EC2 인스턴스에 연결된 보안 그룹의 인바운드 규칙을 업데이트합니다.

  • HTTP(80) - 0.0.0.0/0
  • HTTPS(443) - 0.0.0.0/0