Server Block #
Server block adalah cara Nginx mengimplementasikan virtual hosting — kemampuan untuk menjalankan banyak website berbeda dari satu server fisik. Setiap server block mendefinisikan satu “virtual host”: pada port dan domain apa ia mendengarkan, dan apa yang harus dilakukan dengan request yang masuk ke sana.
Struktur Dasar Server Block #
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Tiga directive yang hampir selalu ada di setiap server block:
listen — port dan/atau IP address yang didengarkan. Nginx memeriksa ini saat mencocokkan request masuk.
server_name — nama domain yang dilayani. Nginx mencocokkan ini dengan header Host dari request.
root — direktori di mana file-file website disimpan.
Directive listen #
listen lebih fleksibel dari yang terlihat:
# Listen di semua interface, port 80
listen 80;
# Listen di IP address spesifik
listen 192.168.1.10:80;
# Listen di IPv6
listen [::]:80;
# Listen untuk HTTPS
listen 443 ssl;
# Listen untuk HTTP/2 (cara lama, sebelum Nginx 1.25.1)
listen 443 ssl http2;
# Listen untuk HTTP/2 (cara baru, Nginx 1.25.1+)
listen 443 ssl;
http2 on;
# Tandai sebagai default server (lihat penjelasan di bawah)
listen 80 default_server;
Satu server block bisa punya beberapa directive listen:
server {
listen 80; # HTTP
listen 443 ssl; # HTTPS
server_name example.com;
# ...
}
Directive server_name #
server_name menentukan domain mana yang dilayani server block ini. Nginx mencocokkannya dengan header Host dari request HTTP.
# Domain tunggal
server_name example.com;
# Multiple domain
server_name example.com www.example.com;
# Wildcard subdomain
server_name *.example.com;
# Wildcard di suffix (jarang digunakan)
server_name example.*;
# Regex (awali dengan ~)
server_name ~^(www\.)?example\.com$;
# Catch-all — cocok dengan apapun
server_name _;
Urutan Prioritas Pencocokan server_name #
Ketika ada banyak server block, Nginx mencocokkan server_name dengan urutan prioritas berikut:
1. Exact match (paling diprioritaskan)
server_name example.com;
2. Wildcard di awal
server_name *.example.com;
3. Wildcard di akhir
server_name example.*;
4. Regex match (dalam urutan kemunculan di konfigurasi)
server_name ~^(www\.)?example\.com$;
5. Default server (jika tidak ada yang cocok)
Contoh praktis — request untuk www.example.com akan mencocok server block mana?
server {
server_name example.com; # Tidak cocok (exact)
}
server {
server_name *.example.com; # Cocok! (wildcard)
}
server {
server_name ~^www\.example\.com$; # Juga cocok, tapi prioritas lebih rendah
}
Jawaban: server block dengan *.example.com yang menang karena wildcard di awal memiliki prioritas lebih tinggi dari regex.
Default Server #
Apa yang terjadi jika Nginx menerima request dengan header Host yang tidak cocok dengan server_name manapun? Nginx menggunakan default server — server block pertama yang di-load untuk port tersebut.
Kamu bisa secara eksplisit menandai server block tertentu sebagai default:
# Server block ini akan menangani request yang tidak cocok server_name lain
server {
listen 80 default_server;
server_name _; # Underscore adalah konvensi untuk "tidak ada nama"
# Tolak semua request yang tidak dikenal
return 444; # 444 adalah kode Nginx untuk "tutup koneksi tanpa respons"
}
Pola ini adalah praktik keamanan yang baik — kamu tidak ingin request ke IP servermu (tanpa domain yang benar) secara tidak sengaja diproses oleh salah satu virtual host.
Banyak Server Block dalam Satu File #
Kamu bisa mendefinisikan banyak server block dalam satu file, atau memisahkannya ke file berbeda — hasilnya sama:
# /etc/nginx/conf.d/sites.conf
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example;
# ...
}
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
# ...
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
}
}
Konvensi yang disarankan: satu file per domain. Ini membuat manajemen virtual host lebih mudah, terutama ketika ada banyak site.
Redirect HTTP ke HTTPS #
Pola yang sangat umum: server block pertama menangani HTTP dan melakukan redirect ke HTTPS, server block kedua menangani HTTPS:
# Redirect semua HTTP ke HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
# Handle HTTPS
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
$host adalah variabel bawaan Nginx yang berisi nilai header Host dari request, dan $request_uri adalah path beserta query string. Keduanya akan dibahas lebih detail di artikel Variabel Bawaan.
Bagaimana Nginx Memilih Server Block #
Proses seleksi server block oleh Nginx berjalan dalam dua tahap:
Tahap 1: Cocokkan berdasarkan listen (IP:port)
→ Nginx kumpulkan semua server block yang listen di port yang sesuai
Tahap 2: Dari hasil tahap 1, cocokkan berdasarkan server_name
→ Cocokkan header Host dari request
→ Gunakan urutan prioritas pencocokan
→ Jika tidak ada yang cocok, gunakan default_server
Contoh:
Request: GET / HTTP/1.1
Host: blog.example.com
(masuk ke port 80)
Tahap 1: Kumpulkan semua server block yang listen 80
Tahap 2: Cari server_name yang cocok dengan "blog.example.com"
→ Temukan server block dengan server_name blog.example.com
→ Gunakan server block itu
Ringkasan #
- Server block mendefinisikan satu virtual host — satu entitas yang menangani request untuk domain dan port tertentu.
listenmenentukan port (dan opsional IP);server_namemenentukan domain yang dilayani.- Urutan prioritas
server_name: exact match → wildcard awal → wildcard akhir → regex → default.default_servermenangani request yang tidak cocok server_name manapun — tandai secara eksplisit dan return 444 untuk keamanan.- Untuk redirect HTTP→HTTPS: gunakan dua server block terpisah, satu di port 80 dengan
return 301, satu di port 443 dengan SSL.
← Sebelumnya: Directive & Context Berikutnya: Location Block →