Directive & Context #
Jika kamu membuka file konfigurasi Nginx dan mencoba memahami strukturnya, dua konsep yang pertama perlu dipahami adalah directive dan context. Directive adalah instruksi individual yang memberitahu Nginx apa yang harus dilakukan. Context adalah blok yang mengelompokkan directive-directive tersebut dan menentukan di mana directive itu berlaku.
Directive: Instruksi Individual #
Setiap baris konfigurasi yang bukan blok adalah sebuah directive. Formatnya sederhana:
# Format: nama_directive nilai;
worker_processes auto;
keepalive_timeout 65;
server_name example.com;
root /var/www/html;
Setiap directive diakhiri dengan titik koma. Jika lupa titik koma, Nginx akan menolak konfigurasi saat nginx -t.
Beberapa directive menerima beberapa nilai:
# Multiple values
server_name example.com www.example.com;
# Multiple arguments dengan makna berbeda
listen 443 ssl; # port + parameter tambahan
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;
Context: Blok Pengelompokan #
Context adalah blok yang dibatasi oleh kurung kurawal {}. Setiap context mendefinisikan di mana directive berlaku:
# Ini context 'http' — semua yang ada di sini berlaku untuk HTTP processing
http {
# Ini context 'server' — konfigurasi untuk satu virtual host
server {
# Ini context 'location' — konfigurasi untuk URL path tertentu
location / {
root /var/www/html;
}
}
}
Beberapa context bisa bersarang (nested) di dalam context lain. Ini membentuk hierarki yang penting untuk dipahami.
Hierarki Context #
Nginx memiliki hierarki context yang tetap:
main (level teratas, tidak ada blok eksplisit)
├── events { }
├── http { }
│ ├── upstream { }
│ ├── server { }
│ │ ├── location { }
│ │ │ └── location { } (nested location)
│ │ └── location { }
│ └── server { }
├── stream { } (untuk TCP/UDP proxy)
│ ├── upstream { }
│ └── server { }
└── mail { } (untuk mail proxy)
Main context adalah level teratas — directive di sini berlaku secara global. Tidak ada blok eksplisit, cukup tulis directive langsung di nginx.conf di luar blok manapun.
Events context mengontrol cara Nginx menangani koneksi di level OS — jumlah koneksi per worker, model event yang digunakan.
HTTP context adalah tempat semua konfigurasi web server dan reverse proxy berada. Hampir semua yang kamu konfigurasi ada di sini.
Server context mendefinisikan satu virtual host. Bisa ada banyak server context, masing-masing menangani domain atau port yang berbeda.
Location context mendefinisikan bagaimana Nginx memproses URL path tertentu di dalam sebuah server.
Inheritance: Pewarisan Nilai Antar Context #
Ini adalah bagian yang paling sering disalahpahami. Directive di context yang lebih tinggi diwariskan ke context di bawahnya — kecuali context bawah mendefinisikan ulang directive tersebut.
http {
# Didefinisikan di level http — diwarisi semua server dan location
gzip on;
keepalive_timeout 65;
server {
listen 80;
server_name example.com;
# gzip dan keepalive_timeout diwarisi dari http context
# Tidak perlu didefinisikan ulang
location /api/ {
# Masih mewarisi gzip on dan keepalive_timeout 65
}
location /downloads/ {
# Override untuk direktori ini saja
gzip off; # ← menimpa nilai dari http context
}
}
server {
listen 80;
server_name other.com;
# Override keepalive untuk site ini
keepalive_timeout 30;
# gzip masih on (diwarisi dari http)
}
}
Prinsipnya: kamu tidak perlu mengulang directive yang sama di setiap level — cukup definisikan di level tertinggi yang relevan, dan ia akan diwarisi ke bawah.
Tipe-Tipe Directive dan Cara Inheritancenya #
Tidak semua directive mewarisi nilai dengan cara yang sama. Ada tiga perilaku yang perlu dipahami:
Simple Directive — Nilai Tunggal #
Directive dengan nilai tunggal mengikuti aturan inheritance biasa — nilai dari context parent diwarisi, dan bisa di-override di context child.
http {
client_max_body_size 10m; # Default untuk semua server
server {
server_name uploads.example.com;
client_max_body_size 100m; # Override untuk site ini
}
server {
server_name other.example.com;
# client_max_body_size 10m diwarisi, tidak perlu tulis ulang
}
}
Array Directive — Nilai Ditambahkan, Bukan Diganti #
Beberapa directive (terutama yang bisa muncul berkali-kali) bersifat additive — nilai di child context menggantikan nilai dari parent, bukan ditambahkan.
http {
# Ini mendefinisikan index di level http
index index.html index.htm;
server {
# ANTI-PATTERN: Kamu mungkin berpikir ini menambahkan index.php
# ke daftar yang sudah ada dari http context
index index.php;
# Tapi ini MENGGANTIKAN daftar di atas — hanya index.php yang dicek!
# BENAR: Definisikan ulang secara lengkap
index index.php index.html index.htm;
}
}
Directive yang Tidak Diwarisi #
Beberapa directive hanya valid di context tertentu dan tidak diwarisi sama sekali. Misalnya, listen hanya valid di context server dan tidak ada di level http.
Context Events #
events {
# Jumlah maksimum koneksi yang bisa ditangani satu worker
worker_connections 1024;
# Metode event yang digunakan (auto-detect, jarang perlu di-set manual)
use epoll;
# Izinkan worker terima multiple koneksi sekaligus
multi_accept on;
}
Untuk sebagian besar kasus, cukup set worker_connections dan biarkan yang lain default.
Context HTTP: Pengaturan Global Web #
http {
# MIME types — mapping ekstensi file ke Content-Type header
include /etc/nginx/mime.types;
default_type application/octet-stream; # Default jika ekstensi tidak dikenal
# Format log
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent';
access_log /var/log/nginx/access.log main;
# Performa
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
# Ukuran maksimum body request (upload file dll)
client_max_body_size 10m;
# Kompresi
gzip on;
gzip_types text/plain text/css application/javascript application/json;
# Include konfigurasi virtual host
include /etc/nginx/conf.d/*.conf;
}
Perintah untuk Memahami Konfigurasi yang Aktif #
Dua perintah yang sangat berguna saat belajar dan debugging:
# Validasi syntax — Nginx akan lapor error beserta nomor baris
sudo nginx -t
# Tampilkan seluruh konfigurasi efektif (setelah semua include)
# berguna untuk memastikan inheritance berjalan seperti yang diharapkan
sudo nginx -T | less
Ketika nginx -T dijalankan, outputnya akan menampilkan setiap directive beserta file asalnya:
# configuration file /etc/nginx/nginx.conf:
user nginx;
worker_processes auto;
...
# configuration file /etc/nginx/conf.d/default.conf:
server {
listen 80;
...
}
Ringkasan #
- Directive adalah instruksi individual, selalu diakhiri titik koma. Context adalah blok
{}yang mengelompokkan directive dan menentukan di mana mereka berlaku.- Hierarki context: main → events/http → server → location. Setiap level lebih spesifik dari yang di atasnya.
- Inheritance: directive di context parent diwarisi ke child, dan bisa di-override di child. Definisikan directive di level tertinggi yang relevan untuk menghindari duplikasi.
- Array directive menggantikan, bukan menambahkan — jika kamu override
indexdi server context, kamu harus menulis ulang seluruh daftarnya.nginx -Tmenampilkan konfigurasi efektif final — gunakan ini untuk memverifikasi bahwa inheritance dan include bekerja seperti yang diharapkan.
← Sebelumnya: Struktur File Config Berikutnya: Server Block →