본문 바로가기
문제해결

Nginx를 설치하고 HTTPS를 적용해보자 (with Ncloud, Google Domains)

by NEMNE 2021. 10. 30.

 

지난 NCloud로 서버 생성과 Mysql 연동 후 express 배포하기 - 2 에서는 Nginx 없이 주소와 포트 번호에 따라 서비스에 접근이 가능했습니다. 그러다가 나중에는 Nginx를 사용해야 한다는 말을 들었을 때 "Nginx 없이도 서비스가 잘 동작하는데 왜 Nginx를 적용시켜야 되지?"라는 궁금증이 생겼습니다.

 

그래서 먼저 Nginx를 사용해야 하는 이유에 대해 짚고 Nginx를 적용하는 법에 대해 알아보겠습니다 :)

 


 

목차

  1. Nginx를 왜 써?
  2. Nginx 설치하기
  3. Nginx 설정 파일 열어보기
  4. Google domains에서 domain 구매하기
  5. SSL 인증서 발급받기 (with certBot)
  6. Nginx에 HTTPS 적용하기

추가 Nginx로 React, Node 3-Tier Architecture 적용하기


 

Nginx를 왜 써?

Nginx를 리버스 프록시 때문에 쓰면 좋다고 하는데 막연하게 좋다고 사용하면 안 될 거 같아서 Nginx의 장점을 하나씩 적어보려고 합니다.

 

보안적으로 우세

 

Nginx를 일반적으로 Proxy 서버용으로 사용하는데 Proxy는 사용자가 모르게끔 다른 네트워크로 접속하게 해 줍니다. 즉, 사용자가 서버의 존재를 알지 못하고 Nginx를 거쳐서 결과를 받기 때문에 보안적으로 우세합니다.

 

속도도 빠르다. 

 

또한 Proxy는 캐싱 기능을 지원해주고 있기 때문에 캐싱으로 이전에 접속했던 일부 기록들을 가지고 있어 속도가 빠릅니다.

 

정적 파일 제공

 

기존에 WAS에서 html, css, js, image 파일들을 모두 제공해준다면 과부하가 발생할 수 있기 때문에 Web Server인 Nginx가 정적 파일을 제공해줍니다.

 

Event-Driven 방식으로 동작

 

Event-Driven 방식으로 동작하기 때문에 적은 양의 스레드가 사용되어 CPU 소모가 적습니다. (Node.js와 잘 맞습니다.)

Context-Switching 비용이 적다.

 

 

Nginx 설치 하기

인스턴스를 만들고 ssh로 해당 터미널에 접근했다면 아래의 명령어를 입력하면 됩니다.

 

sudo apt update
sudo apt install nginx

 

설치를 했다면 정상적으로 동작하는지 확인하기 위해 아래 명령을 입력해줍니다.

 

 

 

에러 발생 시 (Specified group 'Ip' unknown)

 

 

만약 아래 사진처럼 오류가 발생한다면 /etc/nginx/sites-available/default에서 listen [ : : ]:80 default_server;를 삭제해줍니다.

 

Nginx 설정 파일을 열어보기

Nginx를 사용하려고 하면 설정 파일을 원하는 조건에 맞게 수정해줘야 합니다. Nginx 설정은 어떻게 하는 건지 적어보겠습니다.

 

nginx.conf  설정 요소들

위 사진은 실제로 nginx를 설치하면 생기는 nginx.conf 내부입니다.

 

nginx는 directives로 구성되어있는데 directives는 user, worker_process, pid, events, http 등을 의미합니다.

만약 하나의 directives 안에 넣어야 할 내용들이 많다면 중괄호인 block을 사용하여 추가적인 내용을 넣습니다.

 

 

  • user : 워커 프로세스의 권한을 지정 (만약 root 보안상 위험하니 변경해줘야 합니다.)
  • worker_process : 워커 프로세스를 몇 개 생성할 것인지를 지정하는 지시어입니다. (1이면 하나의 프로세스가 모든 요청을 처리합니다.) 
  • events : 접속 처리에 관한 설정을 합니다.
    • worker_connections : 워커 프로세스 한 개 당 동시접속자 수 지정
  • http :  웹서버 관련 설정을 하는 directives로 일반적으로 자주 설정하는 server와 location이 여기에 포함됩니다.
    • sendfile : nginx에서 정적 파일을 보내도록 설정합니다.
    • tcp_nopush : 클라이언트로 패킷이 전송되기 전에 버퍼가 가득 찼는지 확인하여, 다 찼으면 패킷을 전송하도록 하여 네트워크 오버헤드를 줄이도록 설정합니다.
    • tcp_nodelay : 활성화하면 소켓이 패킷 크기에 상관없이 버퍼에 데이터를 보내도록 합니다.
    • gzip : 요청에 대한 응답을 gzip 압축 전송을 하여 보내도록 합니다.

 

nginx.conf vs sites-enabled vs sites-available 차이점

nginx에 관한 글들을 보면 nginx.conf나 sites-enabled, sites-available를 통해 설정을 해주는 경우를 볼 수 있을 겁니다. 그럼 각각의 파일들의 차이점이 무엇일까요?

 

먼저 sites-available는 나의 가상 환경 설정을 저장하는 곳입니다. 즉, 실제로 nginx에 반영되지는 않습니다.

 

sites-enabled는 sites-available안에 있는 폴더를 참조하고 있습니다. 그래서 이를 통해 참조를 제거하여 가상 호스트를 선택적으로 비활성화할 수 있습니다.

 

nginx.conf는 nginx와 관련된 모든 설정(events, http, server 등)을 적용합니다. 또한 sites-enabled를 참조하고 있습니다. 따라서 sites-available에서 설정한 파일이 nginx.conf에 적용이 됩니다.

 

 

Google domains에서 domain 구매하기

HTTPS 설정이나 ip 주소 말고 도메인 주소를 사용하고 싶다면 domain을 구매해야 합니다.

 

먼저 구글 도메인 홈페이지로 접속합니다. (링크 :  https://domains.google/ )

 

My domains 홈페이지에 접속합니다.

 

새 도메인 찾기를 들어갑니다.

 

구입하고 싶은 도메인 이름을 구입합니다.

단, 도메인의 이름에 따라 가격이 달라지니 적당한 가격을 고르셔야 합니다.

 

이미지 출처 : https://starton.tistory.com/598

한국에서는 구글 도메인 결제를 할 수 없다는 창이 뜰 겁니다. 여기서 청구서 수신/법적 소재 국가 선택을 미국으로 설정합니다.

추가로 양식에 맞게 주소를 작성합니다.

 

이후 해외 결제 카드를 입력해서 결제하면 도메인 구입이 완료됩니다. 

 

 

결제가 완료되면 DNS 탭으로 들어가서 리소스 레코드에 추가할 호스트 이름과 IP주소를 입력해줍니다.

 

이러면 Domain이 성공적으로 등록이 되었습니다!

 

그러나 HTTPS 설정을 안 해줬기 때문에 접속할 수 없을 겁니다.

 

SSL 인증서 발급받기 (with certBot)

그다음으로는 이제 certBot을 통해 SSL 인증서를 발급받아 볼 겁니다.

 

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

 

위 명령어로 certBot을 설치해줍니다.

 

sudo certbot certonly --nginx -d test-server.nemne.dev

 

sudo certbot certonly --nginx -d 도메인 주소를 입력하여 등록합니다. 

 

이후 이메일 주소와  A, Y를 입력해줍니다.

 

해당 메세지가 나오면 성공적으로 생성된 것이다.

 

Nginx에 HTTPS 적용하기

 

이제 SSL 발급을 받았다면 sites-available에서 설정을 수정해줍니다.

 

server {
        listen 443;
        ssl on;

        server_name [도메인 주소];

        ssl_certificate /etc/letsencrypt/live/[도메인 주소]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[도메인 주소]/privkey.pem;

        location / {
                root /root/WEB27-NogariHouse/client/build; #react build path
                index index.html index.htm;
                try_files $uri /index.html;
        }

}

 

성공적으로 https 가 적용된 것을 알 수 있습니다.