Server Block

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.
  • listen menentukan port (dan opsional IP); server_name menentukan domain yang dilayani.
  • Urutan prioritas server_name: exact match → wildcard awal → wildcard akhir → regex → default.
  • default_server menangani 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 →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact