Tutorial CDN + Nginx untuk Pengiriman Konten Global

Tutorial CDN + Nginx untuk Pengiriman Konten Global

Mengirimkan konten ke pengguna global dengan cepat adalah tantangan utama bagi website modern, terutama e‑commerce, media, atau platform dengan traffic internasional.

Menggunakan CDN (Content Delivery Network) bersama Nginx dapat meningkatkan kecepatan, mengurangi latency, dan menghemat bandwidth server.

Artikel ini membahas langkah-langkah implementasi CDN dengan Nginx, termasuk konfigurasi caching, security headers, dan optimasi.


1. Apa Itu CDN dan Manfaatnya

CDN adalah jaringan server global yang menyimpan salinan konten statis (gambar, CSS, JS, video) di berbagai lokasi. Saat pengunjung mengakses website, konten diambil dari server terdekat, bukan server utama.

Manfaat CDN:

  • Performa global lebih cepat: Mengurangi latency karena konten dekat dengan user
  • Beban server berkurang: Server utama fokus pada dynamic content
  • Scalability: Traffic tinggi dapat ditangani tanpa downtime
  • Keamanan: Banyak CDN menyediakan mitigasi DDoS dan SSL otomatis

Contoh penyedia CDN populer: Cloudflare, AWS CloudFront, Fastly, BunnyCDN.


2. Menyiapkan Nginx untuk CDN

Ada dua pendekatan utama:

  1. Origin Pull: CDN mengambil konten dari server Anda ketika diminta user pertama kali
  2. Origin Push: Konten diunggah ke CDN secara manual atau otomatis

Pada umumnya, origin pull lebih mudah dan dinamis.

Konfigurasi Nginx untuk Origin Pull

Misal domain: example.com, CDN domain: cdn.example.com.

Server block Nginx untuk origin:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;

    location / {
        try_files $uri $uri/ =404;
    }

    # Static content
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|webp)$ {
        expires 30d;
        add_header Cache-Control "public";
    }
}

CDN akan menarik file dari example.com saat pertama kali diminta.


3. Mengkonfigurasi Header untuk CDN

Agar CDN bekerja optimal, pastikan cacheable content memiliki header yang tepat:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|webp)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000, immutable";
    add_header Access-Control-Allow-Origin "*"; # Jika perlu diakses dari domain lain
}
  • immutable → memberitahu browser/CDN bahwa konten tidak berubah
  • Access-Control-Allow-Origin → penting untuk font, JS, atau asset yang dibagikan lintas domain

4. Menggunakan Subdomain untuk CDN

Biasanya, CDN menggunakan subdomain: cdn.example.com. Anda bisa membuat CNAME record ke CDN provider:

  • DNS: cdn.example.com → cdn.provider.com
  • Di Nginx origin: tetap layani konten dari example.com
  • CDN akan cache konten statis dan mengirim ke user

Contoh Nginx untuk subdomain CDN:

server {
    listen 80;
    server_name cdn.example.com;

    root /var/www/example.com/html;
    access_log off;
    error_log /var/log/nginx/cdn.error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|webp)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000, immutable";
    }
}

5. Optimasi Cache dan Purge CDN

Cache Control

  • Static content: max-age tinggi (hari/minggu)
  • Dynamic content: jangan cache, atau gunakan cache short-term

Purge CDN

  • Setiap kali konten diperbarui, lakukan purge CDN supaya user mendapatkan versi terbaru
  • Banyak CDN menyediakan API purge otomatis

6. Integrasi HTTPS

Pastikan CDN menggunakan HTTPS. Ada dua metode:

  1. Full SSL (strict): CDN memvalidasi SSL origin
  2. Flexible SSL: CDN mengakses origin via HTTP, user via HTTPS

Contoh origin SSL:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        try_files $uri $uri/ =404;
    }
}

CDN akan mengakses HTTPS origin jika mode Full SSL digunakan.


7. Mengatur Gzip dan Brotli Compression

CDN bisa cache versi terkompresi. Aktifkan gzip/Brotli di Nginx:

gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_min_length 256;
gzip_comp_level 5;

brotli on;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
brotli_comp_level 5;

Ini akan mengurangi ukuran file yang diambil CDN → lebih cepat untuk user global.


8. Security Best Practices

  • Hide server info: server_tokens off;
  • Limit request untuk origin: hindari DDoS langsung ke server
  • Enable WAF/CDN firewall: banyak CDN seperti Cloudflare menyediakan proteksi tambahan

9. Monitoring dan Analytics

CDN biasanya memberikan analytics:

  • Traffic per region
  • Bandwidth saved
  • Cache hit/miss rate

Di sisi Nginx origin, tetap pantau log:

sudo tail -f /var/log/nginx/cdn.error.log
  • Pastikan tidak ada request berulang yang seharusnya sudah di-cache
  • Pantau error 404/403 yang mungkin muncul karena konfigurasi cache

Kesimpulan CDN + Nginx

Menggunakan CDN dengan Nginx memberikan manfaat besar bagi website global:

  1. Mengurangi latency dengan server dekat user
  2. Mengurangi beban server origin
  3. Meningkatkan kecepatan load halaman statis
  4. Menambahkan lapisan keamanan tambahan
  5. Mudah diintegrasikan via subdomain dan konfigurasi origin pull

Dengan konfigurasi caching yang tepat, HTTPS, dan monitoring, konten website Anda bisa diakses cepat dan aman di seluruh dunia.