Belajar Nginx - Reusable, Modular & Maintainable Configuration Architecture
Episode 14 of 21

Belajar Nginx - Reusable, Modular & Maintainable Configuration Architecture

Episode ini menjelaskan layout konfigurasi berstandar industri dengan sites-available dan sites-enabled, snippet reusable di direktori includes, serta injeksi environment variable lewat envsubst di container Docker.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Konfigurasi NGINX yang sehat adalah konfigurasi yang bisa dipelihara tim selama bertahun-tahun. Satu file raksasa yang berisi semua site, security header, dan cache akan menjadi mimpi buruk saat tim bertambah. Episode 14 ini membahas arsitektur konfigurasi yang reusable, modular, dan maintainable.

Kalian akan mengikuti konvensi sites-available dan sites-enabled, membuat direktori includes untuk snippet reusable seperti SSL dan security headers, serta memanfaatkan envsubst untuk menyuntikkan environment variable ke konfigurasi saat container Docker berjalan.

Struktur Direktori NGINX Berstandar Industri

Konsep sites-available dan sites-enabled

Distribusi Debian memperkenalkan konvensi yang sekarang dipakai luas: dua direktori dengan peran berbeda.

  • /etc/nginx/sites-available/ — tempat menyimpan semua konfigurasi site, aktif atau tidak.
  • /etc/nginx/sites-enabled/ — berisi symlink ke site yang ingin diaktifkan.

Mengaktifkan site berarti membuat symlink; menonaktifkan berarti menghapus symlink. Konfigurasi asli tidak pernah hilang:

Aktifkan dan nonaktifkan site
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t
sudo systemctl reload nginx
 
sudo rm /etc/nginx/sites-enabled/example.com
sudo systemctl reload nginx

ln -s membuat symlink dari sites-available ke sites-enabled. Jika kalian memakai conf.d/, konvensinya sama tapi file yang tidak di-include otomatis tidak aktif.

Membuat Direktori includes

Snippet Reusable untuk Semua Site

Beberapa konfigurasi harus ada di setiap site: security headers, pengaturan SSL, atau blok location umum. Daripada menulis ulang berulang kali, buat direktori includes:

Buat direktori includes
sudo mkdir -p /etc/nginx/includes

Contoh Snippet SSL dan Security Headers

Buat file /etc/nginx/includes/ssl.conf untuk konfigurasi TLS standar:

Snippet ssl.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;

Lalu file /etc/nginx/includes/security-headers.conf:

Snippet security-headers.conf
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "default-src 'self'" always;

Setiap server block cukup meng-include kedua file:

Server block memakai snippet
server {
    listen 443 ssl http2;
    server_name example.com;
 
    include /etc/nginx/includes/ssl.conf;
    include /etc/nginx/includes/security-headers.conf;
 
    root /var/www/example;
}

Perubahan satu file snippet langsung berlaku di semua site setelah reload. Inilah kekuatan modularisasi.

Dynamic Configuration dengan envsubst

Masalah Konfigurasi Statis di Container

Di container Docker, server block sering sama untuk semua environment, kecuali beberapa nilai yang berbeda seperti nama upstream atau host. Menulis nilai itu keras di image adalah kesalahan. Solusinya: template dengan placeholder environment variable.

envsubst Mengganti Variabel Saat Container Jalan

Template konfigurasi, misalnya /etc/nginx/templates/default.conf.template:

Template dengan environment variable
server {
    listen 80;
    server_name ${SERVER_NAME};
 
    location / {
        proxy_pass http://${BACKEND_HOST}:${BACKEND_PORT};
        proxy_set_header Host $host;
    }
}

Lalu gunakan envsubst saat container berjalan untuk mengganti SERVER_NAME, BACKEND_HOST, dan BACKEND_PORT:

Injeksi variabel dengan envsubst
SERVER_NAME=example.com BACKEND_HOST=app BACKEND_PORT=3000 \
    envsubst '${SERVER_NAME} ${BACKEND_HOST} ${BACKEND_PORT}' \
    < /etc/nginx/templates/default.conf.template \
    > /etc/nginx/conf.d/default.conf
nginx -t
nginx -s reload

Perintah envsubst '{nama variabel}' hanya mengganti variabel yang terdaftar, sehingga variabel NGINX asli seperti $host tidak ikut rusak. Image resmi nginx punya direktori /etc/nginx/templates/ yang otomatis memproses file .template lewat envsubst saat start.

Penutup

Episode 14 menata arsitektur konfigurasi kalian: memakai konvensi sites-available dan sites-enabled, membuat snippet reusable di includes, dan menyuntikkan environment variable dengan envsubst untuk container Docker.

Inti yang harus dibawa pulang:

  • sites-available menyimpan semua site; sites-enabled berisi symlink yang aktif.
  • Symlink adalah mekanisme enable dan disable yang aman.
  • Snippet ssl.conf dan security-headers.conf mengurangi duplikasi konfigurasi.
  • Satu perubahan snippet berlaku untuk semua site setelah reload.
  • envsubst mengganti environment variable saat container start.
  • Batasi daftar variabel di envsubst agar variabel NGINX tidak rusak.

Di episode 15 selanjutnya kita akan membahas customized logging, JSON logging, dan log rotation — memformat access log dengan log_format, menghasilkan log JSON untuk integrasi SIEM, logging kondisional, serta rotasi file log dengan logrotate.