2 분 소요

1. nginx 설치하기

ec2 인스턴스(ubuntu)에 접속한 뒤에

sudo apt-get install nginx

2. letsencrypt

letsencrypt를 통해 3개월짜리 무료 인증서를 발급할 수 있다.

certbot 설치

certbot-auto가 설치되지 않아서 아래와 같은 명령으로 설치했다.

sudo snap install certbot --classic
sudo certbot certonly --nginx 

만약, 아래와 같은 에러가 발생한다면

스크린샷 2022-05-26 오후 5 26 31

포트 확인

sudo lsof -i tcp:80

이때 나타나는 PID를 이용해 해당 프로세스를 kill한다.

process kill

sudo kill -9 (PID)

3. nginx 설정하기

/etc/nginx/sites-enabled/default

sudo su를 통해 root로 전환한 뒤 진행한다.

vim /etc/nginx/sites-enabled/default

아래는 /etc/nginx/sites-enabled/default의 내용이다.

server {
        server_name api.test.tk;
        return 301 https://api.test.tk$request_uri;
}
server {
        listen 443 ssl;
        server_name api.test.tk;
        ssl_certificate /etc/letsencrypt/live/api.test.tk/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/api.test.tk/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://127.0.0.1:3060;
                proxy_redirect off;
       }
}

원래 # managed by Certbot 부분은 certbot에서 자동으로 추가해준다고 하는데 나는 certonly 명령 때문인지는 몰라도 자동으로 생성되지 않길래 내가 직접 추가했다.

/etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf

아래는 /etc/nginx/nginx.conf의 내용이다.
(참고로 첨부한 것이며 나는 따로 변경하지는 않았다.)

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
} 

설정 파일 변경 후

sudo service nginx restart

위 명령어로 nginx를 재시작 해야한다.

4. 인증서 자동 갱신

cron을 사용하여 자동갱신한다.

/etc/cron.d/certbot

vim /etc/cron.d/certbot

아래는 /etc/cron.d/certbot의 내용이다.
(나는 파일이 없어서 새로 생성했다.)

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root certbot -q renew --nginx --renew-hook 'service nginx reload'

이렇게 하면 매일 두 번씩 갱신을 시도한다.

+) 고생했던 부분 🥵

2번 단계에서, 처음에는 sudo certbot certonly --nginx 대신 sudo certbot --nginx 명령을 실행했는데, 계속해서 아래와 같은 오류가 발생했다.

Certbot failed to authenticate some domains (authenticator: nginx). The Certificate Authority reported these problems:
  Domain: [도메인이름]
  Type: unauthorized
  Detail: [IP]: Invalid response from http://[도메인이름]/.well-known/acme-challenge/...: 404

. . .

Some challenges have failed.

스크린샷 2022-05-26 오후 9 58 07

해결방법

우선 여기 나와 같은 에러가 발생한 분의 블로그를 보고 따라해봤으나, 나는 해결되지 않았다.
아래는 내가 해결한 방법이다.
sudo certbot certonly --nginx 명령으로 단순히 인증서만 받아왔다.
스크린샷 2022-05-27 오후 2 51 14
위 사진에서 보면, fullchain.pem의 경로와 privkey.pem의 경로가 나온다.
sudo su 명령으로 root로 전환한 뒤에 해당 경로들을 vim /etc/nginx/sites-enabled/default에서 추가한다.
(자세히는 위에 나타나있다.)

참고

ZeroCho
darrent, dev blog



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기