본문 바로가기

Infra

[WEB] EC2 환경에 Nginx 설치 및 배포를 위한 준비 (LetsEncrypt 인증서 발급과 SSL 적용)

AWS EC2 환경에서 Nginx를 통해 요청/응답이 가능한 웹 서비스를 배포하려 한다. 서비스를 배포시에 데이터를 보호하기 위해 https로 이루어져야 하는데 이때 SSL 인증서가 필요하다. 해당 과정에 대해서 진행한 내역을 기술하였다.

 

< 배포환경 >

AWS EC2 Ubuntu 20.04

 

엔진엑스 Nginx

Certbot이란?

https 웹 서비스를 제공하기 위해서는 SSL 인증서를 발급받아 적용해야한다. HTTPS 확산의 일환으로 Let's Encrypt SSL 인증서를 무료로 제공하는 certbot 라이브러리가 존재한다.

◾ SSL/TLS는 응용계층과 전송계층 사이에서 보안 채널을 형성해주는 역할하는 보안용 프로토콜이다. 사용자들의 민감 정보를 통신시에 매번 암호화하는 것이 번거롭기에 주로 SSL/TLS를 사용한다.

 

Nginx 설치

# 운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보(리스트) 업데이트 
$ sudo apt-get update

# nginx 설치하기
$ sudo apt install nginx -y

# 설치한 nginx 버전 확인
$ nginx -v

# nginx running 상태 확인
$ sudo service nginx status

# nginx 실행
$ sudo service nginx start

실행 중인 nginx 상태 확인

 

< Let's Encrypt  SSL 인증서 발급 방법 >

  • Standalone
    • 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식
    • 80 포트로 가상 standalone 웹서버를 띄워 인증서를 발급
    • 장점 : 동시에 여러 도메인을 발급받을 수 있음
    • 단점 : 발급 전에 Nginx를 중단하고 발급 완료 후 다시 Nginx를 시작해야 함

Let's Encrypt 의 인증 방식인 Standalone plugin 은 서버 인증을 위해서 80 포트를 이용한다. 따라서 nginx, apache 와 같이 80 포트를 이용하는 서비스가 있다면 서버를 일시적으로 정지시켜줘야 한다. 정지하지 않으면 오류가 발생한다.

# nginx 서버 정지
$ sudo service nginx stop

# nginx 서버 정지 확인
$ netstat -na | grep '80.*LISTEN'

추가적으로 ssl 인증서 발급 중 에러가 발생했었는데, 방화벽이 활성화 되어 있어서 80 port를 open해준 후에는 정상적으로 ssl 인증서가 발급되었다.

# 방화벽 포트 설정
$ ufw allow 80

# Let's Encrypt 설치
$ sudo apt-get install letsencrypt

# 인증서 적용 및 .pem 키 발급
$ sudo letsencrypt certonly --standalone -d [도메인]

# 설치한 인증서 확인 및 위치 확인
$ sudo certbot certificates

# LetsEncrypt 인증서 삭제
$ certbot delete

 

Nginx 설정 파일 작성

< Nginx의 기본 폴더, 파일 >

📝 /ets/nginx/nginx.conf

Nginx에 관련한 메인설정파일로 Nginx 설정에 관한 블록들이 작성되어 있다. 이 파일에서 sites-enabled 폴더에 있는 파일들을 include하여 파일들을 가져온다.

📁 /ets/nginx/sites-available

가상 서버 환경들에 대한 설정 파일들이 위치하는 디렉토리이다. 실제 가상 서버가 돌던 안 돌던 가상 서버와 관련된 설정 파일들은 여기에 놓도록 한다.

📁 /ets/nginx/sites-enabled

sites-available에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symbolic link로 연결한 폴더이다. 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 실제 서버를 세팅한다.

🌼 Nginx 구성 파일 작성

$ cd /etc/nginx/sites-available
$ sudo vim [파일명].conf

SSL 인증서를 발급 받은 후, "/etc/nginx/sites-available"로 이동 후, 적절한 이름의 파일을 생성하여 아래와 같이 작성한다.

server {
        location /{
                proxy_pass http://localhost:3000;
        }

        location /api {
                proxy_pass http://localhost:8081/api;
        }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/[도메인]/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/[도메인]/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 = [도메인]) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

        listen 80;
        server_name [도메인];
    return 404; # managed by Certbot
}

위의 파일을 작성 후 아래의 작업을 수행한다.

◾ 심볼릭 링크 (symbolic link) : 링크를 연결해 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크

    - 특정 폴더에 링크를 걸어 원본파일을 사용하기 위해 사용

# 파일 연동
$ sudo ln -s /etc/nginx/sites-available/[파일명].conf /etc/nginx/sites-enabled/[파일명].conf

# 다음 명령어에서 successful이 뜨면 nginx를 실행할 수 있다.
$ sudo nginx -t

# nginx 재시작
$ sudo systemctl restart nginx

# nginx 상태 확인
$ sudo systemctl status nginx