15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
09.10.2024

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:

DistribusiKonfigurasi UtamaKonfigurasi 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:

  1. Sintaks direktif `listen` dalam file konfigurasi
  2. Apakah proses lain sudah menggunakan port tersebut: `sudo ss -tlnp | grep :8080`
  3. Apakah `nginx -t` berhasil tanpa kesalahan
  4. 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

FiturSingle PortBeberapa Port (Blok yang Sama)Beberapa Port (Blok Terpisah)
Kompleksitas konfigurasiRendahRendahSedang
Isolasi kontenTidak adaTidak adaPenuh
Kontrol akses per portTidak berlakuTidak memungkinkanDidukung penuh
Kasus penggunaanSitus web sederhanaMirror dev/stagingMicroservice, panel admin
Reverse proxy per portUpstream tunggalUpstream tunggalUpstream independen
Terminasi SSLPer blokSertifikat bersamaSertifikat independen per blok
Pemisahan logLog tunggalLog tunggalFile 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.

15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai