Nginx보다 100배는 간단하다. HTTPS 자동 적용이 포함된 ‘Caddy’

2023-12-08

간단한 웹 서비스를 배포할 때면 Nginx를 사용해야 하는 경우가 많습니다. 이제는 웹 서비스에 HTTPS 프로토콜 적용이 사실상 필수가 되었기 때문에 더더욱 그러합니다.

하지만 아쉽게도 Nginx의 공식 문서와 설정 난이도는 입문자에게 친절한 편이 아닙니다. 익숙해지면 쉬운 일이긴 하지만, 익숙해졌다고 해도 어느 정도의 번거로움이 여전히 있는 편입니다.

Caddy는 Go로 작성된 open-source 웹 서버입니다. 설치, 설정, 실행이 굉장히 쉽고, HTTPS 프로토콜이 자동으로 적용되는 것이 큰 특징입니다.공식 문서가 굉장히 잘 되어 있어 입문자들도 굉장히 쉽게 따라할 수 있도록 되어 있습니다.

성능

Caddy는 Go로 작성되어, 프로덕션 환경에서도 무난하게 사용할 수 있을 정도의 속도를 보여줍니다. 벤치마크 글에 따르면, Caddy의 성능은 Nginx와 거의 유사한 수준입니다. 정말 큰 트래픽을 받아내야 하는 상황이 아니라면, Nginx 대신 Caddy를 골라도 문제가 없을 것이라 보여집니다.

설치

Caddy는 거의 모든 플랫폼에서 설치하고 실행할 수 있습니다. 기본적으로 Caddy는 외부 의존성이 없는 단일 바이너리 파일이기 때문에, 다운로드 페이지GitHub 레포지토리에서 바이너리 파일을 다운받은 뒤 터미널에서 실행시키는 것만으로도 실행이 가능합니다.

Ubuntu에서는 아래 명령어들을 순차적으로 입력함으로써 설치할 수 있습니다. 설치 후 자동으로 실행됩니다.

$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ 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
$ sudo apt install caddy

만약 첫 명령어에서 Package <패키지 이름> has no installation candidate 에러가 발생한다면, sudo apt update 명령어를 한 번 실행해서 패키지 인덱스를 최신화 해 주면 됩니다.

조금 더 간단한 설치를 원하시는 분들은, Homebrew나 Nix 같은 패키지 매니저로도 설치가 가능합니다.

더 자세한 설치 방법에 대해서는 공식 문서를 참고해 주세요.

설정

Caddy는 크게 두 가지 설정 방법을 지원합니다.

기본적으로, Caddy는 설정되어 있는 모든 사이트에 대해 HTTPS 프로토콜을 활성화하고 TLS 인증서를 지속적으로 갱신합니다. 또한 HTTP 요청을 자동으로 HTTPS로 리다이렉트합니다. 따라서 HTTPS 프로토콜을 사이트에 적용하기 위해서 별도로 설정할 필요가 없습니다!

Caddyfile을 사용해서 설정하기

Caddyfile을 통한 설정은 가장 일반적인 방법입니다. Caddyfile 이라는 이름의 파일을 확장자 없이 생성하고, 파일 안에 설정을 작성하면 됩니다.

$ sudo vi Caddyfile

Caddyfile은 nginx의 설정파일과 비교도 되지 않을 정도로 간단하고 직관적입니다.

단순 포트 포워딩은 아래와 같이 작성할 수 있습니다.

:443

reverse_proxy :8080

특정 도메인으로 들어온 요청을 특정 포트로 포워딩하려면 아래와 같이 작성하면 됩니다.

naru200.com

reverse_proxy :8080

여러 사이트를 설정하기 위해서는 중괄호가 필요합니다. 즉, 하나의 사이트를 작성할 때만 중괄호를 생략할 수 있습니다.

naru200.com {
	reverse_proxy :8080
}

api.naru200.com {
	reverse_proxy :3000
}

file_server 지시문을 통해 정적 파일이나 정적 웹사이트를 서비스할 수 있습니다. 또한 root 지시문을 사용해 사이트의 루트 경로를 지정할 수 있습니다.

static.naru200.com {
	root * /app/public
	file_server
}

조금 고급 사용 예시로, 로드 밸런싱과 헬스 체크를 수행할 수도 있습니다.

naru200.com {
	reverse_proxy 10.0.0.1:8080 10.0.0.2:8080 10.0.0.3:8080 {
		lb_policy        round_robin
		health_uri       /healthz
		health_interval  30s
	}
}

더 자세한 Caddyfile 형식 및 설정에 대해서는 공식 문서를 참고하세요.

API를 사용해서 설정하기

API를 통한 설정 방법은 Caddy의 관리 엔드포인트에 Admin API로 HTTP 요청을 보내 설정을 제어하는 방법입니다. 일반적인 방법은 아니지만, 외부의 요청에 따라 유동적으로 인프라를 제어해야 하는 상황이라면 유용하게 사용할 수 있습니다.

Admin API를 통해 Caddy를 설정하는 방법에 대해서는 공식 문서를 참고하세요.

실행

caddy start 명령어를 이용해 background에서 Caddy를 실행할 수 있습니다. 만약 foreground에서 실행하고 싶다면, caddy run 명령어를 사용하면 됩니다. foreground/background 외에 두 명령어의 차이는 없습니다.

위 두 명령어는 기본적으로 현재 경로(명령어가 실행된 경로)에 Caddyfile이 존재한다면 해당 Caddyfile에서 설정을 읽어옵니다. 따라서 Caddyfile이 존재하는 경로에서 바로 명령어를 실행하여 Caddyfile 설정을 적용할 수 있습니다. 또는 --config 플래그로 Caddyfile의 경로를 지정해 줄 수 있습니다.

이미 Caddy가 실행되고 있는 상태에서 설정을 변경하고 싶다면, caddy reload 명령어를 사용해서 서비스의 중단 없이 설정을 변경할 수 있습니다.