Cara Mengatasi Nginx Gagal Start: Address Already in Use Port 80 di Ubuntu

Anda menjalankan sudo systemctl start nginx di VPS Ubuntu, tetapi Nginx menolak hidup. Di log muncul baris yang cukup jelas:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

Pesan ini bukan berarti konfigurasi Anda rusak. Artinya, port 80 — port standar untuk HTTP — sudah dipakai oleh proses lain, sehingga Nginx tidak bisa mengikatkan dirinya ke port itu. Satu port hanya bisa dipegang oleh satu proses dalam satu waktu. Tugas Anda bukan menebak-nebak, melainkan mencari tahu siapa pemegang port itu, lalu memutuskan: menghentikan pemegangnya, memindahkan Nginx, atau menjadikannya reverse proxy.

Jawaban Singkat

Cari pemegang port 80 dengan sudo ss -tlnp | grep :80, lalu baca nama proses dan PID-nya. Bila pemegangnya Apache yang tidak lagi dipakai, hentikan dan nonaktifkan Apache, lalu jalankan Nginx. Bila pemegangnya proses Nginx lama yang nyangkut, hentikan lewat systemd, bukan dengan membunuh PID secara membabi buta. Bila kedua layanan memang harus jalan bersamaan, pindahkan salah satunya ke port lain atau jadikan Nginx sebagai reverse proxy di depan layanan tersebut. Setelah port bebas, uji konfigurasi dengan sudo nginx -t sebelum menjalankan Nginx.

Persiapan dan Backup

  • Pastikan Anda masuk lewat SSH dengan pengguna yang punya hak sudo, dan jangan menutup sesi terminal sampai Nginx kembali berjalan.
  • Buat cadangan konfigurasi Nginx sebelum mengubah apa pun, supaya kesalahan edit bisa dikembalikan:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
sudo cp -r /etc/nginx/sites-available /etc/nginx/sites-available.bak
  • Baca dulu pesan kesalahan yang sebenarnya, jangan hanya mengandalkan "service failed". Jalankan:
sudo systemctl status nginx --no-pager
sudo journalctl -u nginx --no-pager -n 50
sudo tail -n 30 /var/log/nginx/error.log

Jika log memastikan baris bind() ... failed (98: Address already in use), Anda berada di jalur yang benar. Jika log justru menunjukkan kesalahan sintaks, perbaiki dulu dengan sudo nginx -t — itu masalah yang berbeda.

Langkah 1: Temukan Siapa yang Memegang Port 80

sudo ss -tlnp | grep :80

Perintah ini menampilkan proses yang sedang mendengarkan di port 80, lengkap dengan nama dan PID-nya. Alternatifnya, sudo lsof -i :80 memberikan informasi yang sama dalam format berbeda. Pelaku yang paling sering muncul ada empat: Apache (apache2) yang terinstal bersamaan dengan Nginx, proses Nginx lama yang tidak berhenti sempurna saat restart sebelumnya, container Docker yang memetakan port 80, atau layanan lain seperti panel hosting dan aplikasi Node.js yang kebetulan memakai port 80. Catat nama proses dan PID-nya sebelum melakukan apa pun — keputusan berikutnya bergantung pada identitas ini.

Langkah 2: Bila Pemegangnya Apache

Ini kasus paling umum di VPS yang pernah dipakai untuk instalasi LAMP sebelum beralih ke Nginx. Periksa dulu statusnya:

sudo systemctl status apache2

Jika Apache aktif tetapi tidak lagi melayani situs apa pun, hentikan dan cegah ia merebut port 80 lagi saat boot berikutnya:

sudo systemctl stop apache2
sudo systemctl disable apache2

Perhatian: jangan menghentikan Apache bila situs Anda masih berjalan di atasnya. Jika kedua web server dibutuhkan, lewati ke Langkah 4 (reverse proxy) alih-alih mematikan salah satunya. Setelah Apache berhenti, periksa kembali bahwa port 80 sudah kosong, lalu uji dan jalankan Nginx:

sudo ss -tlnp | grep :80
sudo nginx -t
sudo systemctl start nginx

Langkah 3: Bila Pemegangnya Nginx Lama atau Proses Nyangkut

Kadang pemegang port 80 justru Nginx itu sendiri: proses lama yang gagal berhenti saat restart, sehingga proses baru tidak bisa mengikat port yang sama. Coba hentikan lewat systemd terlebih dahulu, karena cara ini paling bersih:

sudo systemctl stop nginx
sudo ss -tlnp | grep :80
sudo systemctl start nginx

Hanya bila proses itu tetap bertahan setelah dihentikan lewat systemd, dan Anda sudah yakin dari hasil Langkah 1 bahwa proses itu memang Nginx lama atau proses yang tidak lagi dibutuhkan, Anda boleh menghentikannya berdasarkan PID. Perintah mematikan proses secara paksa berisiko menghilangkan pekerjaan yang sedang berjalan pada proses tersebut, jadi gunakan sebagai jalan terakhir, bukan langkah pertama:

sudo kill PID
sudo ss -tlnp | grep :80

Ganti PID dengan nomor yang Anda catat di Langkah 1. Hindari membunuh PID yang tidak Anda kenali: proses yang tidak dikenal bisa jadi layanan penting lain di server Anda.

Langkah 4: Bila Kedua Layanan Harus Tetap Jalan — Reverse Proxy

Jika Apache atau aplikasi lain harus tetap berjalan dan Nginx juga harus ada di port 80, jangan memaksa keduanya berebut port yang sama. Pindahkan layanan kedua ke port lain — misalnya 8080 — lalu letakkan Nginx di depan sebagai reverse proxy. Contoh server block Nginx-nya:

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Ganti example.com dengan domain Anda dan 8080 dengan port layanan di belakangnya. Setelah mengedit, selalu uji konfigurasi sebelum me-reload:

sudo nginx -t
sudo systemctl reload nginx

Perintah reload lebih aman daripada restart untuk server yang sudah berjalan, karena Nginx lama tetap melayani selama konfigurasi baru diperiksa.

Langkah 5: Perbaiki Konflik IPv4/IPv6 Bila Masih Gagal

Pada sebagian konfigurasi, hanya baris IPv6 yang gagal: bind() to [::]:80 failed sementara IPv4-nya baik-baik saja. Ini sering terjadi karena dua server block sama-sama mencoba mengikat IPv6 tanpa pengaturan yang eksplisit. Pisahkan keduanya secara tegas di server block Anda:

listen 80;
listen [::]:80 ipv6only=on;

Parameter ipv6only=on memastikan soket IPv6 hanya menangani koneksi IPv6, sementara IPv4 ditangani soketnya sendiri. Setelah mengubah, uji lagi dengan sudo nginx -t dan jalankan ulang Nginx. Periksa juga konfigurasi tersembunyi yang ikut mendengarkan port 80:

grep -rn "listen 80" /etc/nginx/sites-enabled/ /etc/nginx/conf.d/

Server block default yang terlupakan di sites-enabled adalah penyebab klasik yang membuat port 80 seolah-olah "sudah dipakai" padahal pelakunya adalah konfigurasi Anda sendiri.

Verifikasi Hasil

Nginx dinyatakan pulih bila tiga pemeriksaan ini lolos: sudo systemctl status nginx menunjukkan active (running), sudo ss -tlnp | grep :80 menunjukkan nginx sebagai pemegang port 80, dan situs Anda bisa dibuka lewat browser atau lewat perintah curl -I http://domain-anda/ yang mengembalikan status 200 atau redirect yang Anda harapkan. Jika Nginx berjalan tetapi situs masih tidak bisa dibuka, masalahnya sudah berpindah dari konflik port ke konfigurasi server block atau firewall — periksa sudo ufw status dan pastikan port 80 diizinkan, tanpa membuka port lain yang tidak diperlukan.

Troubleshooting Lanjutan

SituasiLangkah berikutnya
Port 80 kosong tetapi Nginx tetap gagal startJalankan sudo nginx -t; kemungkinan ada kesalahan sintaks, bukan konflik port
Apache kembali merebut port 80 setelah rebootPastikan sudo systemctl disable apache2 sudah dijalankan, bukan hanya stop
Container Docker memegang port 80Hentikan container itu atau ubah pemetaan portnya, misalnya ke 8080:80
Hanya [::]:80 yang gagalTambahkan ipv6only=on pada baris listen IPv6, atau nonaktifkan listen IPv6 bila tidak dipakai

FAQ

Apakah aman mematikan Apache untuk memberi jalan kepada Nginx?

Aman bila tidak ada situs yang masih dilayani Apache. Periksa dulu situs apa saja yang berjalan di server Anda; bila Apache masih melayani situs aktif, gunakan skema reverse proxy di Langkah 4, bukan mematikannya.

Apakah saya boleh memakai kill -9 pada PID pemegang port?

Hanya sebagai jalan terakhir dan hanya untuk PID yang sudah Anda identifikasi. Mematikan proses secara paksa bisa menghilangkan pekerjaan yang sedang berjalan pada proses itu. Selalu coba menghentikan lewat systemctl dulu.

Apakah mengubah port Nginx ke 8080 menyelesaikan masalah?

Bisa, tetapi pengunjung harus mengakses situs dengan :8080 di URL-nya, yang bukan perilaku standar web. Untuk situs produksi, lebih baik membebaskan port 80 atau memakai reverse proxy.

Kesimpulan

Address already in use bukan vonis untuk instalasi Nginx Anda, melainkan perebutan satu port oleh dua proses. Identifikasi pemegangnya, putuskan apakah ia harus dihentikan, dipindahkan, atau diletakkan di belakang reverse proxy, lalu uji konfigurasi sebelum menjalankan Nginx kembali. Setelah port 80 dipegang oleh proses yang benar, Nginx akan start seperti biasa — dan dengan perintah disable yang tepat, ia tidak akan kehilangan port itu lagi saat reboot berikutnya.

Referensi

  • Uptimia — "How to Fix 'nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)' Error": identifikasi pemegang port, menghentikan Apache, dan konfigurasi reverse proxy — https://www.uptimia.com/questions/fix-nginx-emerg-bind-to-80-failed-98-address-already-in-use-error (dibuka 28 Okt 2026).
  • DevAnswers — "Fix 'Job for nginx.service failed'": membaca log lewat journalctl dan error.log, serta identifikasi pemegang port dengan ss — https://devanswers.net/job-nginx-service-failed-control-process-exited-error-code/ (dari hasil pencarian 28 Okt 2026).
Cookie Consent