<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://noctkj.net/index.php?action=history&amp;feed=atom&amp;title=Linux_%3A_Nginx_Dasar_dan_Virtual_Host</id>
	<title>Linux : Nginx Dasar dan Virtual Host - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://noctkj.net/index.php?action=history&amp;feed=atom&amp;title=Linux_%3A_Nginx_Dasar_dan_Virtual_Host"/>
	<link rel="alternate" type="text/html" href="https://noctkj.net/index.php?title=Linux_:_Nginx_Dasar_dan_Virtual_Host&amp;action=history"/>
	<updated>2026-11-08T10:28:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://noctkj.net/index.php?title=Linux_:_Nginx_Dasar_dan_Virtual_Host&amp;diff=1714&amp;oldid=prev</id>
		<title>Maintenance script: Protected &quot;Linux : Nginx Dasar dan Virtual Host&quot;: Proteksi editorial: edit/move sysop ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://noctkj.net/index.php?title=Linux_:_Nginx_Dasar_dan_Virtual_Host&amp;diff=1714&amp;oldid=prev"/>
		<updated>2026-11-08T00:03:32Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/index.php/Linux_:_Nginx_Dasar_dan_Virtual_Host&quot; title=&quot;Linux : Nginx Dasar dan Virtual Host&quot;&gt;Linux : Nginx Dasar dan Virtual Host&lt;/a&gt;&amp;quot;: Proteksi editorial: edit/move sysop ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:03, 8 November 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://noctkj.net/index.php?title=Linux_:_Nginx_Dasar_dan_Virtual_Host&amp;diff=1713&amp;oldid=prev</id>
		<title>Maintenance script: Artikel baru: Nginx dasar dan virtual host (konsep tiga lapis pemilihan situs)</title>
		<link rel="alternate" type="text/html" href="https://noctkj.net/index.php?title=Linux_:_Nginx_Dasar_dan_Virtual_Host&amp;diff=1713&amp;oldid=prev"/>
		<updated>2026-11-08T00:03:23Z</updated>

		<summary type="html">&lt;p&gt;Artikel baru: Nginx dasar dan virtual host (konsep tiga lapis pemilihan situs)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 🎯 Tujuan ==&lt;br /&gt;
Setelah membaca artikel ini, kamu bisa menjelaskan &amp;#039;&amp;#039;&amp;#039;bagaimana Nginx memilih situs yang menjawab sebuah permintaan&amp;#039;&amp;#039;&amp;#039;, membuat dua situs berbeda di satu alamat IP, dan tahu di lapis mana masalah &amp;quot;yang muncul malah situs lain&amp;quot; sebenarnya terjadi.&lt;br /&gt;
&lt;br /&gt;
Artikel ini bukan panduan instalasi. Kalau kamu baru pertama kali memasang Nginx, mulai dari halaman [[Debian : Konfigurasi Web Server (Nginx)]]. Di sini kita membedah &amp;#039;&amp;#039;&amp;#039;proses keputusan&amp;#039;&amp;#039;&amp;#039; di balik layar.&lt;br /&gt;
&lt;br /&gt;
== 📍 Konteks nyata ==&lt;br /&gt;
Bayangkan satu gedung dengan satu alamat. Tamu datang ke resepsionis, menyebut nama yang dituju, lalu diarahkan ke lantai yang tepat.&lt;br /&gt;
&lt;br /&gt;
Nginx bekerja seperti resepsionis itu. Alamat gedungnya adalah &amp;#039;&amp;#039;&amp;#039;IP dan port&amp;#039;&amp;#039;&amp;#039;, nama yang disebut tamu adalah &amp;#039;&amp;#039;&amp;#039;header &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;, dan lantai tujuan adalah &amp;#039;&amp;#039;&amp;#039;server block&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* 🔥 &amp;#039;&amp;#039;&amp;#039;Kasus nyata:&amp;#039;&amp;#039;&amp;#039; Sebuah SMK menggabungkan wiki, aplikasi ujian, dan situs profil sekolah di satu server. Saat &amp;quot;merapikan folder&amp;quot;, seorang teknisi menghapus symlink di &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/&amp;lt;/code&amp;gt;. Ketiga domain langsung menampilkan halaman default Nginx selama dua hari, dan panitia menuduh DNS sekolah rusak. Penyebab sebenarnya ketahuan dalam 10 detik lewat &amp;lt;code&amp;gt;nginx -T&amp;lt;/code&amp;gt;: konfigurasi yang dipakai Nginx memang tidak lagi memuat ketiga server block itu.&lt;br /&gt;
&lt;br /&gt;
== 🧠 Konsep singkat ==&lt;br /&gt;
Nginx bukan program yang menyalakan satu utas (thread) untuk setiap pengunjung. Ada satu proses &amp;#039;&amp;#039;&amp;#039;master&amp;#039;&amp;#039;&amp;#039; yang membaca konfigurasi, lalu beberapa proses &amp;#039;&amp;#039;&amp;#039;worker&amp;#039;&amp;#039;&amp;#039; yang melayani koneksi.&lt;br /&gt;
&lt;br /&gt;
Karena worker bekerja dengan model event, satu worker bisa menangani ribuan koneksi yang menunggu tanpa kehabisan utas. Analoginya: satu pramuniaga yang melayani banyak meja sekaligus, bukan satu pramuniaga yang berdiri diam di tiap meja.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Tiga lapis keputusan ===&lt;br /&gt;
Setiap permintaan HTTP melewati tiga pintu berurutan. Kalau satu pintu salah, gejala yang muncul bisa terlihat seperti masalah di pintu lain.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Lapis !! Yang dibaca !! Gejala kalau salah&lt;br /&gt;
|-&lt;br /&gt;
| Soket || alamat IP dan port di &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt; || koneksi ditolak, atau situs lain yang menjawab&lt;br /&gt;
|-&lt;br /&gt;
| Nama || header &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt; lawan &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt; || muncul situs default, bukan situs yang dituju&lt;br /&gt;
|-&lt;br /&gt;
| Path || URI lawan &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; || 404, 403, atau file dari folder yang salah&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aturan praktisnya: &amp;#039;&amp;#039;&amp;#039;buktikan lapis pertama dulu&amp;#039;&amp;#039;&amp;#039;, jangan langsung mengubah isi halaman. Situs yang &amp;quot;salah tampil&amp;quot; hampir tidak pernah disebabkan oleh file HTML-nya.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Virtual host adalah server block ===&lt;br /&gt;
Satu blok &amp;lt;code&amp;gt;server { ... }&amp;lt;/code&amp;gt; mewakili satu situs. Di dalamnya ada &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt;, dan aturan lain seperti &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; serta &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ada dua cara memisahkan situs:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Berbasis IP&amp;#039;&amp;#039;&amp;#039; — tiap situs punya alamat IP sendiri. Boros, karena IP publik terbatas.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Berbasis nama&amp;#039;&amp;#039;&amp;#039; — semua situs berbagi satu IP, dibedakan dari header &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt;. Inilah cara kerja hampir semua hosting.&lt;br /&gt;
&lt;br /&gt;
* 📊 &amp;#039;&amp;#039;&amp;#039;Angka penting:&amp;#039;&amp;#039;&amp;#039; Satu IP publik bisa melayani ratusan nama domain. Yang membedakan hanya header &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt;, satu baris teks yang dikirim browser di setiap permintaan.&lt;br /&gt;
&lt;br /&gt;
Untuk HTTPS, nama domain dibaca lebih awal lagi: saat &amp;#039;&amp;#039;&amp;#039;handshake TLS&amp;#039;&amp;#039;&amp;#039; lewat SNI, sebelum header HTTP dikirim. Karena itu sertifikat bisa dipilih per situs walau IP-nya sama.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 default_server milik port, bukan nama ===&lt;br /&gt;
Ini sumber kebingungan paling sering. Dokumentasi resmi Nginx menyebut tegas: *default server adalah properti dari port &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt;, bukan properti &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt;*.&lt;br /&gt;
&lt;br /&gt;
Artinya:&lt;br /&gt;
&lt;br /&gt;
* Kalau tidak ada &amp;lt;code&amp;gt;default_server&amp;lt;/code&amp;gt;, blok &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;pertama&amp;#039;&amp;#039;&amp;#039; pada port itu yang jadi default.&lt;br /&gt;
* Kalau header &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt; tidak cocok dengan nama mana pun, permintaan jatuh ke default server.&lt;br /&gt;
* &amp;lt;code&amp;gt;server_name _;&amp;lt;/code&amp;gt; yang sering ditempel dari internet &amp;#039;&amp;#039;&amp;#039;bukan wildcard&amp;#039;&amp;#039;&amp;#039;. Itu cuma nama domain tidak valid yang tidak akan pernah cocok dengan nama asli.&lt;br /&gt;
&lt;br /&gt;
Catch-all yang benar adalah menggabungkan keduanya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 8080 default_server;&lt;br /&gt;
    server_name _;&lt;br /&gt;
    return 444;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kode 444 adalah kode non-standar milik Nginx: koneksi ditutup tanpa jawaban sama sekali. Fungsinya menolak permintaan yang datang langsung ke IP tanpa nama domain yang sah.&lt;br /&gt;
&lt;br /&gt;
* ⚠️ &amp;#039;&amp;#039;&amp;#039;Hati-hati:&amp;#039;&amp;#039;&amp;#039; Dua blok dengan &amp;lt;code&amp;gt;default_server&amp;lt;/code&amp;gt; di port yang sama membuat Nginx menolak start dengan pesan &amp;lt;code&amp;gt;duplicate default server&amp;lt;/code&amp;gt;. Tidak ada yang menang diam-diam, konfigurasinya memang batal dimuat.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Urutan pencocokan server_name ===&lt;br /&gt;
Kalau ada beberapa nama di port yang sama, Nginx mencari dengan urutan prioritas berikut, dan berhenti pada yang pertama cocok:&lt;br /&gt;
&lt;br /&gt;
# Nama persis, misalnya &amp;lt;code&amp;gt;wiki.lab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Wildcard berawalan bintang paling panjang, misalnya &amp;lt;code&amp;gt;*.lab&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Wildcard berakhiran bintang paling panjang, misalnya &amp;lt;code&amp;gt;mail.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Regex pertama yang cocok, sesuai urutan di file.&lt;br /&gt;
&lt;br /&gt;
Nama persis disimpan di tabel hash, jadi pencariannya cepat. Regex dicek satu per satu, sehingga paling lambat dan tidak skalabel untuk jumlah nama besar.&lt;br /&gt;
&lt;br /&gt;
* 📊 &amp;#039;&amp;#039;&amp;#039;Angka penting:&amp;#039;&amp;#039;&amp;#039; Kalau nama domain terlalu panjang untuk tabel hash bawaan, Nginx menolak start dengan pesan &amp;lt;code&amp;gt;could not build server_names_hash, you should increase server_names_hash_bucket_size: 32&amp;lt;/code&amp;gt;. Solusinya menaikkan nilai itu ke pangkat dua berikutnya, misalnya 64.&lt;br /&gt;
&lt;br /&gt;
Nama yang ditulis dua kali tidak membuat Nginx gagal start. Ia hanya memberi peringatan &amp;lt;code&amp;gt;conflicting server name &amp;quot;...&amp;quot;, ignored&amp;lt;/code&amp;gt; dan memakai yang pertama. Sisa bloknya jadi konfigurasi mati yang menipu saat dibaca.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Urutan pencocokan location ===&lt;br /&gt;
Setelah server block terpilih, Nginx memilih &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; untuk URI-nya. Aturannya berlapis, bukan dari atas ke bawah:&lt;br /&gt;
&lt;br /&gt;
# Cari semua prefix, ingat yang &amp;#039;&amp;#039;&amp;#039;paling panjang&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Kalau prefix terpanjang memakai &amp;lt;code&amp;gt;^~&amp;lt;/code&amp;gt;, regex tidak dicek sama sekali.&lt;br /&gt;
# Kalau tidak, regex dicek berurutan dan &amp;#039;&amp;#039;&amp;#039;yang pertama cocok menang&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Kalau tidak ada regex yang cocok, pakai prefix terpanjang tadi.&lt;br /&gt;
&lt;br /&gt;
Modifier &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; berarti harus sama persis dan pencarian langsung selesai. Inilah contoh resmi dari dokumentasi Nginx:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Permintaan !! Location yang menang&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;location = /&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/index.html&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;location /&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/documents/document.html&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;location /documents/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/images/1.gif&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;location ^~ /images/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/documents/1.jpg&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;location ~* \.(gif&amp;amp;#124;jpg&amp;amp;#124;jpeg)$&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Perhatikan baris terakhir: &amp;lt;code&amp;gt;/documents/1.jpg&amp;lt;/code&amp;gt; tetap masuk ke regex walau prefix &amp;lt;code&amp;gt;/documents/&amp;lt;/code&amp;gt; lebih spesifik. Itulah sebabnya urutan file tidak menentukan, dan sebabnya &amp;lt;code&amp;gt;^~&amp;lt;/code&amp;gt; ada: untuk mengunci sebuah folder agar tidak direbut regex.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 root dan alias bukan sinonim ===&lt;br /&gt;
&amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;menempelkan&amp;#039;&amp;#039;&amp;#039; URI ke path. &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;mengganti&amp;#039;&amp;#039;&amp;#039; bagian yang cocok.&lt;br /&gt;
&lt;br /&gt;
Dengan &amp;lt;code&amp;gt;root /data/w3;&amp;lt;/code&amp;gt; di dalam &amp;lt;code&amp;gt;location /i/&amp;lt;/code&amp;gt;, permintaan &amp;lt;code&amp;gt;/i/top.gif&amp;lt;/code&amp;gt; dilayani dari &amp;lt;code&amp;gt;/data/w3/i/top.gif&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dengan &amp;lt;code&amp;gt;alias /data/w3/images/;&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;location /i/&amp;lt;/code&amp;gt;, permintaan yang sama dilayani dari &amp;lt;code&amp;gt;/data/w3/images/top.gif&amp;lt;/code&amp;gt; — tanpa tambahan &amp;lt;code&amp;gt;i/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* ⚠️ &amp;#039;&amp;#039;&amp;#039;Hati-hati:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; bekerja sebagai penggantian teks. Kalau &amp;lt;code&amp;gt;location /i/&amp;lt;/code&amp;gt; dipasangkan &amp;lt;code&amp;gt;alias /data/w3/images&amp;lt;/code&amp;gt; tanpa garis miring penutup, hasilnya &amp;lt;code&amp;gt;/data/w3/images&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;top.gif&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;/data/w3/imagestop.gif&amp;lt;/code&amp;gt;. File tidak ada, halaman jadi 404, padahal folder dan filenya benar.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 index, try_files, dan satu putaran tambahan ===&lt;br /&gt;
Kalau URI berakhir dengan garis miring, Nginx mencari file indeks sesuai direktif &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;. Bila &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt; tidak ada tapi &amp;lt;code&amp;gt;index.php&amp;lt;/code&amp;gt; ada, Nginx melakukan &amp;#039;&amp;#039;&amp;#039;internal redirect&amp;#039;&amp;#039;&amp;#039; ke &amp;lt;code&amp;gt;/index.php&amp;lt;/code&amp;gt; lalu mencari location lagi dari awal.&lt;br /&gt;
&lt;br /&gt;
Karena itu satu permintaan bisa berpindah location. Kalau hasilnya aneh, ingat bahwa location kedua yang menentukan, bukan yang pertama.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;try_files&amp;lt;/code&amp;gt; memeriksa file berurutan dan memakai yang pertama ditemukan. Garis miring di akhir berarti memeriksa direktori, dan parameter terakhir adalah tujuan redirect internal atau kode error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
location / {&lt;br /&gt;
    try_files $uri $uri/ /index.html;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 🧩 Istilah penting ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Istilah !! Arti sederhana&lt;br /&gt;
|-&lt;br /&gt;
| Server block || Satu blok &amp;lt;code&amp;gt;server { }&amp;lt;/code&amp;gt; yang mewakili satu situs&lt;br /&gt;
|-&lt;br /&gt;
| Virtual host || Istilah umum untuk situs yang berbagi satu server fisik&lt;br /&gt;
|-&lt;br /&gt;
| Header &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt; || Nama domain yang diminta browser, dikirim di setiap permintaan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt; || Daftar nama yang dilayani sebuah server block&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;default_server&amp;lt;/code&amp;gt; || Situs penampung bila tidak ada nama yang cocok&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; || Aturan berdasarkan potongan URI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; || Folder dasar yang ditambahi URI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; || Path pengganti untuk location tertentu&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;try_files&amp;lt;/code&amp;gt; || Daftar kandidat file yang dicoba berurutan&lt;br /&gt;
|-&lt;br /&gt;
| SNI || Cara browser menyebut nama domain saat handshake TLS&lt;br /&gt;
|-&lt;br /&gt;
| Reload || Memuat ulang konfigurasi tanpa memutus koneksi yang sedang jalan&lt;br /&gt;
|-&lt;br /&gt;
| Upstream || Kumpulan server aplikasi di belakang Nginx&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 🔧 Praktik: dua situs di satu server ==&lt;br /&gt;
Lab ini memakai port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt; supaya tidak bentrok dengan web server lain yang mungkin sudah memakai port 80 di komputermu.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 1: potret keadaan awal ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
nginx -v&lt;br /&gt;
ss -lntp | grep -E &amp;#039;:80|:8080&amp;#039;&lt;br /&gt;
sudo nginx -T &amp;gt; /tmp/nginx-awal.txt&lt;br /&gt;
wc -l /tmp/nginx-awal.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nginx -T&amp;lt;/code&amp;gt; mencetak konfigurasi gabungan yang benar-benar dipakai, termasuk hasil &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt;. Simpan potret ini; nanti kita bandingkan setelah menambah situs.&lt;br /&gt;
&lt;br /&gt;
* 🧪 &amp;#039;&amp;#039;&amp;#039;Uji cepat:&amp;#039;&amp;#039;&amp;#039; Kalau &amp;lt;code&amp;gt;nginx -T&amp;lt;/code&amp;gt; gagal, jangan lanjut. Perbaikkan dulu error yang disebutkan, karena semua langkah berikutnya bergantung pada konfigurasi yang valid.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 2: siapkan dua web root ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /srv/www/wiki.lab /srv/www/ujian.lab&lt;br /&gt;
printf &amp;#039;WIKI TKJ\n&amp;#039;  | sudo tee /srv/www/wiki.lab/index.html&lt;br /&gt;
printf &amp;#039;UJIAN ONLINE\n&amp;#039; | sudo tee /srv/www/ujian.lab/index.html&lt;br /&gt;
sudo chown -R www-data:www-data /srv/www&lt;br /&gt;
sudo chmod 755 /srv/www /srv/www/wiki.lab /srv/www/ujian.lab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dua folder, dua isi berbeda. Ini penting: kalau isinya sama, kamu tidak bisa membuktikan situs mana yang menjawab.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 3: tulis dua server block ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 8080;&lt;br /&gt;
    server_name wiki.lab;&lt;br /&gt;
&lt;br /&gt;
    root /srv/www/wiki.lab;&lt;br /&gt;
    index index.html;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/wiki.access.log;&lt;br /&gt;
    error_log  /var/log/nginx/wiki.error.log;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
    listen 8080;&lt;br /&gt;
    server_name ujian.lab;&lt;br /&gt;
&lt;br /&gt;
    root /srv/www/ujian.lab;&lt;br /&gt;
    index index.html;&lt;br /&gt;
&lt;br /&gt;
    access_log /var/log/nginx/ujian.access.log;&lt;br /&gt;
    error_log  /var/log/nginx/ujian.error.log;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simpan sebagai &amp;lt;code&amp;gt;/etc/nginx/sites-available/wiki-lab.conf&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;/etc/nginx/sites-available/ujian-lab.conf&amp;lt;/code&amp;gt;. Pada paket Debian dan Ubuntu, folder &amp;lt;code&amp;gt;sites-available&amp;lt;/code&amp;gt; adalah gudang konfigurasi, sedangkan &amp;lt;code&amp;gt;sites-enabled&amp;lt;/code&amp;gt; adalah yang dibaca &amp;lt;code&amp;gt;nginx.conf&amp;lt;/code&amp;gt; lewat &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 4: aktifkan lewat symlink ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sudo ln -s /etc/nginx/sites-available/wiki-lab.conf  /etc/nginx/sites-enabled/&lt;br /&gt;
sudo ln -s /etc/nginx/sites-available/ujian-lab.conf /etc/nginx/sites-enabled/&lt;br /&gt;
sudo nginx -t&lt;br /&gt;
sudo systemctl reload nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;nginx -t&amp;lt;/code&amp;gt; menguji sintaks tanpa mengubah apa pun. &amp;lt;code&amp;gt;reload&amp;lt;/code&amp;gt; memuat konfigurasi baru dengan mulus: worker lama menyelesaikan permintaan yang sedang berjalan, worker baru memakai konfigurasi terkini.&lt;br /&gt;
&lt;br /&gt;
* 💡 &amp;#039;&amp;#039;&amp;#039;Tips:&amp;#039;&amp;#039;&amp;#039; Biasakan urutan &amp;lt;code&amp;gt;nginx -t&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;reload&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;restart&amp;lt;/code&amp;gt;. Restart memutus koneksi aktif dan tidak perlu untuk perubahan konfigurasi biasa.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 5: uji tanpa menyentuh DNS ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
curl -s http://127.0.0.1:8080/ -H &amp;quot;Host: wiki.lab&amp;quot;&lt;br /&gt;
curl -s http://127.0.0.1:8080/ -H &amp;quot;Host: ujian.lab&amp;quot;&lt;br /&gt;
curl -s -o /dev/null -w &amp;#039;%{http_code}\n&amp;#039; http://127.0.0.1:8080/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baris pertama harus mencetak &amp;lt;code&amp;gt;WIKI TKJ&amp;lt;/code&amp;gt;, baris kedua &amp;lt;code&amp;gt;UJIAN ONLINE&amp;lt;/code&amp;gt;. Perintah ketiga sengaja tanpa &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt; yang cocok, jadi ia jatuh ke default server — yaitu blok pertama pada port 8080.&lt;br /&gt;
&lt;br /&gt;
Kalau kamu ingin menguji seperti browser sungguhan tanpa mengubah &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;, pakai &amp;lt;code&amp;gt;--resolve&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
curl -s --resolve ujian.lab:8080:127.0.0.1 http://ujian.lab:8080/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 6: pasang penolak sebagai default ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 8080 default_server;&lt;br /&gt;
    server_name _;&lt;br /&gt;
    return 444;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simpan sebagai &amp;lt;code&amp;gt;sites-available/tolak-lab.conf&amp;lt;/code&amp;gt;, buat symlink, lalu uji ulang:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sudo ln -s /etc/nginx/sites-available/tolak-lab.conf /etc/nginx/sites-enabled/&lt;br /&gt;
sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx&lt;br /&gt;
curl -sv -H &amp;quot;Host: tidak-ada.lab&amp;quot; http://127.0.0.1:8080/ 2&amp;gt;&amp;amp;1 | tail -3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hasil yang diharapkan: koneksi ditutup tanpa balasan, dan &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; melaporkan &amp;lt;code&amp;gt;Empty reply from server&amp;lt;/code&amp;gt;. Permintaan ke &amp;lt;code&amp;gt;wiki.lab&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ujian.lab&amp;lt;/code&amp;gt; tetap normal karena namanya cocok persis.&lt;br /&gt;
&lt;br /&gt;
* 📊 &amp;#039;&amp;#039;&amp;#039;Angka penting:&amp;#039;&amp;#039;&amp;#039; Kode 444 tidak ada di standar HTTP. Browser hanya melihat koneksi terputus. Efek sampingnya: alat monitoring sederhana bisa melaporkan &amp;quot;server mati&amp;quot; padahal Nginx sehat dan sedang menolak.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 7: buktikan siapa yang menang di location ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 8081;&lt;br /&gt;
    server_name peta.lab;&lt;br /&gt;
    root /srv/www/peta.lab;&lt;br /&gt;
    default_type text/plain;&lt;br /&gt;
&lt;br /&gt;
    location = /            { return 200 &amp;quot;A-halaman-depan&amp;quot;; }&lt;br /&gt;
    location /              { return 200 &amp;quot;B-prefix-umum&amp;quot;; }&lt;br /&gt;
    location ^~ /gambar/    { return 200 &amp;quot;D-prefix-keras&amp;quot;; }&lt;br /&gt;
    location ~* \.(jpg|png)$ { return 200 &amp;quot;E-regex-gambar&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uji tiga URI berikut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
curl -s -H &amp;quot;Host: peta.lab&amp;quot; http://127.0.0.1:8081/&lt;br /&gt;
curl -s -H &amp;quot;Host: peta.lab&amp;quot; http://127.0.0.1:8081/gambar/logo.jpg&lt;br /&gt;
curl -s -H &amp;quot;Host: peta.lab&amp;quot; http://127.0.0.1:8081/dokumen/logo.jpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hasilnya berurutan: &amp;lt;code&amp;gt;A-halaman-depan&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D-prefix-keras&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;E-regex-gambar&amp;lt;/code&amp;gt;. Sekarang hapus tanda &amp;lt;code&amp;gt;^~&amp;lt;/code&amp;gt; dari blok gambar, reload, lalu ulangi permintaan kedua. Hasilnya berubah menjadi &amp;lt;code&amp;gt;E-regex-gambar&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Itu bukti bahwa regex mengalahkan prefix, kecuali prefix dikunci dengan &amp;lt;code&amp;gt;^~&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 8: buktikan root berbeda dari alias ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /srv/www/peta.lab/isi/r&lt;br /&gt;
printf &amp;#039;ROOT\n&amp;#039;  | sudo tee /srv/www/peta.lab/isi/r/top.txt&lt;br /&gt;
printf &amp;#039;ALIAS\n&amp;#039; | sudo tee /srv/www/peta.lab/isi/top.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tambahkan dua location ini ke server block tadi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
location /r/ { root  /srv/www/peta.lab/isi; }&lt;br /&gt;
location /a/ { alias /srv/www/peta.lab/isi/; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setelah reload, &amp;lt;code&amp;gt;/r/top.txt&amp;lt;/code&amp;gt; mencetak &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;/a/top.txt&amp;lt;/code&amp;gt; mencetak &amp;lt;code&amp;gt;ALIAS&amp;lt;/code&amp;gt;. Keduanya menunjuk folder yang sama, tapi aturan penggabungan path-nya berbeda.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 9: bersihkan lab ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
sudo rm -f /etc/nginx/sites-enabled/wiki-lab.conf \&lt;br /&gt;
           /etc/nginx/sites-enabled/ujian-lab.conf \&lt;br /&gt;
           /etc/nginx/sites-enabled/tolak-lab.conf \&lt;br /&gt;
           /etc/nginx/sites-enabled/peta-lab.conf&lt;br /&gt;
sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx&lt;br /&gt;
sudo nginx -T | grep -c &amp;quot;server_name wiki.lab&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Angka terakhir harus &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. Kalau masih &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, symlink lain masih menunjuk file yang sama dan situsnya belum benar-benar dilepas.&lt;br /&gt;
&lt;br /&gt;
== 🏭 Dipakai di dunia kerja ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Sekolah:&amp;#039;&amp;#039;&amp;#039; satu server untuk wiki, aplikasi ujian, dan situs profil. Server block memisahkan ketiganya tanpa perlu tiga IP publik atau tiga mesin.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kantor dan UMKM:&amp;#039;&amp;#039;&amp;#039; Nginx berdiri di depan aplikasi kasir atau absensi sebagai reverse proxy, sehingga aplikasi internal tidak diekspos langsung ke internet.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Hosting bersama:&amp;#039;&amp;#039;&amp;#039; ribuan domain berbagi satu IP, dibedakan lewat &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt;. Inilah alasan satu IP bisa melayani banyak pelanggan.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ISP dan warnet:&amp;#039;&amp;#039;&amp;#039; portal login, halaman status, dan billing sering berada di server yang sama dengan nama berbeda.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Industri dan e-commerce:&amp;#039;&amp;#039;&amp;#039; dua server block atau &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; berbobot dipakai untuk mengarahkan sebagian trafik ke versi baru sebelum dirilis penuh.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Operasional DevOps:&amp;#039;&amp;#039;&amp;#039; konfigurasi situs disimpan di git, diuji dengan &amp;lt;code&amp;gt;nginx -t&amp;lt;/code&amp;gt; di pipeline, lalu di-&amp;lt;code&amp;gt;reload&amp;lt;/code&amp;gt; tanpa memutus pengguna.&lt;br /&gt;
&lt;br /&gt;
== ✅ Verifikasi ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Perintah !! Hasil yang diharapkan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo nginx -t&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;syntax is ok&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;test is successful&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo nginx -T&amp;lt;/code&amp;gt; || konfigurasi gabungan memuat semua server block aktif&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ss -lntp &amp;amp;#124; grep 8080&amp;lt;/code&amp;gt; || ada proses &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; yang mendengarkan port itu&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curl -H &amp;quot;Host: wiki.lab&amp;quot;&amp;lt;/code&amp;gt; || isi situs wiki, bukan halaman default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; tanpa Host cocok || ditolak 444 atau masuk default server yang memang disengaja&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tail /var/log/nginx/wiki.access.log&amp;lt;/code&amp;gt; || baris permintaan uji tercatat di log situs yang benar&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo systemctl is-active nginx&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sudo nginx -T &amp;amp;#124; grep server_name&amp;lt;/code&amp;gt; || daftar nama sesuai rencana, tidak ada duplikat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ⚠️ Kesalahan umum &amp;amp; troubleshooting ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala atau pesan !! Artinya dan tindakan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;duplicate default server for 0.0.0.0:8080&amp;lt;/code&amp;gt; || ada dua &amp;lt;code&amp;gt;default_server&amp;lt;/code&amp;gt; di port sama; hapus salah satu&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;conflicting server name &amp;quot;...&amp;quot;, ignored&amp;lt;/code&amp;gt; || nama ditulis di dua blok; yang pertama menang, sisanya mati&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;open() &amp;quot;.../sites-enabled/x&amp;quot; failed (2: No such file)&amp;lt;/code&amp;gt; || symlink menunjuk file yang sudah dihapus; buat ulang atau hapus symlink&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bind() to 0.0.0.0:80 failed (98: Address already in use)&amp;lt;/code&amp;gt; || port dipakai Apache atau Nginx lain; cek dengan &amp;lt;code&amp;gt;ss -lntp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;directory index of &amp;quot;/srv/www/...&amp;quot; is forbidden&amp;lt;/code&amp;gt; || tidak ada file &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;autoindex&amp;lt;/code&amp;gt; mati; benar, bukan bug&lt;br /&gt;
|-&lt;br /&gt;
| 404 padahal file ada || &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; atau &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt; salah, sering karena garis miring penutup&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;413 Request Entity Too Large&amp;lt;/code&amp;gt; || unggahan melebihi &amp;lt;code&amp;gt;client_max_body_size&amp;lt;/code&amp;gt; bawaan 1 MB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;could not build server_names_hash&amp;lt;/code&amp;gt; || naikkan &amp;lt;code&amp;gt;server_names_hash_bucket_size&amp;lt;/code&amp;gt; ke pangkat dua berikutnya&lt;br /&gt;
|-&lt;br /&gt;
| reload sukses tapi situs tak berubah || file yang diedit tidak ter-&amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt;; buktikan dengan &amp;lt;code&amp;gt;nginx -T&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;unexpected end of file, expecting &amp;quot;}&amp;quot;&amp;lt;/code&amp;gt; || kurung kurawal tidak seimbang; cek blok yang terakhir diedit&lt;br /&gt;
|-&lt;br /&gt;
| 502 Bad Gateway || upstream mati atau alamatnya salah; ini lapis aplikasi, bukan lapis nama&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 🔐 Catatan keamanan &amp;amp; etika ==&lt;br /&gt;
* Jangan menaruh web root di dalam &amp;lt;code&amp;gt;/etc/nginx&amp;lt;/code&amp;gt;. Konfigurasi dan isi situs harus dipisah agar tidak ada file konfigurasi yang bisa diunduh.&lt;br /&gt;
* Jangan &amp;lt;code&amp;gt;chmod 777&amp;lt;/code&amp;gt; folder web. Cukup &amp;lt;code&amp;gt;755&amp;lt;/code&amp;gt; untuk folder dan &amp;lt;code&amp;gt;644&amp;lt;/code&amp;gt; untuk file, dengan pemilik &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Jangan simpan &amp;lt;code&amp;gt;.git&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backup.zip&amp;lt;/code&amp;gt;, atau dump database di web root. Nginx menyajikan file apa adanya, tanpa bertanya apakah itu rahasia.&lt;br /&gt;
* Matikan &amp;lt;code&amp;gt;autoindex&amp;lt;/code&amp;gt; kecuali untuk folder yang memang publik. Daftar file yang terbuka bisa membeberkan struktur internal.&lt;br /&gt;
* &amp;lt;code&amp;gt;server_tokens off;&amp;lt;/code&amp;gt; menyembunyikan nomor versi Nginx dari header balasan. Kecil, tapi mempersulit pemindaian otomatis.&lt;br /&gt;
* Perlakukan &amp;lt;code&amp;gt;nginx -T&amp;lt;/code&amp;gt; sebagai dokumen internal: isinya path, nama host, dan alamat upstream. Jangan tempel mentah-mentah ke grup chat.&lt;br /&gt;
* Uji konfigurasi di lab, bukan di server produksi. Satu &amp;lt;code&amp;gt;default_server&amp;lt;/code&amp;gt; ganda bisa membuat seluruh situs berhenti dimuat saat reload.&lt;br /&gt;
&lt;br /&gt;
== 📌 Kesimpulan ==&lt;br /&gt;
Nginx memilih situs lewat tiga lapis: port, nama, lalu path. Virtual host hanyalah nama lain dari server block, dan &amp;lt;code&amp;gt;default_server&amp;lt;/code&amp;gt; adalah milik port, bukan milik nama.&lt;br /&gt;
&lt;br /&gt;
Kalau ada yang salah tampil, periksa berurutan: apakah port benar, apakah &amp;lt;code&amp;gt;Host&amp;lt;/code&amp;gt; cocok dengan &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt;, baru apakah &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; menunjuk tempat yang tepat.&lt;br /&gt;
&lt;br /&gt;
Langkah berikutnya: tambahkan HTTPS pada salah satu situs, lalu jadikan Nginx reverse proxy di depan aplikasi. Di situ lapis keempat muncul — &amp;lt;code&amp;gt;upstream&amp;lt;/code&amp;gt; — dan cara berpikirnya tetap sama.&lt;br /&gt;
&lt;br /&gt;
== 🔗 Materi terkait ==&lt;br /&gt;
* [[Debian : Konfigurasi Web Server (Nginx)]] — instalasi dan perintah dasar Nginx&lt;br /&gt;
* [[Debian : Konfigurasi Web Server (Apache)]] — padanan konsep pada Apache&lt;br /&gt;
* [[Linux : Membuat Service Sendiri dengan systemd]] — mengelola layanan seperti Nginx&lt;br /&gt;
* [[Linux : Log dan journalctl untuk Troubleshooting]] — membaca log saat situs tidak muncul&lt;br /&gt;
* [[Linux : Firewall Dasar dengan nftables]] — membuka port 80 dan 443 dengan aman&lt;br /&gt;
* [[Linux : Manajemen User, Group, dan sudo]] — pemilik file dan izin web root&lt;br /&gt;
* [[Linux : Manajemen Paket dan Repositori Debian]] — asal paket Nginx yang kamu pasang&lt;br /&gt;
&lt;br /&gt;
== 📚 Referensi ==&lt;br /&gt;
* Nginx — *How nginx processes a request*: https://nginx.org/en/docs/http/request_processing.html&lt;br /&gt;
* Nginx — *Server names*: https://nginx.org/en/docs/http/server_names.html&lt;br /&gt;
* Nginx — *Module ngx_http_core_module* (direktif &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;location&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;alias&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;try_files&amp;lt;/code&amp;gt;): https://nginx.org/en/docs/http/ngx_http_core_module.html&lt;br /&gt;
* Nginx — *Module ngx_core_module* (&amp;lt;code&amp;gt;worker_processes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;worker_connections&amp;lt;/code&amp;gt;): https://nginx.org/en/docs/ngx_core_module.html&lt;br /&gt;
&lt;br /&gt;
[[Category:TKJ]]&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Server]]&lt;br /&gt;
[[Category:Nginx]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>