Best Practices #
Buku ini ditutup dengan kumpulan praktik terbaik yang distilasi dari pengalaman mengelola Nginx di production. Sebagian sudah dibahas di artikel-artikel sebelumnya, tapi mengumpulkannya di satu tempat membuat checklist yang berguna sebelum deployment.
Organisasi File Konfigurasi #
Konfigurasi yang terorganisir baik adalah fondasi dari server yang mudah dipelihara:
/etc/nginx/
├── nginx.conf ← Hanya setting global: worker, events, http block
├── conf.d/
│ ├── default.conf ← Default server (catch-all, return 444)
│ ├── example.com.conf ← Satu file per virtual host
│ └── api.example.com.conf
└── snippets/
├── ssl-params.conf ← Parameter SSL yang digunakan ulang
├── security-headers.conf ← Security headers
├── proxy-params.conf ← Header standar untuk proxy
└── fastcgi-params.conf ← Parameter FastCGI kustom
# /etc/nginx/snippets/proxy-params.conf
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 5s;
proxy_read_timeout 60s;
# Di setiap server block:
location / {
include snippets/proxy-params.conf;
proxy_pass http://backend;
}
Snippet menghilangkan duplikasi dan memastikan konsistensi — ubah di satu tempat, berlaku di semua server block yang menggunakannya.
Default Server yang Aman #
Selalu definisikan default server yang menolak request tidak dikenal:
# /etc/nginx/conf.d/00-default.conf
# Nama dimulai "00-" agar diload pertama
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
# Self-signed cert untuk default server (diperlukan untuk ssl default_server)
ssl_certificate /etc/nginx/ssl/default-self-signed.crt;
ssl_certificate_key /etc/nginx/ssl/default-self-signed.key;
# Tutup koneksi tanpa mengirim response apapun
# Ini tidak mengekspos informasi tentang server kamu
return 444;
}
Tanpa ini, request ke IP server dengan Host header yang tidak dikenal akan dijawab oleh server block pertama yang ada — yang bisa mengekspos aplikasi yang tidak seharusnya.
Selalu Test Sebelum Reload #
Jadikan ini kebiasaan yang tidak pernah dilanggar:
# Test syntax dulu
sudo nginx -t
# Jika OK, baru reload
sudo nginx -t && sudo systemctl reload nginx
# Atau buat alias
alias nginx-reload='sudo nginx -t && sudo systemctl reload nginx'
nginx -s reload (atau systemctl reload nginx) adalah graceful reload — koneksi yang sedang aktif tidak diputus, worker baru dimuat dengan konfigurasi baru, worker lama selesai menangani request yang sedang berjalan lalu berhenti. Tidak ada downtime saat reload.
Simpan Konfigurasi di Version Control #
Konfigurasi Nginx adalah kode — perlakukan seperti itu:
# Inisialisasi repository di direktori konfigurasi
cd /etc/nginx
sudo git init
sudo git add .
sudo git commit -m "Initial nginx configuration"
# Setiap kali ada perubahan
sudo nano conf.d/example.com.conf
sudo nginx -t && sudo git add -A && sudo git commit -m "Add SSL for example.com"
sudo systemctl reload nginx
# Rollback jika ada masalah
sudo git log --oneline
sudo git checkout HEAD~1 -- conf.d/example.com.conf
sudo nginx -t && sudo systemctl reload nginx
Git di /etc/nginx memungkinkan kamu melihat riwayat perubahan, membandingkan konfigurasi lama dan baru, dan rollback dengan cepat saat ada masalah.
Konfigurasi Keamanan Default yang Harus Ada #
Daftar minimum yang harus ada di setiap Nginx production:
# /etc/nginx/nginx.conf
# Sembunyikan versi Nginx
server_tokens off;
http {
# Sembunyikan versi dari error page juga
server_tokens off;
# Batasi ukuran request default (override di location upload)
client_max_body_size 10m;
# Timeout untuk cegah slow attack
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
# Rate limit global (override per endpoint)
limit_req_zone $binary_remote_addr zone=global:10m rate=30r/s;
}
# Di setiap server block HTTPS
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000" always;
Monitoring yang Harus Ada #
Jangan tunggu user yang lapor sebelum tahu ada masalah:
# Minimal: alert saat Nginx down
# Dengan systemd:
sudo systemctl enable nginx # Autostart saat boot
# Atau dengan monit:
sudo apt install monit -y
# /etc/monit/conf.d/nginx
# check process nginx with pidfile /run/nginx.pid
# start program = "/bin/systemctl start nginx"
# stop program = "/bin/systemctl stop nginx"
# if failed host localhost port 80 then restart
Checklist monitoring production:
□ Nginx process monitoring (restart otomatis jika crash)
□ Disk space alert (log bisa menghabiskan disk)
□ SSL certificate expiry alert (minimal 30 hari sebelum)
□ Error rate monitoring (5xx rate yang tinggi)
□ Response time monitoring (p95 dan p99)
□ Upstream health check
Checklist Production Readiness #
Sebelum live, verifikasi semua ini:
Konfigurasi Dasar:
□ nginx -t bersih tanpa warning
□ server_tokens off
□ Default server (catch-all) dikonfigurasi
□ HTTP redirect ke HTTPS
SSL/TLS:
□ fullchain.pem (bukan cert.pem saja)
□ TLSv1.2 dan TLSv1.3 saja (tidak ada 1.0 atau 1.1)
□ ssl_session_cache dikonfigurasi
□ Sertifikat valid dan tidak akan expired dalam 30 hari
□ HSTS header aktif
Keamanan:
□ Security headers (X-Frame-Options, X-Content-Type-Options, dll.)
□ Rate limiting di endpoint sensitif (login, register, API)
□ client_max_body_size sesuai kebutuhan
□ Timeout dikonfigurasi (header, body, send)
□ File .env, .git, .htaccess tidak bisa diakses
Performa:
□ Gzip aktif untuk text/html, CSS, JavaScript, JSON
□ Cache headers untuk static assets
□ Keepalive ke backend dikonfigurasi
□ worker_processes auto
Logging:
□ Access log dan error log dikonfigurasi
□ Log rotation aktif (cek /etc/logrotate.d/nginx)
□ Log level error atau warn (bukan debug)
Monitoring:
□ Nginx auto-restart saat crash (systemd atau supervisor)
□ SSL expiry monitoring
□ Disk space monitoring
□ Alerting untuk 5xx error rate
Penutup #
Nginx adalah software yang luar biasa — cepat, stabil, efisien, dan fleksibel. Ia mentenagai sebagian besar internet, dan dengan pemahaman yang baik tentang cara kerjanya, kamu bisa menjadikannya fondasi yang solid untuk infrastruktur apapun.
Perjalanan belajar Nginx tidak berhenti di sini. Dokumentasi resmi di nginx.org/en/docs sangat lengkap dan menjadi referensi utama ketika kamu butuh detail tentang directive tertentu. Komunitas di forum dan mailing list juga aktif dan siap membantu.
Yang terpenting: praktik langsung. Buat virtual machine, eksperimen dengan konfigurasi, rusak sesuatu, perbaiki. Pengalaman nyata dengan error sungguhan adalah guru terbaik.
Checklist singkat sebelum setiap perubahan konfigurasi:
nginx -t— test syntax- Backup —
git commitatau copy file konfigurasisystemctl reload nginx— graceful reload, tanpa downtime- Verifikasi — test endpoint yang diubah, cek error log
- Monitor — pantau error rate 5-10 menit setelah perubahan
← Sebelumnya: Tools Diagnostik