프론트엔드 개발/개발환경

Nginx / AWS EC2를 활용하여 React와 Node 서버 배포해보기 2탄

방구석 코딩쟁이 2024. 6. 14. 16:08

이제는 도메인 주소를 구입하고, 이 도메인 주소를 EC2 인스턴스와 연결을 시켜보도록 해보자

 

1. 도메인 주소 구입하기

Route 53 서비스로 이동해서 좌측의 "등록된 도메인"을 눌러서 이동해보면 아래와 같은 화면이 뜬다.

 

여기서 도메인 등록 버튼을 눌러서 원하는 도메인을 만들자 (돈은 일년에 $14 정도 든다고 나온다)

 

도메인을 구입하면 "진행 중" 상태가 뜨는 것을 볼 수 있다.

 

이메일 인증을 마치고 1시간 정도 기다리게 되면 상태가 성공으로 바뀌는 것을 볼 수 있다.



이제 구입한 도메인과 우리의 EC2 인스턴스를 연결할 때가 온 것이다.

2. 도메인 주소와 EC2 인스턴스와 연결

 

좌측의 "호스팅 영역"에 들어가게 되면 아래와 같은 화면이 생성된다.

 

여기서 호스팅 영역 이름을 클릭하게  되면 다음과 같은 화면이 뜨게 된다. 

 

여기서 레코드란 무엇일까?
도메인 주소와 서버의 IP 주소를 직접 매핑 시키는 방법이다. 즉, 우리가 산 도메인 주소와 EC2의 Public IP를 연결시키는 방식이다.

Cname(Canonical name) 이라는 것도 있는데,  도메인 주소를 또 다른 도메인 주소로 매핑 시키는 형태의 DNS 레코드 타입이다. 즉, 기존에 있던 도메인을 이용하여 새로운 도메인에 별칭을 부여하는 것이다.

 

 

우리는 레코드를 생성해서 EC2와 도메인 주소를 연결해야 한다. 다음과 같은 화면의 값에 우리가 구매한 EC2 IP 주소를 입력하자

 

 

연결을 하고 나면 해당 도메인으로 이동이 가능해짐을 확인할 수 있다 (아직 http만 가능함)

 

3. nginx 설정해주기

아래 명령어로 nginx 설정 파일로 이동해보자

sudo vi /etc/nginx/nginx.conf

 

여기서 `server_name` 속성을 우리가 구매한 도메인명으로 변경해주자

 

server_name 속성이 해주는 역할이 뭘까?

1. 도메인별 설정 적용
2. 가상 호스트 관리
3. 보안 및 접근 제어
4. 트래픽 분배 및 로드밸런싱
5. 도메인 기반의 요청 처리

 

 

그리고 다음 명령어를 통해 nginx를 재시작해주면 된다.

 sudo nginx -t
 sudo systemctl restart nginx
  • `sudo nginx -t`: nginx의 설정(conf) 파일을 테스트
    • 설정 파일의 문법 및 구문 오류를 체크하여 설정이 올바른지 확인
    • 이 명령어는 실제로 nginx를 재시작하거나 설정을 적용하지는 않으며 설정이 유효한지만 체크
  • `sudo systemctl restart nginx`: systemd를 사용하여 nginx 서비스를 재시작
    • 재시작 과정에서 현재 연결이 끊길 수 있으므로 서비스 중단이 최소화되도록 적절한 시기에 수행하는 것이 중요

 

4. HTTPS 연결 전에 인바운드룰을 통해 포트를 열어주기

80번 포트는 HTTP, 443번 포트는 HTTPS를 위함이다.

 

5. HTTPS를 위한 인증서 설정

도메인이 설정된 경우, HTTPS 설정이 가능한데, LetsEncrypt에서 무료로 인증서 발급이 가능하다.

 

Let's Encrypt란 무엇인가?
웹사이트에 무료 SSL/TLS 인증서를 발급해주는 인증기관(Certificate Authority; CA)
1. 무료 SSL/TLS 인증서 발급: 무료로 SSL/TLS 인증서를 제공하여 HTTPS를 쉽게 설정 가능
2. 자동화된 인증서 발급 및 갱신: 인증서 발급과 갱신과정을 Certbot같은 클라이언트 도구를 통해 자동화하여 사용자 편의성을 향상 
3. 웹 보안 향상: HTTPS 사용을 촉진하여 사용자 데이터의 암호화와 무결성을 보장
4. 간편한 설치 및 관리: Certbot과 같은 도구를 사용하면 인증서를 쉽게 설치하고 관리할 수 있음
5. 도메인 소유권 검증: 도메인 소유권을 확인하기 위해 HTTP-01, DNS-01, TLS-ALPN-01 등 검증 방식을 사용. 해당 도메인에 대한 소유권이 확인된 사용자만 인증서 발급이 가능함

Certbot
Let's Encrypt가 제공하는 SSL/TLS 인증서를 자동으로 발급하고 갱신하는 오픈소스 소프트웨어 도구. 
1. SSL/TLS 인증서 발급: Certbot 사용시 Let's Encrypt에서 SSL/TLS 인증서를 발급받을 수 있다. 이 인증서는 웹사이트와 브라우저 간 통신을 암호화하여 보안을 강화한다.
2. 인증서 갱신: Let's Encrypt 인증서는 기본적으로 90일 동안 유효하며, Certbot은 자동으로 인증서를 갱신하여 사용자가 만료된 인증서로 인한 문제를 겪지 않도록 도와준다.
3. 서버 구성 자동화: Apache, Nginx 등과 같은 웹 서버와의 통합을 지원하여 인증서를 설치하고 서버 설정을 자동으로 구성. 복잡한 수작업 없이 간편하게 HTTPS를 설정할 수 있음
4. 도메인 소유권 검증

 

SSL (Secure Sockets Layer)
클라이언트와 서버 간의 통신을 암호화하여 데이터의 기밀성을 유지. 주로 웹 브라우저와 웹 서버 간의 HTTPS 통신에 사용

TLS (Transport Layer Security)
데이터 암호화, 무결성, 인증 기능을 제공하며, SSL에 비해 보안성과 성능이 향상되었음
* 무결성: 데이터가 전송 중 변경되지 않도록 하는 것

둘 다 인터넷 통신을 보호하기 위한 암호화 프토로콜이다. 데이터를 암호화하여 전송하여 기밀성, 무결성 및 인증을 보장하며 TLS는 SSL의 후속버전이다.

 

지금 `Amazon Linux 2`를 사용하므로 다음의 명령어를 순차적으로 실행해서 이를 도와주는 프로그램을 설치했다.

sudo su -  // 루트 사용자로 전환, -옵션을 사용하면 루트 사용자의 환경 변수를 로드하게 됨
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install certbot python2-certbot-nginx
  • `yum -y install yum-utils`: yum-utils 패키지 설치
    • yum-utils는 YUM 패키지 관리자의 유틸리티 모음으로 여러 유용한 명령어와 플러그인을 제공
  • `yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional`: `yum-config-manager`를 사용하여 특정 리포지토리를 활성화
    • 여기서는 `rhui-REGION-rhel-server-extras`와 `rhui-REGION-rhel-server-optional` 레포지토리가 활성화
    • `REGION` 부분은 사용자의 실제 지역.
  • `yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm`: `EPEL`(Extra Packages for Enterprise Linux) 리포지터리를 설치
    • `EPEL`은 RHEL 및 CentOS에 추가 패키지를 제공하는 리포지터리입니다.
  • `yum install certbot python2-certbot-nginx`: `certbot`과 `python2-certbot-nginx` 패키지를 설치
    • `certbot`은 Let's Encrypt에서 SSL/TLS 인증서를 자동으로 발급하고 갱신하는 도구
    • `python2-certbot-nginx`는 Certbot과 Nginx 웹 서버를 통합하여 SSL/TLS 인증서를 쉽게 설정할 수 있게 해줌

 

만약 `AL2023`을 사용한다면 다음의 명령어를 실행해야 한다고 한다.

sudo su -
dnf install python3 augeas-libs
dnf remove certbot
python3 -m venv /opt/certbot/
/opt/certbot/bin/pip install --upgrade pip
/opt/certbot/bin/pip install certbot certbot-nginx
ln -s /opt/certbot/bin/certbot /usr/bin/certbot

 

certbot 명령으로 도메인에 해당하는 인증서를 발급받아야 한다.

certbot —nginx

 

위 명령을 실행하면 뭐가 많이 나오는데 순차적으로 확인해보자

먼저 이메일을 입력하고, 약관 동의에 대해서 물어보는 것이다. (둘 다 Y를 입력하자)

Let's Encrypt의 certbot 도구가 인증서를 발급하기 위해 몇 가지 옵션을 선택하도록 요청하는 것이다. 여기서는 기본적으로 모든 옵션을 선택하라는 안내다. (엔터를 클릭해서 넘어가자)

이러면 우리가 구매한 도메인에 대한 SSL 인증서를 요청하고, 도메인 소유권을 확인하고, /etc/nginx/nginx.conf 파일에 인증서를 배포하며, HTTP(포트 80) 트래픽을 HTTPS(포트 443)로 리다이렉트하는 설정을 한다. 

그리고, 성공적으로 인증서가 발급되고 HTTPS가 활성화되었다는 메시지가 뜬다.

즉, Let's Encrypt를 사용하여 SSL 인증서를 자동으로 발급하고 Nginx 서버에 설정하는 과정 중 하나로, 위의 과정이 완료되면 구매한 도메인은 HTTPS를 통해 안전하게 접속할 수 있게 된다.

 

이렇게 되면 우리가 구입한 도메인으로 https를 접속할 수 있게 된다! 

 

인증서 발급을 정상적으로 마치면, /etc/nginx/nginx.conf에 인증서를 연결하는 부분이 자동으로 추가되고 설정 파일을 확인하고, nginx를 재시작한다.

그러나 인증서 유효기간이 90일이므로, 우리는 매번 이를 수동으로 `certbot renew` 명령을 통해 재갱신을 해줘야 하는데, 아래의 명령어를 통해 자동으로 업데이트 스케줄을 등록해줄 수 있다. 

echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew" | sudo tee -a /etc/crontab > /dev/null
  • crontab에 새 작업을 추가하여 정해진 시간에 certbot을 사용해 SSL 인증서를 갱신하는 작업을 함
    1. `echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew"`
      • crontab에 주가할 작업 내용을 출력함
      • `0, 0, 12 * * * `: 매일 0시와 12시를 의미
      • `root`: 작업을 루트 사용자로 실행
      • `python -c 'import random; import time; time.sleep(random.random() * 3600)': 파이썬 명령어를 통해 실행 시간을 무작위로 지연 (서버에서 동시에 여러 인증서 갱신 요청이 발생하는 것을 방지하기 위함)
      • ` && certbot renew`: 대기 시간 후에 `certbot renew` 명령어를 실행하여 SSL 인증서를 갱신
    2. `| sudo tee -a /etc/crontab > /dev/null`
      • `|`기호를 사용하여 `echo` 명령어의 출력을 `sudo tee -a /etc/crontab`으로 전달
      • `sudo tee -a /etc/crontab`: `sudo` 권한으로 `/etc/crontab` 파일에 출력내용을 추가 (-a: 파일 뒤에 추가)
      • `> /dev/null`: 명령어 실행 결과를 화면에 출력하지 않도록

 

명령이 제대로 등록했는지 확인해보자

cat /etc/crontab //확인해보기

 

다음과 같은 화면이 나온다면 정상적으로 접속이 된다!