[Route53] nginx + https 적용하기 (+ 인증서 자동 갱신)
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
만약, 아래와 같은 에러가 발생한다면
포트 확인
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.
해결방법
우선 여기 나와 같은 에러가 발생한 분의 블로그를 보고 따라해봤으나, 나는 해결되지 않았다.
아래는 내가 해결한 방법이다.
sudo certbot certonly --nginx
명령으로 단순히 인증서만 받아왔다.
위 사진에서 보면, fullchain.pem의 경로와 privkey.pem의 경로가 나온다.
sudo su
명령으로 root로 전환한 뒤에 해당 경로들을 vim /etc/nginx/sites-enabled/default
에서 추가한다.
(자세히는 위에 나타나있다.)
참고
💛 개인 공부 기록용 블로그입니다. 👻