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.

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.
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:
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 nginxln -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.
Beberapa konfigurasi harus ada di setiap site: security headers, pengaturan SSL, atau blok location umum. Daripada menulis ulang berulang kali, buat direktori includes:
sudo mkdir -p /etc/nginx/includesBuat file /etc/nginx/includes/ssl.conf untuk konfigurasi TLS standar:
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:
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 {
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.
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.
Template konfigurasi, misalnya /etc/nginx/templates/default.conf.template:
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:
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 reloadPerintah 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.
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.ssl.conf dan security-headers.conf mengurangi duplikasi konfigurasi.envsubst mengganti environment variable saat container start.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.