Object Storage Service (OSS) menggunakan alamat IP dinamis yang diberikan melalui resolusi nama domain. Hal ini dapat menyebabkan pembatasan akses atau kegagalan saat Anda mengonfigurasi daftar putih firewall atau melakukan integrasi sistem tertentu. Untuk menyelesaikan masalah ini, Anda dapat menerapkan Nginx reverse proxy pada instance Elastic Compute Service (ECS) dengan alamat IP publik statis. Proxy tersebut meneruskan permintaan akses ke OSS, sehingga memungkinkan Anda mengakses sumber daya OSS menggunakan alamat IP statis.
Cara kerjanya
Solusi ini menggunakan satu atau lebih instance ECS dengan alamat IP publik statis sebagai titik masuk trafik. Nginx berfungsi sebagai server reverse proxy pada instance ini dan meneruskan permintaan akses publik ke OSS. Alur kerja adalah sebagai berikut:
Klien memulai permintaan untuk mengakses sumber daya OSS melalui alamat IP publik statis (EIP) dari instance ECS.
Layanan Nginx pada instance ECS menerima dan memproses permintaan tersebut.
Berdasarkan konfigurasinya, Nginx meneruskan permintaan ke bucket OSS target.
OSS memproses permintaan dan mengembalikan data respons ke Nginx.
Nginx mengirimkan data respons kembali ke klien melalui Internet, menyelesaikan proses proxy.
Konfigurasikan reverse proxy ECS
Langkah 1: Buat instance ECS
Instance ECS berfungsi sebagai lingkungan runtime untuk perangkat lunak reverse proxy Nginx.
Buat instance ECS dengan konfigurasi berikut. Gunakan pengaturan default untuk parameter lainnya.
Untuk Billing Method, pilih Pay-As-You-Go.
Region: Pilih wilayah tempat bucket OSS target berada. Ini memungkinkan Anda menggunakan endpoint wilayah internal yang sama untuk menghemat biaya trafik.
Network and Zone: Anda dapat memilih virtual private cloud (VPC) dan zona default.
Untuk Instance, klik All Instance Types, lalu cari dan pilih
ecs.e-c1m2.large.CatatanJika tipe instans ini sudah habis terjual, pilih tipe instans lain.
Untuk Image, pilih Public Image dan kemudian Alibaba Cloud Linux (Alibaba Cloud Linux 3.2104 LTS 64-bit).
System Disk: Atur kapasitas disk ESSD Entry menjadi 40 GiB.
Untuk Public IP Address, pilih Assign Public IPv4 Address.
Bandwidth Billing Method: Anda dapat memilih Pay-By-Traffic untuk menghemat biaya.
Bandwidth: Pilih nilai 5 Mbps atau lebih tinggi.
Untuk Security Group, pilih New Security Group. Di bagian Open IPv4 Ports/Protocols, pilih HTTP (TCP: 80) untuk membuka port pendengar Nginx.
Untuk Logon Credentials, pilih Custom Password. Atur nama masuk menjadi root dan atur Logon Password.
Langkah 2: Instal dan konfigurasikan reverse proxy Nginx
Setelah membuat instance ECS, instal Nginx dan konfigurasikan aturan reverse proxy di instance tersebut.
Instal layanan Nginx.
yum install -y nginxBuat dan edit file konfigurasi. Untuk manajemen yang lebih mudah, buat file konfigurasi terpisah, seperti
oss_proxy.conf, di direktori/etc/nginx/conf.d/.vi /etc/nginx/conf.d/oss_proxy.confSalin template konfigurasi produksi berikut ke dalam file konfigurasi. Kemudian, modifikasi endpoint wilayah internal bucket dan alamat IP publik instance ECS berdasarkan komentar dalam template.
# Tentukan backend OSS dan aktifkan koneksi persisten untuk meningkatkan performa. upstream oss_backend { # [Wajib] Ganti dengan endpoint wilayah internal bucket. server your-bucket.oss-cn-hangzhou-internal.aliyuncs.com:80; # Jumlah koneksi keepalive yang direkomendasikan. Sesuaikan nilai ini berdasarkan jumlah koneksi bersamaan. keepalive 64; } # Tentukan format log untuk lingkungan produksi. Format ini mencakup informasi utama seperti waktu respons upstream. log_format production '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' 'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"'; server { listen 80; # [Wajib] Ganti dengan alamat IP publik instance ECS atau nama domain yang merujuk ke alamat IP ini. server_name your_ecs_public_ip_or_domain; # Jalur dan format log akses. access_log /var/log/nginx/oss_proxy.access.log production; error_log /var/log/nginx/oss_proxy.error.log; # Resolusi DNS dinamis. Ini memastikan bahwa Nginx mengetahui perubahan alamat IP backend OSS. resolver 100.100.2.136 100.100.2.138 valid=60s; # Endpoint pemeriksaan kesehatan untuk Server Load Balancer atau sistem pemantauan. location /health { access_log off; return 200 "healthy"; } location / { # Teruskan permintaan ke backend OSS upstream. proxy_pass http://oss_backend; # Konfigurasi utama: Pastikan HTTP/1.1 dan koneksi persisten diaktifkan. proxy_http_version 1.1; proxy_set_header Connection ""; # Konfigurasi utama: Atur header Host ke endpoint wilayah internal bucket OSS untuk memastikan verifikasi tanda tangan berhasil. # [Wajib] Ganti dengan endpoint wilayah internal bucket. proxy_set_header Host "your-bucket.oss-cn-hangzhou-internal.aliyuncs.com"; # Teruskan alamat IP asal klien. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; # Atur periode timeout proxy. proxy_connect_timeout 10s; proxy_send_timeout 30s; proxy_read_timeout 30s; # Ukuran maksimum file yang dapat diunggah. Nilai 0 menunjukkan tidak ada batasan. Atur parameter ini sesuai kebutuhan. client_max_body_size 1024m; } }Setelah memastikan bahwa konfigurasi benar, simpan file dan keluar dari editor.
Periksa sintaks file konfigurasi Nginx.
nginx -tJika ditampilkan
syntax is okdantest is successful, maka sintaks konfigurasi benar.Mulai layanan Nginx untuk menerapkan konfigurasi.
systemctl start nginx
Verifikasi reverse proxy
Pilih metode verifikasi berdasarkan izin akses bucket Anda.
Bucket baca-publik dan baca-tulis-publik
Di browser, akses objek di OSS menggunakan URL http://ecs_public_ip/object_path. Ganti ecs_public_ip dengan alamat IP publik instance ECS Anda, yang dapat Anda temukan di Konsol ECS. Ganti object_path dengan jalur akses objek di bucket. Sebagai contoh, jika file dest.jpg disimpan di direktori exampledir bucket, maka object_path adalah exampledir/dest.jpg. Gambar berikut menunjukkan upaya akses yang berhasil:

Bucket privat
Jika bucket yang ingin Anda akses bersifat privat, URL akses harus mencakup informasi tanda tangan. Langkah-langkah berikut menjelaskan cara mendapatkan URL bertanda tangan untuk file dari konsol. Untuk informasi lebih lanjut tentang tanda tangan dan cara menghasilkannya, lihat Versi Tanda Tangan 4 (Direkomendasikan).
Pergi ke halaman Buckets dan klik bucket target.
Untuk file yang ingin Anda akses, klik Details di kolom Aksi.
Klik Copy File URL. Di URL tersebut, ganti https dengan http dan nama domain bucket dengan alamat IP publik instance ECS Anda.
Akses URL yang telah dimodifikasi di browser.

Terapkan dalam lingkungan produksi
Saat menggunakan solusi ini dalam lingkungan produksi, ikuti praktik terbaik berikut untuk memastikan stabilitas layanan, keamanan, dan efisiensi biaya.
Praktik terbaik
Arsitektur tingkat ketersediaan tinggi: Gunakan arsitektur produksi yang terdiri dari Server Load Balancer dan instance ECS dalam penyebaran multi-zona untuk mencegah titik kegagalan tunggal.
Aktifkan HTTPS: Dalam lingkungan produksi, tegakkan akses HTTPS untuk memastikan keamanan transmisi data. Anda harus mengonfigurasi Sertifikat SSL untuk Nginx dan menyiapkan pengalihan otomatis dari HTTP ke HTTPS. Kode berikut menunjukkan metode konfigurasi.
CatatanUntuk memastikan bahwa layanan HTTPS dapat diakses, Anda harus membuka port 443 di grup keamanan tempat instance ECS berada. Untuk informasi lebih lanjut, lihat Tambah, ubah, atau hapus aturan grup keamanan.
# ... Konfigurasi upstream dan log_format tetap tidak berubah ... # Blok server HTTP: Paksa pengalihan ke HTTPS. server { listen 80; # [Wajib] Ganti dengan alamat IP publik instance ECS atau nama domain yang merujuk ke alamat IP ini. server_name your_ecs_public_ip_or_domain; # Alihkan semua permintaan HTTP ke HTTPS menggunakan kode status HTTP 301. return 301 https://$host$request_uri; } # Blok server HTTPS: Tangani layanan proxy sebenarnya. server { # Dengarkan koneksi SSL-VPN di port 443. listen 443 ssl http2; # [Wajib] Ganti dengan alamat IP publik instance ECS atau nama domain yang merujuk ke alamat IP ini. server_name your_ecs_public_ip_or_domain; # --- Konfigurasi sertifikat SSL --- # [Wajib] Ganti dengan jalur ke file sertifikat SSL dan kunci privat Anda. ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/private.key; # --- Konfigurasi penguatan keamanan SSL --- ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Jalur dan format log akses. access_log /var/log/nginx/oss_proxy.access.log production; error_log /var/log/nginx/oss_proxy.error.log; # Resolusi DNS dinamis (sama seperti konfigurasi asli). resolver 100.100.2.136 100.100.2.138 valid=60s; # Endpoint pemeriksaan kesehatan (sama seperti konfigurasi asli). location /health { access_log off; return 200 "healthy"; } location / { # ... Semua konfigurasi proxy_* sama seperti konfigurasi asli ... proxy_pass http://oss_backend; proxy_http_version 1.1; proxy_set_header Connection ""; # [Wajib] Ganti dengan endpoint wilayah internal bucket. proxy_set_header Host "your-bucket.oss-cn-hangzhou-internal.aliyuncs.com"; proxy_set_header X-Forwarded-For $proxy_add_x_forw_for; proxy_set_header X-Real-IP $remote_addr; # Tambahkan header X-Forwarded-Proto untuk memberi tahu backend bahwa klien mengakses layanan melalui HTTPS. proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 10s; proxy_send_timeout 30s; proxy_read_timeout 30s; client_max_body_size 1024m; } }Konfigurasikan buffer proxy: Untuk skenario yang melibatkan pengunduhan atau pengunggahan file besar, aktifkan dan konfigurasikan buffer proxy dengan benar. Ini dapat mengoptimalkan penggunaan memori server dan mencegah klien lambat menempati koneksi ke backend OSS untuk jangka waktu lama, yang meningkatkan performa layanan secara keseluruhan. Anda dapat menambahkan konfigurasi berikut di blok lokasi:
location / { # ... Konfigurasi proxy_* lainnya ... # Aktifkan buffering proxy dan atur jumlah serta ukuran buffer. proxy_buffering on; proxy_buffers 8 128k; proxy_buffer_size 128k; proxy_busy_buffers_size 256k; }Gunakan EIP: Asosiasikan alamat IP elastis (EIP) dengan titik masuk kluster proxy Anda (instance SLB atau instance ECS) untuk memastikan alamat IP stabil untuk titik masuk.
Gunakan nama domain untuk akses: Konfigurasikan resolusi nama domain untuk menunjuk ke alamat IP server proxy. Berikan layanan menggunakan nama domain alih-alih alamat IP. Ini menyederhanakan operasi manajemen dan penskalaan di masa depan.
Strategi toleransi kesalahan
Pemeriksaan kesehatan: Konfigurasikan Server Load Balancer untuk melakukan pemeriksaan kesehatan secara berkala pada endpoint
/healthNginx untuk secara otomatis mengisolasi instance yang rusak.Pengaturan timeout: Konfigurasikan parameter timeout Nginx dengan benar, seperti
proxy_connect_timeoutdanproxy_read_timeout, untuk mencegah banyak koneksi bertumpuk yang disebabkan oleh latensi respons dari backend OSS.Mekanisme ulang: Jika aplikasi klien Anda mendukung ulang, tambahkan logika ulang untuk kesalahan 5xx di lapisan aplikasi.
Pencegahan risiko
Penguatan keamanan: Di grup keamanan ECS dan ACL jaringan, berikan izin akses hanya ke alamat IP dan port yang diperlukan. Pertimbangkan untuk menerapkan Web Application Firewall (WAF) di frontend proxy untuk melindungi dari serangan web umum.
Pemantauan dan peringatan: Pantau log akses dan log kesalahan Nginx, serta metrik performa utama, seperti latensi permintaan, laju kesalahan, dan penggunaan CPU, memori, dan jaringan instance ECS. Tetapkan ambang batas peringatan untuk metrik ini sesuai kebutuhan.
Manajemen perubahan dan rollback: Uji dan verifikasi secara menyeluruh setiap perubahan pada konfigurasi Nginx. Simpan versi historis file konfigurasi untuk memungkinkan rollback cepat jika terjadi masalah.
FAQ
Bagaimana cara menampilkan gambar atau file web dari bucket di browser?
Karena mekanisme keamanan OSS, saat Anda mengakses gambar atau file web di OSS dari browser menggunakan nama domain default, file tersebut dipaksa diunduh alih-alih ditampilkan. Untuk menampilkan file ini langsung di browser, Anda harus memetakan nama domain kustom ke bucket dan menggunakan nama domain kustom yang dipetakan dalam konfigurasi Nginx. Untuk informasi lebih lanjut tentang cara memetakan nama domain kustom, lihat Akses OSS melalui nama domain kustom.
Bagaimana cara menyelesaikan kesalahan 403 Forbidden yang dikembalikan saat saya mengakses bucket privat?
Kesalahan 403 biasanya terkait dengan verifikasi tanda tangan atau konfigurasi izin. Anda dapat menyelesaikan kesalahan tersebut sebagai berikut:
Periksa konfigurasi Nginx: Pastikan nilai instruksi
proxy_set_header Hostpersis cocok dengan endpoint wilayah internal bucket yang ingin Anda akses. Ini adalah faktor kunci untuk verifikasi tanda tangan V4 yang berhasil.Periksa pembuatan tanda tangan: Konfirmasikan bahwa header
Hostyang digunakan untuk menghitung tanda tangan untuk URL bertanda tangan sama dengan headerHostdalam konfigurasi Nginx.Periksa izin bucket: Periksa apakah kebijakan bucket atau kebijakan RAM memberikan izin yang diperlukan.
Periksa otorisasi peran ECS: Jika aplikasi mengakses OSS menggunakan peran RAM instans, pastikan peran tersebut diberi izin yang diperlukan untuk mengakses bucket target.
Apa yang harus saya lakukan jika file besar gagal diunggah dan kesalahan 413 Request Entity Too Large dikembalikan?
Kesalahan ini terjadi karena ukuran file yang diunggah melebihi batas default Nginx. Di file konfigurasi Nginx, sesuaikan nilai client_max_body_size di blok server atau location. Sebagai contoh, atur client_max_body_size 2048m; untuk mengizinkan file hingga 2 GB diunggah. Setelah Anda memodifikasi konfigurasi, muat ulang konfigurasi Nginx agar perubahan berlaku.
Mengapa akses kadang-kadang gagal dan kesalahan 502 Bad Gateway muncul di log Nginx?
Kesalahan 502 menunjukkan bahwa Nginx tidak dapat memperoleh respons yang valid dari backend (OSS). Penyebab yang mungkin termasuk yang berikut:
Masalah resolusi DNS: Periksa apakah instruksi
resolverdisertakan dalam konfigurasi Nginx. Jika instruksi ini hilang, Nginx mungkin masih menggunakan alamat IP lama yang di-cache untuk mengakses OSS.Konektivitas jaringan: Periksa aturan keluar grup keamanan dan pengaturan ACL jaringan instance ECS untuk memastikan bahwa akses ke port 80 Endpoint OSS di wilayah tujuan diizinkan.
Kesalahan konfigurasi endpoint: Periksa apakah Endpoint OSS yang dikonfigurasikan di
proxy_passdanproxy_set_header Hostdieja dengan benar dan valid.
Bagaimana cara menggunakan satu instans Nginx untuk memproxy beberapa bucket yang berbeda?
Anda dapat menggunakan instruksi map Nginx untuk secara dinamis memilih bucket backend untuk meneruskan permintaan berdasarkan header Host dari permintaan.
# /etc/nginx/conf.d/multi_oss_proxy.conf
# Peta header Host secara dinamis ke endpoint wilayah internal bucket OSS.
map $http_host $oss_backend_host {
# [Wajib] Peta a.example.com ke endpoint wilayah internal bucket-a.
"a.example.com" "bucket-a.oss-cn-hangzhou-internal.aliyuncs.com";
# [Wajib] Peta b.example.com ke endpoint wilayah internal bucket-b.
"b.example.com" "bucket-b.oss-cn-shenzhen-internal.aliyuncs.com";
# Nilai default. Anda dapat membiarkan parameter ini kosong atau mengaturnya ke bucket default.
default "";
}
server {
listen 80;
# Dengarkan beberapa nama domain.
server_name a.example.com b.example.com;
# ... Konfigurasi lainnya, seperti log dan resolver ...
location / {
# Jika hasil pemetaan kosong, kesalahan 404 dikembalikan.
if ($oss_backend_host = "") {
return 404;
}
# Secara dinamis atur proxy_pass dan header Host.
proxy_pass http://$oss_backend_host;
proxy_set_header Host $oss_backend_host;
# ... Konfigurasi proxy_* lainnya ...
}
}