Caddy로 서버에 HTTPS 적용하기
rag server를 aws ec2 인스턴스에서 배포했는데 HTTPS 설정을 따로 하지 않아 HTTPS로 통신이 이루어지는 상황이었다. HTTPS를 적용하기 위해 reverse proxy web server를 지원해주는 Caddy로 쉽게 HTTPS 서빙을 시도하기로 했다.
이번 설치는 우분투 또는 데비안 계열 리눅스 기준으로 서술하였다.
aws 인스턴스를 사용중이라면 HTTPS 통신이 이루어지는 443 포트를 허용해주어야한다.
(포트 설정 링크)
-
사전에 필요한 패키지를 설치한다.
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
-
Caddy 공식 저장소의 GPG 키를 다운로드하고 등록한다.
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
-
Caddy 저장소를 source list에 추가한다.
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
-
패키지 목록을 갱신한다.
sudo apt update
-
Caddy 설치한다.
sudo apt install caddy
-
설치 후 Caddy 서비스를 자동 시작하도록 하고 상태를 확인한다.
sudo systemctl enable caddy sudo systemctl start caddy sudo systemctl status caddy
Caddy 다운로드를 마쳤다면 본인의 도메인과 서버 listening 중인 포트에 따라 설정을 변경해야한다.
기본 설정 파일은 아래 경로에 위치해있다.
/etc/caddy/Caddyfile
/etc/caddy로 이동해
vim Caddyfile
로 편집기를 실행한 뒤에 아래 내용을 각자 입장에 맞게 복사해 넣어준다.
ec2-0-0-0-0.compute-1.amazonaws.com.nip.io {
reverse_proxy localhost:8000
}
내 경우에는 8000포트를 사용하기에 HTTPS 요청이 들어오면 8000포트로 라우팅되도록 설정해주었다.
{ }앞에 도메인 주소를 적어주어야 한다.
Caddy의 장점은 Caddy를 실행했을 때 자동으로 도메인 주소에 대한 HTTPS 인증서(Let's Encrypt 인증서)를 발급받고 보안 연결을 지원해준다는 점이다. SSL 인증서를 따로 발급 받을 필요가 없는게 매우 편리하다.
나의 경우는 테스트 단계였기에 도메인 주소를 따로 발급받지 않아서 AWS EC2 퍼블릭 DNS에 .nip.io를 붙였다. 해당 주소를 붙인 이유는 HTTPS 인증서를 자동으로 발급받기 위함이다. ec2-0-0-0-0.compute-1.amazonaws.com 처럼 도메인이 없는 경우 Let's Encrypt와 같은 무료 인증서를 발급받을 수 없기에 self-signed 인증서를 발급받거나 nip.io 같은 DNS 서비스를 임시 도메인으로 활용해야한다.
인증서를 발급받는 것도 은근 귀찮은데 테스트할 때 수고로움을 덜어주어서 매우 좋은 것 같다.
나는 HTTP에서 HTTPS로 리다이렉션만 해주면 되었기에 위의 코드를 사용했다.
만약 HTTP 요청을 HTTPS로 자동 리다이렉션해주는 기능까지 필요하다면 아래처럼 기입하자.
yourdomain.com {
# HTTP 요청을 HTTPS로 자동 리다이렉션
@http {
protocol http
}
redir @http https://{host}{uri} permanent
# HTTPS 요청에 대해 리버스 프록시 (내부 서버가 localhost:8000이라고 가정)
reverse_proxy localhost:8000
}
주의 : 반드시 도메인과 {
사이에 띄어쓰기를 포함하세요. 처음에 별 생각 없이 붙이고 실행했다가 오류가 났다..
나는 Caddy 설정하면서 오류가 자주 났는데, 만약 Caddy 서버가 실행되고 있는데 Caddyfile을 변경했다면 아래 명령어로 재시작을 해주어야 한다.
sudo systemctl reload caddy
오류가 나서 상세한 로그를 확인하고 싶다면 아래 명령어들을 이용해보자.
sudo systemctl status caddy.service
sudo journalctl -xeu caddy.service