[Solved] PM2 Port Already in Use terosss!!
16 Jun 2025 · 2 min read
Berminggu-minggu saya debug project ini, tapi belum solve-solve. Tapi akhirnya solve juga setelah banyak tanya di Gemini.
Masalah:
Saat run project ini dengan nodemon, aman-aman saja. Tapi saat running menggunakan pm2
,
malah error. Oya, di sini saya menggunakan file ecosystem.config.js
untuk konfigurasi pm2
di project ini.
Jadi saat saya menjalankan dengan perintah ini:
pm2 start ecosystem.config.js --env production
Malah error seperti ini:
8|api | 2025-06-15 16:32 +00:00: at process.processImmediate (node:internal/timers:485:21)
8|api | 2025-06-15 16:32 +00:00: at process.callbackTrampoline (node:internal/async_hooks:130:17) {
8|api | 2025-06-15 16:32 +00:00: code: 'EADDRINUSE',
8|api | 2025-06-15 16:32 +00:00: errno: -98,
8|api | 2025-06-15 16:32 +00:00: syscall: 'listen',
8|api | 2025-06-15 16:32 +00:00: address: '::',
8|api | 2025-06-15 16:32 +00:00: port: 4000
8|api | 2025-06-15 16:32 +00:00: }
What the hell!?
Tidak ada port yang berjalan di port 4000
.
Saya sudah periksa semua dengan perintah-perintah linux seperti lsof
, netstat
, dll.
Hmmmm… 🤔
Kalau saya jalankan project ini tanpa file ecosystem.config.js
, bisa aja sih jalan.
pm2 start src/server.js
Tapi ini akan menyulitkan saya, karena harus nambahin argumen lagi diperintah itu agar saat nanti saya
deploy bisa auto restart, logs-nya ada tanggalnya, dan mesti menggunakan environment production
.
Akhirnya nemu solusi setelah diskusi panjang dengan Gemini.
Solusi:
Penyebab masalahnya
Ternyata di konfigurasi project ini ada port yang sama. Yakni port untuk jalanin server expressjs-nya dan juga port untuk jalankan server Websocket-nya.
Begini bentuk konfigurasinya:
const port = process.env.PORT || 4000;
const socketPort = process.env.PORT || 4001;
Lihatlah di sana ada process.env.PORT
, ini diambil dari file .env
.
Kalau tidak ada di file .env
maka nilainya akan otomatis mengginakan yang sebelah,
yakni 4000
dan 4001
.
Karena ada nilai PORT
di file .env
. Akhirnya kedua variabel tersebut
akan menggunakan nilai 4000
baik untuk variabel port
dan socketPort
.
Sehingga ini mengakibatkan bentrok saat dijalankan oleh PM2.
Jadi…
Solusinya:
Kita harus bedakan port untuk server express dan websocket. Jadi saya ubah aja seperti ini:
const port = process.env.PORT || 4000;
const socketPort = process.env.SOCKET_PORT || 4001;
Di file .env
tinggal buat variabel baru dengan nama SOCKET_PORT
.
Dagh! selesai.