Menggunakan Nginx sebagai proxy frontend

Halaman ini menunjukkan cara menggunakan Nginx sebagai suatu proxy frontend untuk container aplikasi Anda. Hal ini berguna apabila Anda ingin memproses sejumlah permintaan ataupun respons. Anda dapat menambahkan kompresi gzip, atau menerjemahkan HTTP/2 menjadi HTTP/1 jika container aplikasi hanya mendukung HTTP/1 dan Anda perlu menggunakan HTTP/2 end-to-end untuk alasan performa.

Dalam contoh yang diberikan di halaman ini, container Nginx berjalan pada setiap instance Cloud Run sebagai container penayangan utama, dan ia dikonfigurasi untuk meneruskan permintaan ke container aplikasi, yang berjalan sebagai container file bantuan, sebagaimana yang ditampilkan dalam diagram berikut:

Cloud Run mc hello nginx 1

Cara paling efektif untuk melakukan proxy frontend di Cloud Run adalah dengan men-deploy container server proxy server Nginx dan container aplikasi web sebagai layanan Cloud Run tunggal:

Cloud Run mc hello nginx 2

Layanan Cloud Run tunggal ini menerima permintaan dan mengirimkannya ke container ingress (penayangan), yang dalam hal ini adalah server proxy. Selanjutnya, server proxy mengirimkan permintaan ke aplikasi web melalui localhost antarmuka jaringan , yang menghindari jaringan eksternal apa pun.

Deploying sebagai layanan Cloud Run tunggal akan mengurangi latensi, beban pengelolaan layanan, dan menghilangkan paparan pada jaringan eksternal. Cloud Run tidak berinteraksi secara langsung dengan container file bantuan, selain untuk memulai atau menghentikannya kapan pun layanan dimulai atau dihentikan.

Container aplikasi web serta container sidecar dapat ditulis dalam beberapa bahasa pemrograman yang berbeda-beda. Untuk contoh yang ditulis dalam PHP, lihat contoh nginx PHP di GitHub.

Sebelum memulai

  1. Login keakun Anda. Google Cloud Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Aktifkan Cloud Run dan Secret Manager API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin serviceusage.services.enable. Pelajari cara memberikan peran.

    Aktifkan API

  7. Instal dan lakukan inisialisasi gcloud CLI.
  8. Perbarui Google Cloud CLI: gcloud components update
  9. Konfigurasi Google Cloud CLI: gcloud init
  10. Autentikasi dengan Google Cloud CLI: gcloud auth login

Izin yang dibutuhkan untuk men-deploy

Anda harus memiliki salah satu dari hal berikut:

  • Baik itu peran Admin Cloud Run dan Pengguna Akun Layanan
  • Peran khusus apa pun yang menyertakan daftar izin spesifik ini

Ringkasan konfigurasi

Petunjuk-petunjuk tersebut menggunakan image container bawaan, sehingga satu-satunya hal yang dibutuhkan untuk proxy frontend adalah mengonfigurasi container dan layanan itu sendiri.

Konfigurasikan container ingress Nginx

Adapun image container nginx tersedia di Docker Hub. Sebagian besar telah siap untuk digunakan sebagaimana adanya, terkecuali ini perlu dikonfigurasi untuk dijalankan sebagai suatu layanan proxy, mengirimkan permintaan proxy ke port dimana container file bantuan sedang diproses di localhost. Contoh yang ada pada halaman ini juga dapat mengaktifkan kompresi gzip untuk permintaan dan respons.

Konfigurasi disediakan menggunakan file teks yang terpasang di /etc/nginx/conf.d/nginx.conf. Dikarenakan Anda tidak dapat mengedit file tersebut secara langsung dalam container, sehingga Anda harus memasang volume di /etc/nginx/conf.d/ yang berisikan file konfigurasi. Salah satu cara untuk memasang file di lokasi tertentu dalam container yang berjalan di Cloud Run adalah dengan menyimpan konten file dalam rahasia Secret Manager serta memasang rahasia tersebut di lokasi yang dipilih.

Salin kode berikut dalam sebuah file yang bernama nginx.conf di direktori saat ini pada mesin lokal Anda.


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;
    }
}

Dalam konfigurasi, lakukan hal berikut:

  • Tetapkan nginx untuk memproses pada port default Cloud Run yang sama, 8080, yang terletak di localhost.
  • Terapkan kompresi gzip untuk peningkatan performa.
  • Instruksikan proxy_pass untuk mengirimkan permintaan apa pun ke container ingress ini ke container file bantuan aplikasi web pada port localhost 8888.

Buat rahasia dengan konten file nginx.conf.

Konsol

  1. Buka halaman Secret Manager di Google Cloud konsol:

    Buka Secret Manager

  2. Klik Create secret.

  3. Di kolom formulir name, masukkan nginx_config.

  4. Upload file nginx.conf yang terletak di multi-container/hello-nginx-sample/nginx.conf sebagai nilai rahasia.

  5. Pertahankan nilai default (Google-owned and Google-managed encryption key, etc).

  6. Klik Create secret.

  7. Berikan akses akun layanan komputasi project ke rahasia baru ini. Untuk melakukannya, buka halaman IAM di Google Cloud konsol:

    Buka IAM

  8. Temukan akun layanan utama dengan nama: Compute Engine default service account, lalu klik Edit principal.

  9. Klik Add another role , lalu pilih Secret Manager Secret Accessor.

  10. Klik Save.

gcloud

  1. Di terminal, gunakan perintah berikut untuk membuat rahasia nginx_config baru di Secret Manager:

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

  2. Berikan akses akun layanan komputasi project ke rahasia baru ini menggunakan perintah

    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. Pastikan rahasia Anda telah dibuat dengan menjalankan gcloud secrets list.

Tentang image contoh file bantuan aplikasi web

Petunjuk ini akan menggunakan contoh image container di us-docker.pkg.dev/cloudrun/container/hello. Anda harus menentukan nomor port yang akan diproses container dan localhost sebagai host, seperti yang dijelaskan di bagian Menentukan konfigurasi container file bantuan, seperti yang dijelaskan di bagian berikut.

Konfigurasikan layanan multi-container

Anda dapat menggunakan Google Cloud konsol atau file YAML Cloud Run untuk mengonfigurasi layanan Cloud Run dengan lebih dari satu container.

Dalam konfigurasi layanan, tentukan server proxy Nginx sebagai container ingress (penayangan), port yang akan diproses, apakah server menerima permintaan HTTP 1 atau HTTP 2, dan urutan awal container. Container ingress (server proxy) bergantung pada file bantuan aplikasi web, sehingga file bantuan aplikasi web harus dimulai terlebih dahulu.

Konfigurasi ini ditampilkan di beberapa bagian berikutnya.

Menambahkan metadata YAML

Konsol

Buka Men-deploy layanan untuk mengetahui petunjuk konsol lengkap.

YAML

  1. Jika Anda membuat layanan baru, lewati langkah ini. Jika Anda memperbarui layanan yang ada, download konfigurasi YAML-nya:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Di service.yaml, tambahkan kode berikut:

    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

Bagian ini menjelaskan revisi layanan, yang mencakup beberapa properti yang dapat bervariasi dari revisi ke revisi.

Menentukan urutan startup container

Konsol

Buka Men-deploy layanan untuk mengetahui petunjuk konsol lengkap.

YAML

Di service.yaml, tambahkan kode berikut:

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]}"

Perhatikan anotasi container-dependencies yang memberi tahu Cloud Run untuk menunggu container hello dimulai sebelum memulai container nginx. Sebaliknya, jika container nginx dimulai terlebih dahulu, dapat mencoba untuk mem-proxy permintaan web ke container aplikasi web yang belum siap, yang akan menghasilkan respons kesalahan web.

Setiap container secara opsional memiliki properti nama yang ditentukan untuknya, yang dapat digunakan untuk merujuknya di pedoman lainnya. Container penayangan menjalankan server proxy, yang dinamakan nginx. Ini adalah container yang menjadi tujuan pengiriman permintaan masuk oleh Cloud Run , sehingga Anda harus menentukan versi HTTP dan port container yang menjadi tujuan pengirimannya.

Menentukan konfigurasi container penayangan

Konsol

Buka Men-deploy layanan untuk mengetahui petunjuk konsol lengkap.

YAML

Di file service.yaml, tambahkan kode berikut:

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

Server nginx memerlukan file konfigurasi di direktori /etc/nginx/conf.d/. Untuk melakukannya, pasang volume yang berisikan file di lokasi tersebut. Bagian volumeMount menentukan volume yang disebut configuration untuk ditempatkan di sana. Volume itu sendiri nantinya ditentukan di bagiannya sendiri dalam file tersebut.

Menentukan konfigurasi container file bantuan

Konsol

Buka Men-deploy layanan untuk mengetahui petunjuk konsol lengkap.

YAML

Di service.yaml, tambahkan kode berikut:

- 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

Aplikasi hello juga memerlukan adanya informasi konfigurasi. Fungsi ini memproses permintaan yang masuk pada port yang ditentukan dalam variabel lingkungan PORT. Nama dan nilai tersebut ditentukan dalam bagian env.

Menentukan volume rahasia

Konsol

Buka Men-deploy layanan untuk mengetahui petunjuk konsol lengkap.

YAML

Di file service.yaml, tambahkan kode berikut:

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

Tentukan konfigurasi volume yang terpasang di bagian volumeMount. Hal ini berisikan satu file bernama nginx.conf yang mana isinya ditentukan sebagai nilai rahasia bernama nginx-conf-secret.

Men-deploy layanan

Konsol

  1. Buka halaman Cloud Run di Google Cloud konsol:

    Buka Cloud Run

  2. Pilih Services dari menu, lalu klik Deploy container untuk menampilkan formulir Create service.

    1. Pilih Deploy one revision from an existing container image , lalu masukkan nginx sebagai Container image URL.
    2. Di kolom Service name, berikan nama untuk layanan Anda, misalnya, hello-mc.
    3. Dari daftar Region, pilih lokasi untuk men-deploy, misalnya, us-west1.
    4. Di bagian Authentication, pilih Allow public access. Jika Anda tidak memiliki izin (peran Admin Cloud Run) untuk memilih opsi ini, layanan akan di-deploy dan memerlukan autentikasi.
  3. Klik Containers, Networking, Security untuk meluaskan formulir konfigurasi.

    1. Klik tab Volumes.
    2. Klik Add volume.
    3. Dari daftar Volume type, pilih Secret.
    4. Di kolom Volume name, masukkan nginx-conf-secret.
    5. Di kolom Secret, masukkan nginx_config.
    6. Di bagian Specified paths for secret versions, tentukan default.conf sebagai jalur dan latest sebagai versi.
    7. Klik Create untuk membuat volume rahasia.
  4. Klik tab Containers untuk menampilkan formulir Edit container.

    1. Klik Settings, lalu di bagian Resources, ubah memori menjadi 256MiB dan CPU menjadi 1 CPU.
    2. Klik Volume mounts.
    3. Klik Mount volume.
    4. Pilih nginx-conf-secret dari daftar nama.
    5. Untuk Mount path, masukkan etc/nginx/conf.d.
    6. Klik Done untuk menyelesaikan konfigurasi container pertama.
  5. Klik Add container untuk menambahkan container file bantuan dan menampilkan formulir New container.

    1. Pilih URL image container default us-docker.pkg.dev/cloudrun/container/hello
    2. Klik tab Settings, lalu di bagian Resources, ubah memori menjadi 256MiB dan CPU menjadi 1 CPU.
    3. Klik Variables &Secrets.
    4. Klik Add variable.
    5. Masukkan PORT sebagai nama variabel lingkungan baru dan 8888 sebagai nilai.
    6. Klik Done.
  6. Buka formulir Edit container untuk container pertama (nginx).

    1. Klik tab Settings.
    2. Di bagian Container start up order, pilih nginx dari daftar Depends on. Artinya, container nginx hanya akan dimulai setelah container hello berhasil dimulai.
    3. Klik Create dan tunggu hingga layanan Anda di-deploy.

YAML

Untuk men-deploy container server proxy dan container aplikasi web sebagai suatu layanan tunggal:

gcloud run services replace service.yaml

Verifikasi layanan yang di-deploy

Untuk memverifikasi deployment yang berhasil, salin URL Cloud Run yang dihasilkan dan buka di browser, atau gunakan perintah ini untuk mengirimkan permintaan yang terautentikasi:

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

Anda akan disambut dengan proxy nginx yang telah berhasil di-porting ke container file bantuan hello dengan status respons 200.

Coba lakukan ini sendiri

Untuk mengikuti tutorial ini:

gcloud

  1. Di terminal, clone repositori aplikasi contoh ke mesin lokal Anda:

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

  2. Ubah ke direktori yang berisikan kode contoh Cloud Run:

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

Langkah berikutnya

Untuk mempelajari lebih lanjut tentang cara menggunakan file bantuan di layanan Cloud Run: