본문 바로가기
WIKI 기술 지식 베이스

리버스 프록시

원문 보기 위키 갱신

리버스 프록시 (Reverse proxy)

출처: Caddy 공식 문서

본문

이 가이드는 HTTPS가 있든 없든 프로덕션에 바로 쓸 수 있는 리버스 프록시를 빠르게 띄우는 방법을 보여줘요.

사전 준비:

  • 기본적인 터미널/명령줄 사용 능력

  • PATH에 caddy가 있어야 해요

  • 프록시할 실행 중인 백엔드 프로세스

이 튜토리얼은 127.0.0.1:9000에서 실행 중인 백엔드 HTTP 서비스가 있다고 가정해요. 이 명령들은 Linux용이지만 같은 원리가 다른 운영 체제에도 적용돼요.

구성 파일 없이 간단한 리버스 프록시를 실행할 수도 있고, 더 많은 유연성과 제어를 위해 구성 파일을 사용할 수도 있어요.

명령줄

머신의 포트 2080에서 포트 9000으로의 평문(plaintext) 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에서 몇 가지 방법:

  • root로 실행(예: 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

백엔드가 TLS를 지원한다면 Caddy는 자신과 백엔드 사이에도 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는 TLS 핸드셰이크가 성공적으로 완료될 수 있도록 Host 헤더를 백엔드의 것으로 재설정해요. 위 예제에서는 example.com에서 localhost:9000으로 변경되고(TLS 핸드셰이크에서 localhost가 사용됨) 돼요.

더 알아보기 (Learn more)