리버스 프록시 퀵 스타트
출처: Caddy 공식 문서
본문
이 가이드에서는 HTTPS를 쓸 수도 있고 쓰지 않을 수도 있는, 프로덕션에 바로 쓸 수 있는 리버스 프록시를 빠르게 띄우는 방법을 보여줘요.
사전 준비:
-
기본적인 터미널/명령줄 사용 능력
-
PATH에
caddy가 있어야 해요 -
프록시할 대상으로 실행 중인 백엔드 프로세스
이 튜토리얼은 127.0.0.1:9000에서 실행 중인 백엔드 HTTP 서비스가 있다고 가정해요. 명령은 Linux용이지만, 같은 원리가 다른 운영 체제에도 적용돼요.
설정 파일 없이 간단한 리버스 프록시를 실행할 수도 있고, 더 많은 유연성과 제어를 위해 설정 파일을 사용할 수도 있어요.
명령줄
머신에서 포트 2080에서 9000으로 가는 평문 HTTP 프록시를 시작하려면:
caddy reverse-proxy --from :2080 --to :9000
그다음 확인해 봐요:
curl -v 127.0.0.1:2080
reverse-proxy명령은 빠르고 간단한 리버스 프록시를 위한 것이에요. (요구 사항이 단순하다면 프로덕션에서도 쓸 수 있어요.)
Caddyfile
현재 작업 디렉터리에 Caddyfile이라는 파일을 만들고 다음 내용을 넣어요:
:2080
reverse_proxy :9000
이 설정 파일은 위의 caddy reverse-proxy 명령과 대략 동일해요.
그다음 같은 디렉터리에서 실행해요:
caddy run
그다음 프록시를 확인해 봐요:
curl -v 127.0.0.1:2080
Caddyfile을 변경했다면 Caddy를 리로드해 주세요.
이것은 간단한 예시였어요. reverse_proxy지시문으로 훨씬 더 많은 걸 할 수 있어요.
클라이언트에서 프록시로의 HTTPS
Caddy가 호스트 이름(도메인 이름)을 알면 프록시를 자동으로 그리고 기본적으로 HTTPS로 서빙해요. caddy reverse-proxy 명령은 --from 플래그를 생략하면 localhost를 기본값으로 사용하고, Caddyfile의 첫 줄을 프록시의 도메인 이름으로 바꿔도 돼요.
-
localhost또는.localhost로 끝나는 도메인을 사용하면 Caddy가 자동 갱신되는 자체 서명 인증서를 사용해요. 처음 할 때는 Caddy가 CA의 루트 인증서를 신뢰 저장소에 설치하려고 하므로 비밀번호를 입력해야 할 수도 있어요. -
다른 도메인 이름을 사용하면 Caddy가 공개적으로 신뢰받는 인증서를 얻으려고 시도해요. DNS 레코드가 여러분의 머신을 가리키고 포트 80과 443이 공개적으로 열려 Caddy로 향하도록 확인하세요.
포트를 지정하지 않으면 Caddy는 HTTPS에 443을 기본값으로 사용해요. 그 경우 낮은 포트에 바인딩할 권한도 필요해요. Linux에서 이 작업을 하는 몇 가지 방법:
-
루트로 실행해요(예:
sudo -E). -
또는
sudo setcap cap_net_bind_service=+ep $(which caddy)를 실행해 Caddy에 이 특정 권한을 부여해요.
HTTPS를 제공하는 가장 기본적인 caddy reverse-proxy 명령이에요:
caddy reverse-proxy --to :9000
그다음 확인해 봐요:
curl -v https://localhost
--from 플래그로 호스트 이름을 커스터마이즈할 수 있어요:
caddy reverse-proxy --from example.com --to :9000
낮은 포트에 바인딩할 권한이 없다면 더 높은 포트에서 프록시할 수 있어요:
caddy reverse-proxy --from example.com:8443 --to :9000
Caddyfile을 사용한다면 첫 줄을 도메인 이름으로 바꾸기만 하면 돼요. 예를 들어:
example.com
reverse_proxy :9000
프록시에서 백엔드로의 HTTPS
Caddy는 백엔드가 TLS를 지원한다면 자신과 백엔드 사이에서도 HTTPS로 프록시할 수 있어요. 백엔드 주소에 https://를 사용하면 돼요:
caddy reverse-proxy --from :2080 --to https://localhost:9000
이를 위해서는 백엔드의 인증서가 Caddy가 실행되는 시스템에서 신뢰되어야 해요. (Caddy는 명시적으로 설정하지 않으면 자체 서명 인증서를 신뢰하지 않아요.)
물론 양쪽 끝 모두에서 HTTPS를 할 수도 있어요:
caddy reverse-proxy --from example.com --to https://example.com:9000
이렇게 하면 클라이언트에서 프록시로, 그리고 프록시에서 백엔드로 HTTPS가 적용돼요.
프록시 대상 호스트 이름이 프록시 원본 호스트 이름과 다르다면 --change-host-header 플래그를 사용해야 해요:
caddy reverse-proxy \
--from example.com \
--to https://localhost:9000 \
--change-host-header
기본적으로 Caddy는 Host를 포함한 모든 HTTP 헤더를 변경 없이 통과시키고, Caddy는 Host 헤더에서 TLS ServerName을 유도해요. --change-host-header는 Host 헤더를 백엔드의 것으로 리셋해서 TLS 핸드셰이크가 성공적으로 완료되게 해요. 위 예시에서는 example.com에서 localhost:9000으로 바뀌고(핸드셰이크에서는 localhost가 사용됨) 돼요.