Nginx를 사용한 프런트엔드 프록시

이 페이지에서는 NGINX를 애플리케이션 컨테이너의 프런트엔드 프록시로 사용하는 방법을 보여줍니다. 이 방법은 요청 또는 응답을 처리하려는 경우에 유용합니다. 애플리케이션 컨테이너가 HTTP/1만 지원하고 성능상의 이유로 HTTP/2 엔드 투 엔드를 사용해야 하는 경우 gzip 압축을 추가하거나 HTTP/2를 HTTP/1로 변환할 수 있습니다.

이 페이지에 제공된 예시에서 Nginx 컨테이너는 모든 Cloud Run 인스턴스에서 기본 서빙되는 컨테이너로 실행되며, 다음 다이어그램과 같이 사이드카 컨테이너로 실행되는 애플리케이션 컨테이너에 요청을 전달하도록 구성됩니다.

Cloud Run mc hello nginx 1

Cloud Run에서 프런트엔드 프록시를 수행하는 가장 효과적인 방법은 Nginx 서버 프록시 서버 컨테이너 및 웹 앱 컨테이너를 단일 Cloud Run 서비스로 배포하는 것입니다.

Cloud Run mc hello nginx 2

이 단일 Cloud Run 서비스는 요청을 수락하고 인그레스 컨테이너(이 경우 프록시 서버)에 전달합니다. 그런 다음 프록시 서버는 localhost 네트워크 인터페이스를 통해 웹 앱에 요청을 보내 외부 네트워크를 방지합니다.

단일 Cloud Run 서비스로 배포하면 지연 시간, 서비스 관리 오버헤드가 줄어들고 외부 네트워크에 노출되지 않습니다. Cloud Run은 서비스가 시작되거나 중지될 때마다 사이드카 컨테이너를 직접 시작하거나 중지하는 것 외에는 사이드카 컨테이너와 직접 상호작용하지 않습니다.

웹 앱 컨테이너와 모든 사이드카 컨테이너는 다양한 프로그래밍 언어로 작성할 수 있습니다. PHP로 작성된 샘플은 GitHub의 PHP nginx 샘플을 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. Enable the Cloud Run and Secret Manager APIs.

    Enable the APIs

  7. gcloud CLI를 설치하고 초기화합니다.
  8. Google Cloud CLI를 업데이트합니다. gcloud components update
  9. Google Cloud CLI를 구성합니다. gcloud init
  10. Google Cloud CLI로 인증합니다. gcloud auth login

배포 시 필요한 권한

다음 역할 중 하나가 있어야 합니다.

  • Cloud Run 관리자서비스 계정 사용자 역할 모두
  • 특정 권한 목록이 포함된 모든 커스텀 역할

구성 개요

이 안내에서는 사전 빌드된 컨테이너 이미지를 사용하므로 프런트엔드 프록시에 필요한 유일한 경우는 컨테이너와 서비스 자체를 구성하는 것입니다.

Nginx 인그레스 컨테이너 구성

컨테이너 이미지는 nginx Docker Hub에서 사용할 수 있습니다. 사이드카 컨테이너가 localhost에서 리슨하는 포트로 프록시 처리된 요청을 전달하도록 프록시 서비스를 구성해야 하는 경우를 제외하고 대부분 그대로 사용할 수 있습니다. 이 페이지의 예시에서는 요청 및 응답에 gzip 압축도 사용 설정합니다.

구성은 /etc/nginx/conf.d/nginx.conf에 마운트된 텍스트 파일을 사용하여 제공됩니다. 컨테이너에서 파일을 직접 수정할 수 없기 때문에 구성 파일이 포함된 /etc/nginx/conf.d/에 볼륨을 마운트해야 합니다. Cloud Run에서 실행되는 컨테이너의 특정 위치에 파일을 마운트하는 한 가지 방법은 파일 콘텐츠를 Secret Manager 보안 비밀에 저장하고 해당 보안 비밀을 원하는 위치에 마운트하는 것입니다. 이는 런타임에 로드되는 볼륨입니다.

로컬 머신의 현재 디렉터리에 있는 nginx.conf라는 파일에 다음을 복사합니다.


server {
    # Listen at port 8080
    listen 8080; 
    # Server at localhost
    server_name _;
    # Enables gzip compression to make our app faster
    gzip on;

    location / {
        # Passes initial requests to port 8080 to `hello` container at port 8888
        proxy_pass   http://127.0.0.1:8888;
    }
}

구성에서 다음을 수행합니다.

  • nginx를 할당하여 localhost에 위치한 동일한 Cloud Run 기본 포트 8080에서 리슨합니다.
  • 성능 향상을 위해 gzip 압축을 적용합니다.
  • 이 인그레스 컨테이너에 대한 모든 요청을 localhost 포트 8888의 웹 앱 사이드카 컨테이너에 전달하도록 proxy_pass에 지시합니다.

nginx.conf 파일의 콘텐츠로 보안 비밀을 만듭니다.

콘솔

  1. Google Cloud 콘솔의 Secret Manager 페이지로 이동합니다.

    Secret Manager로 이동

  2. 보안 비밀 만들기를 클릭합니다.

  3. name 양식 필드에 nginx_config를 입력합니다.

  4. multi-container/hello-nginx-sample/nginx.conf에 있는 nginx.conf 파일을 보안 비밀 값으로 업로드합니다.

  5. 기본값(Google-managed encryption key, etc)을 유지합니다.

  6. 보안 비밀 만들기를 클릭합니다.

  7. 프로젝트 컴퓨팅 서비스 계정에 이 새로운 보안 비밀에 대한 액세스 권한을 부여합니다. 이렇게 하려면 Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

    IAM으로 이동

  8. 이름이 Compute Engine default service account인 주 구성원 서비스 계정을 찾고 주 구성원 수정을 클릭합니다.

  9. 다른 역할 추가를 클릭하고 Secret Manager 보안 비밀 접근자를 선택합니다.

  10. 저장을 클릭합니다.

gcloud

  1. 터미널에서 다음 명령어를 사용하여 Secret Manager에서 새 nginx_config 보안 비밀을 만듭니다.

    gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'

  2. 다음 명령어를 사용하여 프로젝트 컴퓨팅 서비스 계정에 이 새로운 보안 비밀에 대한 액세스 권한을 부여합니다.

    export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')
    gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'
    

  3. gcloud secrets list를 실행하여 보안 비밀이 생성되었는지 확인합니다.

웹 앱 사이드카 샘플 이미지 정보

이 안내에서는 us-docker.pkg.dev/cloudrun/container/hello에 있는 샘플 컨테이너 이미지를 사용합니다. 사이드카 컨테이너 구성 지정 아래에서 다음 섹션에 설명된 대로 컨테이너가 localhost에서 호스트로 리슨하는 포트 번호를 지정해야 합니다.

멀티 컨테이너 서비스 구성

Google Cloud 콘솔 또는 Cloud Run YAML 파일을 사용해서 하나 이상의 컨테이너로 Cloud Run 서비스를 구성합니다.

서비스 구성에서 Nginx 프록시 서버를 인그레스(서빙) 컨테이너, 리슨할 포트, HTTP 1 또는 HTTP 2 요청 수락 여부, 컨테이너 시작 순서로 지정합니다. 인그레스 컨테이너(프록시 서버)는 웹 앱 사이드카에 따라 다르므로 웹 앱 사이드카를 먼저 시작해야 합니다.

이러한 구성은 다음 일부 섹션에 표시되어 있습니다.

YAML 메타데이터 추가

콘솔

전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.

YAML

  1. 새 서비스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 서비스를 업데이트하는 경우 YAML 구성을 다운로드합니다.

    gcloud run services describe SERVICE --format export > service.yaml
  2. service.yaml에서 다음을 추가합니다.

    metadata:
      name: "MC_SERVICE_NAME"
      labels:
        cloud.googleapis.com/location: "REGION"
      annotations:
        # Required to use Cloud Run multi-containers (preview feature)
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/description: sample tutorial service
        # Externally available
        run.googleapis.com/ingress: all

이 섹션에서는 버전마다 다를 수 있는 속성이 포함된 서비스 버전에 대해 설명합니다.

컨테이너 시작 순서 지정

콘솔

전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.

YAML

service.yaml에서 다음을 추가합니다.

spec:
  template:
    metadata:
      annotations:
        # Defines container startup order within multi-container service.
        # Below requires hello container to spin up before nginx container,
        # which depends on the hello container.
        # https://cloud.google.com/run/docs/configuring/containers#container-ordering
        run.googleapis.com/container-dependencies: "{nginx: [hello]}"

nginx 컨테이너를 시작하기 전 hello 컨테이너가 시작될 때까지 기다리도록 Cloud Run에 지시하는 container-dependencies 주석을 확인합니다. 그렇지 않으면 nginx 컨테이너가 먼저 시작되는 경우 준비되지 않은 웹 앱 컨테이너로 웹 요청을 프록시하려고 시도할 수 있으며 이로 인해 웹 오류 응답이 생성됩니다.

각 컨테이너는 선택적으로 이름 속성을 정의할 수 있으며 이를 다른 지시어에서 참조하는 데 사용할 수 있습니다. 서빙 컨테이너는 nginx라는 프록시 서버를 실행합니다. Cloud Run이 수신 요청을 전달하는 컨테이너이므로 전송할 HTTP 및 컨테이너 포트의 버전을 지정해야 합니다.

서빙 컨테이너 구성 지정

콘솔

전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.

YAML

service.yaml 파일에서 다음을 추가합니다.

spec:
  containers:
    # A) Serving ingress container "nginx" listening at PORT 8080
    # Main entrypoint of multi-container service.
    # Source is stored in nginx_config secret in Secret Manager.
    # Any pings to this container will proxy over to hello container at PORT 8888.
    # https://cloud.google.com/run/docs/container-contract#port
    - image: nginx
      name: nginx
      ports:
        - name: http1
          containerPort: 8080
      resources:
        limits:
          cpu: 500m
          memory: 256Mi
      # Referencing declared volume below,
      # Declaring volume to mount in current ingress container's filesystem
      # https://cloud.google.com/run/docs/reference/rest/v2/Container#volumemount
      volumeMounts:
        - name: nginx-conf-secret
          readOnly: true
          mountPath: /etc/nginx/conf.d/
      startupProbe:
        timeoutSeconds: 240
        periodSeconds: 240
        failureThreshold: 1
        tcpSocket:
          port: 8080

nginx 서버에는 /etc/nginx/conf.d/ 디렉터리의 구성 파일이 필요합니다. 이를 수행하려면 해당 위치에서 파일이 포함된 볼륨을 마운트합니다. volumeMount 섹션은 configuration이라는 볼륨을 여기에 배치하도록 지정합니다. 볼륨 자체는 나중에 파일의 고유 섹션에 정의됩니다.

사이드카 컨테이너 구성 지정

콘솔

전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.

YAML

service.yaml에서 다음을 추가합니다.

- image: us-docker.pkg.dev/cloudrun/container/hello
  name: hello
  env:
    - name: PORT
      value: "8888"
  resources:
    limits:
      cpu: 1000m
      memory: 512Mi
  startupProbe:
    timeoutSeconds: 240
    periodSeconds: 240
    failureThreshold: 1
    tcpSocket:
      port: 8888

hello 애플리케이션에는 구성 정보도 필요합니다. PORT 환경 변수에 지정된 포트에서 수신 요청을 리슨합니다. 해당 이름과 값은 env 섹션에 지정됩니다.

보안 비밀 볼륨 지정

콘솔

전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.

YAML

service.yaml 파일에서 다음을 추가합니다.

volumes:
  - name: nginx-conf-secret
    secret:
      secretName: nginx_config
      items:
        - key: latest
          path: default.conf

volumeMount 섹션에 마운트된 volume 구성을 지정합니다. 콘텐츠가 nginx-conf-secret이라는 보안 비밀 값으로 정의된 nginx.conf라는 단일 파일을 포함합니다.

서비스 배포

콘솔

  1. Google Cloud 콘솔에서 Cloud Run 페이지로 이동합니다.

    Cloud Run으로 이동

  2. 서비스 만들기를 클릭합니다.

    1. 기존 컨테이너 이미지에서 버전 1개 배포를 선택하고 nginx컨테이너 이미지 URL로 입력합니다.
    2. 서비스 이름 필드에서 서비스 이름을 제공합니다(예: hello-mc).
    3. 리전 목록에서 배포하려는 위치를 선택합니다(예: us-west1).
    4. 인증 아래에서 Allow unauthenticated invocations를 선택합니다.
  3. 컨테이너, 볼륨, 네트워킹, 보안을 클릭하여 구성 양식을 확장합니다.

    1. 볼륨 탭을 클릭합니다.
    2. 볼륨 추가를 클릭합니다.
    3. 볼륨 유형 목록에서 보안 비밀을 선택합니다.
    4. 볼륨 이름 필드에 nginx-conf-secret을 입력합니다.
    5. 보안 비밀 필드에 nginx_config를 입력합니다.
    6. 보안 비밀 버전에 지정된 경로 아래에서 default.conf 경로 및 latest 버전을 지정합니다.
    7. 만들기를 클릭하여 보안 비밀 볼륨을 만듭니다.
  4. 컨테이너 탭을 클릭하여 컨테이너 수정 양식을 표시합니다.

    1. 설정을 클릭한 후 리소스 아래에서 메모리를 256MiB로로 변경하고 CPU를 CPU 1개로 변경합니다.
    2. 볼륨 마운트를 클릭합니다.
    3. 볼륨 마운트를 클릭합니다.
    4. 이름 목록에서 nginx-conf-secret을 선택합니다.
    5. 마운트 경로etc/nginx/conf.d를 입력합니다.
    6. 완료를 클릭하여 첫 번째 컨테이너의 구성을 완료합니다.
  5. 컨테이너 추가를 클릭하여 사이드카 컨테이너를 추가하고 새 컨테이너 양식을 표시합니다.

    1. 기본 컨테이너 이미지 URL us-docker.pkg.dev/cloudrun/container/hello를 선택합니다.
    2. 설정 탭을 클릭한 후 리소스 아래에서 메모리를 256MiB로 변경하고 CPU를 CPU 1개로 변경합니다.
    3. 변수 및 보안 비밀을 클릭합니다.
    4. 변수 추가를 클릭합니다.
    5. 새 환경 변수 이름으로 PORT를 입력하고 값으로 8888을 입력합니다.
    6. 완료를 클릭합니다.
  6. 첫 번째 컨테이너(nginx)의 컨테이너 수정 양식으로 이동합니다.

    1. 설정 탭을 클릭합니다.
    2. 컨테이너 시작 순서 아래의 종속 항목 목록에서 nginx를 선택합니다. 즉, hello 컨테이너가 성공적으로 시작된 후에만 nginx 컨테이너가 시작됩니다.
    3. 만들기를 클릭하고 서비스가 배포될 때까지 기다립니다.

gcloud

프록시 서버 컨테이너 및 웹 앱 컨테이너를 단일 서비스로 배포하려면 다음 안내를 따르세요.

gcloud run services replace service.yaml

배포된 서비스 확인

gcloud

배포가 성공했는지 확인하려면 생성된 Cloud Run URL을 복사하고 브라우저에서 열거나 다음 명령어를 사용해서 인증된 요청을 전송합니다.

curl --header "Authorization: Bearer $(gcloud auth print-identity-token)" 

응답 상태가 200인 hello 사이드카 컨테이너로 성공적으로 포팅된 nginx 프록시가 표시됩니다.

직접 사용해 보기

이 튜토리얼을 따라 진행하려면 다음을 수행하세요.

gcloud

  1. 터미널에서 로컬 머신에 샘플 앱 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples

  2. Cloud Run 샘플 코드가 포함된 디렉터리로 변경합니다.

    cd cloud-run-samples/multi-container/hello-nginx-sample/

다음 단계

Cloud Run 서비스에서 사이드카를 사용하는 방법을 자세히 알아보려면 다음 안내를 따르세요.