1. 구입한 도메인을 서버에 연결하기

  미니 PC에 Nginx를 설치하고 도메인 사이트에서 구입한 닷컴 도메인을 연결했습니다. 먼저 도메인을 서버에 연결하기 위해서는 도메인을 구입한 사이트의 DNS 관리 페이지에 들어가야 합니다.

 

  저는 가비아에서 구매를 해서 가비아를 기준으로 설명드리겠습니다. 먼저 DNS 정보 메뉴에 들어가서 DNS 관리 버튼을 클릭합니다.

 

  구매한 도메인을 체크하고 DNS 설정을 클릭합니다.

 

  레코드 추가를 눌러서 호스트는 www, @, 값/위치는 서버의 ip주소를 입력하고 TTL은 3600으로 설정하고 저장을 누릅니다. @는 도메인 주소를 입력했을 때 서버의 주소로 접속하기 위해서 설정하고, www는 www가 붙은 도메인 주소로 접속하기 위해서 설정해 줍니다. TTL은 DNS 서버가 정보를 캐시에 유지하는 시간을 의미하는데 TTL을 너무 낮게 설정하면 DNS 서버가 자주 갱신 요청을 해야 하므로 서버의 부하가 증가하고, TTL을 길게 설정하면 도메인 설정을 변경했을 때 변경사항이 적용되는데 오래 걸리므로 일반적으로 3600(1시간)으로 설정한다고 합니다.


2. Nginx 설정 수정하기

sudo vim /etc/nginx/sites-available/<도메인 이름>.conf

 

  도메인 사이트에서 DNS 설정이 끝났으면 서버의 Nginx 설정 파일을 수정해줘야 합니다. 위 명령어를 입력해서 nginx의 sites-available 폴더에 파일을 생성해 줍니다. 설정파일이라는 것을 구분하기 위해 '.conf'를 붙이는 것일 뿐 생략해도 무방합니다.

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

 

   에디터가 열렸으면 i를 눌러서 insert mode에 진입해서 위 코드를 붙여 넣기 한 후에 server_name 부분에 구입한 도메인 주소를 입력해 주세요. 그리고 esc를 누른 후에 :wq를 입력하고 저장을 합니다.

sudo ln -s /etc/nginx/sites-available/<도메인 이름>.conf /etc/nginx/sites-enabled/

 

  편집이 끝났다면 위의 명령어를 입력해서 sites-enabled 폴더에 심볼릭 링크를 형성해 줍니다. 심볼릭 링크는 윈도우의 바로가기 같은 기능으로 sites-available 폴더에서는 nginx의 모든 설정 파일을 저장해 놓고, 서버에 직접 적용할 설정 파일만 sites-enabled 폴더에 심볼릭 링크를 연결해서 사용을 합니다. 이제 도메인 주소를 웹브라우저에 입력하면 서버에 연결이 될 것입니다.


3. HTTPS 적용을 위해 SSL/TLS 인증서 받기

sudo apt-get update
sudo apt-get install certbot
sudo apt-get install python3-certbot-nginx

 

  웹페이지에 HTTPS 적용을 하기 위해서는 먼저 인증서를 발급받아야 합니다. 우분투 버전이 18.04 이상이면 python3-certbot-nginx를 설치하면 되지만, 그보다 오래된 버전이라면 python-certbot-nginx를 설치해야 한다고 합니다.

sudo certbot --nginx -d example.com -d www.example.com

 

  위의 명령어에서 example.com 부분을 구매한 도매인으로 수정하고 실행하면 인증서 발급 절차가 시작됩니다. 이메일을 입력하라는 문구가 나오는데, 이메일을 입력하고 약관에 동의하면 인증서가 발급이 됩니다.

sudo vim /etc/nginx/sites-available/<도메인 이름>.conf

 

  인증서를 발급받은 후에 다시 conf 파일을 확인해 보면 자동으로 아래와 같이 수정된 것을 볼 수 있습니다.

server {
    root /var/www/html;
    index index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }

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


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

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

 

  발급받은 인증서는 90일 이후에 만료되므로 cron 작업 스케줄러를 이용하여 자동으로 갱신되도록 하는 것이 좋습니다. 인증서를 갱신하기 위해서는 일시적으로 80번 포트를 열어주어야 하기 때문에 root 사용자의 crontab을 설정하겠습니다.

sudo crontab -e

 

  crontab -e를 입력하면 원하는 에디터를 설정하라는 문구가 나옵니다.

 

  저는 vim을 선호하기 때문에 2번을 선택했습니다.

0 0 * * * ufw allow 80 && /usr/bin/certbot renew --quiet && ufw deny 80

 

  에디터가 열렸다면 위와 같이 입력하고 저장해 줍니다.

 

  위와 같이 입력하면 매일 0시에 cerbot이 인증서를 갱신하도록 설정합니다. --quiet는 작업을 조용하게 진행하며, 오류가 없다면 로그를 남기지 않습니다. 만약 시간을 다르게 설정하고 싶다면 순서대로 시, 분, day of month(매일), mon(매월), day of week(요일) 값을 다르게 주어서 변경할 수 있습니다. 매일 명령어가 실행되어도 실제로 인증서 갱신 작업은 만료가 가까워질 때만 수행되므로 서버에 무리가 가지 않습니다. 인증서를 갱신할 때에는 80번 포트와 443 포트가 열려 있어야 하기 때문에 임시로 80번 포트를 열고 인증서 갱신이 완료되면 80번 포트를 닫도록 설정을 했습니다. 이 작업은 동기적으로 이루어져서 인증서 갱신이 완료된 후에 80번 포트가 닫힐 것입니다.

# 인증서 상태 확인
sudo certbot certificates

# 임시로 방화벽 비활성화 or 80번 포트 허용
sudo ufw disable / sudo ufw allow 80

# 인증서 갱신
sudo certbot renew

# 다시 방화벽 활성화 / 80번 포트 차단
sudo ufw enable / sudo ufw deny 80

 

  만약 수동으로 인증서 갱신을 진행하려면 위와 같은 단계로 진행하면 됩니다.


4. 방화벽 설정 변경하기

sudo ufw allow 'Nginx HTTPS'
sudo ufw reload
sudo ufw status

 

  마지막으로 http 포트인 80 포트의 접근을 막고, https 포트인 443번 포트로만 접속이 되도록 방화벽의 설정을 변경합니다.

+ Recent posts