서브폴더 설치용 Cloudfront 리버스 프록시 구성하기

이 주제는 다른 주제의 보완 자료로, 해당 주제에서는 Discourse 설정에 초점을 맞추고 있습니다. 여기서는 Discourse 앞에 역방향 프록시(reverse proxy)로 Cloudfront 배포를 설정하는 방법을 다룹니다.

:warning: 이 조합이 필요한 경우는 주된 호스트네임에 이미 Cloudfront 배포가 존재하며, Discourse 포럼으로 서브폴더를 프록시 처리하고 싶은 경우뿐입니다. 이 가이드는 독자가 Cloudfront를 프로덕션 환경에서 사용해 본 경험이 있다고 가정합니다.

트래픽 흐름

사용자가 사이트를 로드할 때 두 개의 네트워크 연결이 관여됩니다. 각 연결에는 서로 다른 호스트네임이 사용됩니다:

  • 웹 브라우저는 공개 호스트네임에 대해 Cloudfront로 요청을 보냅니다.
  • 이후 Cloudfront는 오리지인 호스트네임에 대해 Discourse 서버로 요청을 보냅니다.
 .───────.      .───────.      .─────────.
( browser )───▶(   CF    )───▶( discourse )
 `───────'      `───────'      `─────────'

예시에서는 Discourse 사이트가 다음을 사용하여 https://www.example.com/forum/에서 로드된다고 가정하겠습니다:

목적 호스트네임
공개 호스트네임 www.example.com
오리지인 호스트네임 discourse.example.com

Cloudfront 설정

즉, 최소 두 개의 오리지인이 정의되어야 합니다. 하나는 기본 사이트용이고, 다른 하나는 Discourse 서버용입니다.

또한 각 오리지인으로 가리키는 최소 두 개의 행동(behavior)이 있습니다.

기본 행동과 오리지인은 여기서는 관련이 없으며, 필요에 따라 이미 적절히 설정되어 있어야 합니다. Discourse 전용 오리지인과 행동은 다음과 같이 설정해야 합니다.

오리지인(Origin)

Discourse 서버용 두 번째 오리지인은 오리지인 호스트네임을 가리키도록 설정해야 합니다.

오리지인 경로(origin path)를 설정하지 말고 하세요.

프로토콜 정책은 HTTPS로, 최소 버전은 TLSv1로 설정해야 합니다.

행동(Behavior)

패턴은 서브폴더와 일치해야 합니다.

위에서 설정한 오리지인에 연결되어야 합니다.

HTTP → HTTPS로 리다이렉트해야 합니다.

모든 HTTP 동사(verb)를 허용해야 합니다.

캐싱을 비활성화해야 합니다.

모든 클라이언트 헤더를 전달해야 합니다.

Lambda@edge 구성

공유 호스팅 환경(discourse.org 포함)은 SNI를 사용합니다. Cloudfront에서 이것이 작동하려면, Cloudfront가 뷰어 요청의 Host 헤더 대신 SNI에 오리지인 호스트네임을 사용하도록 Lambda@edge를 사용해야 합니다.

AWS Lambda 대시보드를 방문하여 새 함수를 생성하세요. Node.js 런타임 환경을 사용하고, "기본 Lambda@edge 권한"을 가진 새 역할을 생성하세요:

"함수 생성"을 클릭하세요.

코드 편집기가 나타나면 예제 코드를 다음으로 교체하세요:

exports.handler = async (event, context) => {
    const request = event.Records[0].cf.request;
    request.headers['x-forwarded-host'] = [{
        key: 'x-forwarded-host',
        value: request.headers['host'][0]['value']
    }];
    request.headers["host"] = [{
        key: 'host',
        value: request.origin.custom.domainName
    }];
    return request;
};

"배포"를 클릭하세요.

왼쪽 상단에서 작업 → Lambda@edge에 배포를 선택하세요

Cloudfront 배포를 선택하고, 목록에서 올바른 행동을 선택하세요:

어떤 이유로든 변경이 필요하면, "배포"를 한 후 버전 탭에서 "새 버전 게시"를 선택하고, 배포를 업데이트하여 Lambda의 새 버전을 사용하도록 하세요.

10개의 좋아요