Cara Mengkonfigurasi Nginx untuk Mendengarkan di Beberapa Port
Nginx dapat mendengarkan pada beberapa port secara bersamaan dengan menambahkan beberapa direktif `listen` di dalam satu atau lebih blok `server` dalam konfigurasinya. Setiap direktif `listen` mengikat Nginx ke kombinasi IP/port tertentu, memungkinkan satu instance server menangani lalu lintas HTTP, HTTPS, dan aplikasi kustom pada port yang berbeda tanpa menjalankan proses terpisah.
Kemampuan ini sangat penting untuk lingkungan multi-tenant, pemisahan port staging/produksi, arsitektur reverse proxy, dan perutean microservice — semuanya dari satu instance VPS Hosting.
Prasyarat
Sebelum melanjutkan, konfirmasikan hal-hal berikut:
- Nginx telah terinstal dan layanannya aktif (`systemctl status nginx`)
- Anda memiliki hak akses `root` atau `sudo` pada server
- Anda memahami perbedaan antara `/etc/nginx/nginx.conf` (konfigurasi global) dan `/etc/nginx/sites-available/` (blok konfigurasi per situs)
- Aturan firewall (`ufw`, `iptables`, atau security group cloud) mengizinkan lalu lintas pada port yang ingin Anda buka
- Sertifikat SSL yang valid tersedia jika mengonfigurasi port HTTPS (self-signed atau diterbitkan oleh CA)
Arsitektur Konfigurasi Nginx: Yang Perlu Anda Ketahui Terlebih Dahulu
Nginx menggunakan model konfigurasi hierarkis: konteks `http` berisi satu atau lebih blok `server`, yang masing-masing dapat berisi satu atau lebih direktif `listen`. Memahami hierarki ini mencegah kesalahan konfigurasi yang paling umum terjadi.
Direktif utama yang terlibat:
- `listen [address:]port [ssl] [http2] [default_server]` — mengikat blok server ke port tertentu dan IP opsional
- `server_name` — mencocokkan header `Host` untuk merutekan permintaan ke blok yang tepat
- `default_server` — menentukan blok server mana yang menangani permintaan yang tidak cocok dengan `server_name` lainnya
Lokasi file konfigurasi berdasarkan distribusi:
| Distribusi | Konfigurasi Utama | Konfigurasi Situs |
|---|
| — | — | — |
|---|
| Ubuntu / Debian | `/etc/nginx/nginx.conf` | `/etc/nginx/sites-available/` |
|---|
| CentOS / RHEL / AlmaLinux | `/etc/nginx/nginx.conf` | `/etc/nginx/conf.d/` |
|---|
| Arch Linux | `/etc/nginx/nginx.conf` | `/etc/nginx/sites-available/` |
|---|
| Docker (image resmi) | `/etc/nginx/nginx.conf` | `/etc/nginx/conf.d/` |
|---|
Pada sistem berbasis Debian, file di `sites-available/` harus di-symlink ke `sites-enabled/` agar berlaku:
“`bash
sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/
“`
Langkah 1: Buka File Konfigurasi Nginx
Untuk perubahan global yang memengaruhi semua virtual host:
“`bash
sudo nano /etc/nginx/nginx.conf
“`
Untuk konfigurasi spesifik situs (direkomendasikan untuk produksi):
“`bash
sudo nano /etc/nginx/sites-available/example.conf
“`
Penggunaan file spesifik situs sangat dianjurkan. Ini mengisolasi perubahan, menyederhanakan rollback, dan mencegah satu kesalahan konfigurasi mematikan semua layanan yang dihosting.
Langkah 2: Konfigurasikan Beberapa Direktif listen dalam Satu Blok Server
Pengaturan multi-port paling sederhana mengikat satu blok server ke beberapa port. Nginx akan menerapkan logika perutean yang identik terlepas dari port mana yang digunakan klien untuk terhubung.
“`nginx
server {
listen 80;
listen 8080;
server_name example.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example_access.log;
error_log /var/log/nginx/example_error.log warn;
}
“`
Yang dilakukan ini:
- `listen 80;` — menerima lalu lintas HTTP standar
- `listen 8080;` — menerima lalu lintas pada port HTTP alternatif (umum untuk lingkungan pengembangan, API internal, atau pemeriksaan kesehatan load balancer)
- Kedua port menyajikan konten yang identik dari `/var/www/html`
Kasus khusus — mengikat ke alamat IP tertentu: Pada server dengan beberapa antarmuka jaringan (misalnya, IP publik dan IP LAN privat), Anda dapat membatasi antarmuka mana yang didengarkan Nginx:
“`nginx
listen 192.168.1.10:8080;
listen 0.0.0.0:80;
“`
Ini sangat penting dalam konfigurasi server multi-homed untuk mencegah paparan publik yang tidak disengaja dari layanan internal.
Langkah 3: Konfigurasikan HTTPS pada Beberapa Port
HTTPS memerlukan parameter `ssl` pada direktif `listen` dan jalur sertifikat/kunci yang valid. Contoh berikut mengikat HTTPS ke port standar 443 dan port kustom 8443:
“`nginx
server {
listen 443 ssl;
listen 8443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
Modern TLS hardening
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
“`
Mengapa port 8443 umum digunakan:
- Memungkinkan lalu lintas HTTPS di lingkungan di mana port 443 diblokir oleh firewall upstream
- Digunakan dalam pengembangan/staging untuk menjalankan server aman tanpa konflik dengan layanan produksi pada port 443
- Diperlukan oleh beberapa framework aplikasi (Tomcat, proxy Node.js) yang mengekspos HTTPS pada port non-standar
Jebakan kritis: Menghilangkan `ssl_protocols` dan `ssl_ciphers` membuat Nginx menggunakan default yang berpotensi lemah. Selalu definisikan parameter TLS secara eksplisit, terutama pada server yang menangani data sensitif. Jika Anda membutuhkan sertifikat tepercaya daripada sertifikat self-signed, SSL Certificates dari CA yang diakui menghilangkan peringatan browser dan memenuhi persyaratan HSTS modern.
Langkah 4: Sajikan Konten Berbeda pada Port yang Berbeda
Ketika port harus melayani aplikasi yang berbeda — misalnya, situs web publik pada port 80 dan panel admin internal pada port 8080 — gunakan blok `server` terpisah:
“`nginx
server {
listen 80;
server_name example.com;
root /var/www/public;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 8080;
server_name example.com;
root /var/www/admin;
index index.html;
Restrict admin panel to internal network only
location / {
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
try_files $uri $uri/ =404;
}
}
“`
Kasus penggunaan nyata untuk pemisahan konten berbasis port:
- Port 80/443: Situs web yang menghadap publik
- Port 8080: REST API internal atau endpoint microservice
- Port 8443: Dashboard admin aman yang dibatasi oleh daftar izin IP
- Port 9000: Endpoint metrik untuk scraping Prometheus (tidak pernah diekspos secara publik)
- Port 3000/5000: Reverse proxy ke aplikasi Node.js atau Python
Langkah 5: Menggunakan Nginx sebagai Reverse Proxy pada Beberapa Port
Pola produksi yang umum adalah menggunakan Nginx untuk mem-proxy port yang berbeda ke server aplikasi backend yang berbeda:
“`nginx
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
server {
listen 8080;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:4000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
“`
Pola ini merupakan tulang punggung deployment terkontainerisasi pada Dedicated Server di mana beberapa container Docker berjalan pada port internal yang berbeda dan Nginx bertindak sebagai titik masuk eksternal tunggal.
Langkah 6: Validasi Konfigurasi
Jangan pernah me-restart Nginx tanpa terlebih dahulu menguji sintaks konfigurasi. Kesalahan sintaks akan menyebabkan layanan gagal dimuat ulang, sehingga mematikan semua situs yang dihosting.
“`bash
sudo nginx -t
“`
Output yang diharapkan jika berhasil:
“`
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
“`
Jika terdapat kesalahan, output akan menentukan file dan nomor baris. Perbaiki semua masalah yang dilaporkan sebelum melanjutkan.
Untuk reload tanpa downtime (lebih disukai daripada restart penuh dalam produksi):
“`bash
sudo systemctl reload nginx
“`
Restart penuh hanya diperlukan saat mengubah `worker_processes`, `user`, atau direktif tingkat master-process lainnya:
“`bash
sudo systemctl restart nginx
“`
Langkah 7: Verifikasi Nginx Mendengarkan pada Port yang Benar
Setelah menerapkan konfigurasi, konfirmasikan bahwa Nginx telah terikat ke port yang diharapkan menggunakan `ss` (lebih disukai daripada `netstat` yang sudah usang):
“`bash
sudo ss -tlnp | grep nginx
“`
Contoh output:
“`
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=1234,fd=7))
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=8))
LISTEN 0 511 0.0.0.0:8443 0.0.0.0:* users:(("nginx",pid=1234,fd=9))
“`
Jika sebuah port tidak muncul, periksa:
- Sintaks direktif `listen` dalam file konfigurasi
- Apakah proses lain sudah menggunakan port tersebut: `sudo ss -tlnp | grep :8080`
- Apakah `nginx -t` berhasil tanpa kesalahan
- Kebijakan SELinux atau AppArmor yang mungkin memblokir pengikatan port non-standar
Pengujian dengan curl dari command line (lebih andal daripada browser untuk debugging):
“`bash
curl -I http://example.com
curl -I http://example.com:8080
curl -Ik https://example.com
curl -Ik https://example.com:8443
“`
Flag `-I` hanya mengambil header. Respons `200 OK` atau `301 Moved Permanently` mengonfirmasi bahwa port aktif dan Nginx merespons dengan benar.
Langkah 8: Buka Port Firewall
Mendengarkan pada port di Nginx tidak cukup jika firewall host memblokir koneksi masuk. Pastikan port-port tersebut diizinkan:
UFW (Ubuntu/Debian):
“`bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 8443/tcp
sudo ufw reload
“`
firewalld (CentOS/RHEL/AlmaLinux):
“`bash
sudo firewall-cmd –permanent –add-port=8080/tcp
sudo firewall-cmd –permanent –add-port=8443/tcp
sudo firewall-cmd –reload
“`
iptables (langsung):
“`bash
sudo iptables -A INPUT -p tcp –dport 8080 -j ACCEPT
sudo iptables -A INPUT -p tcp –dport 8443 -j ACCEPT
“`
Pada infrastruktur cloud (AWS EC2, DigitalOcean, Hetzner), Anda juga harus memperbarui security group atau aturan firewall cloud di tingkat penyedia — perubahan firewall tingkat host saja tidak cukup.
Perbandingan: Konfigurasi Nginx Single-Port vs. Multi-Port
| Fitur | Single Port | Beberapa Port (Blok yang Sama) | Beberapa Port (Blok Terpisah) |
|---|
| — | — | — | — |
|---|
| Kompleksitas konfigurasi | Rendah | Rendah | Sedang |
|---|
| Isolasi konten | Tidak ada | Tidak ada | Penuh |
|---|
| Kontrol akses per port | Tidak berlaku | Tidak memungkinkan | Didukung penuh |
|---|
| Kasus penggunaan | Situs web sederhana | Mirror dev/staging | Microservice, panel admin |
|---|
| Reverse proxy per port | Upstream tunggal | Upstream tunggal | Upstream independen |
|---|
| Terminasi SSL | Per blok | Sertifikat bersama | Sertifikat independen per blok |
|---|
| Pemisahan log | Log tunggal | Log tunggal | File log per port |
|---|
Jebakan Umum dan Cara Menghindarinya
Konflik port dengan layanan yang ada: Port 80 mungkin sudah digunakan oleh Apache. Jalankan `sudo ss -tlnp | grep :80` sebelum mengonfigurasi. Hentikan layanan yang berkonflik atau konfigurasikan ulang untuk menggunakan port yang berbeda.
Konflik `default_server`: Jika beberapa blok server menghilangkan `default_server` atau beberapa blok mengklaimnya untuk port yang sama, Nginx akan menggunakan blok pertama dalam urutan file. Jadilah eksplisit:
“`nginx
listen 80 default_server;
“`
IPv6 tidak tercakup: Menambahkan `listen 80;` hanya mengikat ke IPv4. Untuk server dual-stack, tambahkan:
“`nginx
listen [::]:80;
listen [::]:8080;
“`
SELinux memblokir port non-standar: Pada RHEL/CentOS dengan SELinux enforcing, Nginx tidak dapat mengikat ke port yang tidak ada dalam kebijakannya tanpa izin eksplisit:
“`bash
sudo semanage port -a -t http_port_t -p tcp 8080
sudo semanage port -a -t http_port_t -p tcp 8443
“`
Lupa melakukan reload setelah perubahan: Pengeditan konfigurasi tidak akan berlaku sampai Nginx dimuat ulang. Otomatiskan ini dalam pipeline CI/CD dengan langkah `nginx -t && systemctl reload nginx` pasca-deploy.
Matriks Keputusan Praktis
Gunakan daftar periksa ini untuk menentukan pola konfigurasi multi-port yang tepat untuk skenario Anda:
- Konten yang sama, beberapa port — Gunakan beberapa direktif `listen` dalam satu blok `server`
- Konten berbeda per port — Gunakan blok `server` terpisah dengan direktori `root` yang berbeda
- Aplikasi backend berbeda per port — Gunakan blok `server` terpisah dengan `proxy_pass` yang mengarah ke alamat upstream yang berbeda
- Mengamankan port non-standar — Tambahkan `ssl` ke direktif `listen` dan referensikan jalur sertifikat Anda; pastikan SAN sertifikat mencakup domain tersebut
- Membatasi port ke lalu lintas internal — Tambahkan direktif `allow`/`deny` atau ikat `listen` hanya ke IP privat
- Berjalan pada VPS dengan cPanel — Verifikasi bahwa konfigurasi Apache/Nginx bawaan cPanel tidak berkonflik; gunakan "Include Editor" cPanel atau direktori drop-in konfigurasi Nginx khusus
- Mengelola beberapa opsi control panel — Tinjau VPS Control Panels yang tersedia untuk menemukan yang mengekspos manajemen port Nginx melalui GUI
FAQ
Bisakah Nginx mendengarkan pada port yang sama di beberapa blok server?
Ya. Beberapa blok `server` dapat berbagi port yang sama. Nginx membedakan di antara mereka menggunakan direktif `server_name`, yang mencocokkan header HTTP `Host`. Jika tidak ada `server_name` yang cocok, blok `default_server` yang menangani permintaan tersebut.
Apakah menambahkan lebih banyak port listen memengaruhi performa Nginx?
Overhead-nya dapat diabaikan. Setiap direktif `listen` menambahkan file descriptor ke proses master Nginx. Batas praktisnya adalah batas file descriptor yang terbuka pada sistem (`ulimit -n`), bukan jumlah port. Untuk deployment dengan lalu lintas tinggi, sesuaikan `worker_rlimit_nofile` dan `worker_connections` di `nginx.conf`.
Bagaimana cara mengalihkan semua lalu lintas dari port 8080 ke port 80?
Gunakan blok server khusus dengan direktif `return`:
“`nginx
server {
listen 8080;
server_name example.com;
return 301 http://example.com$request_uri;
}
“`
Mengapa Nginx tidak mendengarkan pada port meskipun konfigurasinya terlihat benar?
Empat penyebab paling umum adalah: (1) konfigurasi tidak dimuat ulang setelah diedit, (2) proses lain sudah terikat ke port tersebut, (3) aturan firewall memblokir port, atau (4) SELinux/AppArmor mencegah pengikatan. Selesaikan setiap penyebab secara sistematis menggunakan `ss -tlnp`, `nginx -t`, dan perintah status firewall.
Bisakah saya menggunakan sertifikat SSL yang berbeda untuk port HTTPS yang berbeda pada domain yang sama?
Ya. Setiap blok `server` memiliki direktif `ssl_certificate` dan `ssl_certificate_key` sendiri. Dua blok server dapat mendengarkan pada port 443 dan 8443 masing-masing dan mereferensikan file sertifikat yang sepenuhnya berbeda, bahkan untuk `server_name` yang sama. Ini berguna saat merotasi sertifikat atau menjalankan sertifikat lama bersama yang baru selama periode transisi.
