Node.js Port Already in Use Hatası Nasıl Çözülür?
Node.js uygulamasını başlatırken EADDRINUSE veya Port already in use hatası alıyorsanız uygulamanın kullanmak istediği port başka bir işlem tarafından zaten kullanılıyor demektir. Örneğin uygulamanız 3000 portunda çalışmaya çalışırken aynı portta başka bir Node.js uygulaması veya servis açık olabilir.
En yaygın hata mesajlarından biri şöyledir:
Error: listen EADDRINUSE: address already in use :::3000Buradaki
3000, kullanılamayan port numarasıdır.1. Uygulamayı iki kez çalıştırmadığınızdan emin olun
Sorunun en basit nedeni aynı Node.js uygulamasının zaten çalışıyor olmasıdır.
Örneğin ilk terminalde:
npm startçalıştırdıktan sonra başka bir terminal açıp tekrar:
npm startçalıştırırsanız ikinci uygulama aynı porta bağlanamayabilir.
İlk çalışan uygulamayı durdurmak için terminalde genellikle:
Ctrl + Ckullanılabilir.
Ardından uygulamayı tekrar başlatın.
2. Linux'ta portu hangi işlem kullanıyor?
Örneğin
3000 portunu kontrol etmek için sisteminizde bulunan araçlara göre:ss -ltnp | grep :3000veya:
lsof -i :3000gibi komutlar kullanılabilir.
Çıktıda ilgili portu kullanan process ve mümkünse PID bilgisi görülebilir.
İşlemi sonlandırmadan önce bunun gerçekten kapatmak istediğiniz uygulama olduğundan emin olun.
3. Windows'ta portu kullanan işlemi bulun
Windows'ta Komut İstemi üzerinden:
netstat -ano | findstr :3000kullanılabilir.
Çıktının sonunda ilgili PID görülebilir.
Daha sonra:
tasklist | findstr PIDile bu PID'nin hangi programa ait olduğunu kontrol edebilirsiniz.
PID yerine gerçek işlem numarasını yazmanız gerekir.Örneğin PID
1234 ise:tasklist | findstr 1234şeklinde kontrol edebilirsiniz.
4. İşlemi kapatmadan önce ne olduğunu kontrol edin
Portu kullanan process'i bulduğunuz anda zorla kapatmak doğru olmayabilir.
Aynı portu:
- Başka bir web uygulaması
- Production servisi
- Docker container
- PM2 uygulaması
- Geliştirme sunucusu
- Sistem servisi
kullanıyor olabilir.
Özellikle VPS veya production sunucularında PID'yi kontrol etmeden işlem sonlandırmayın.
5. PM2 kullanıyorsanız çalışan uygulamaları kontrol edin
Node.js uygulaması PM2 ile çalışıyorsa:
pm2 listkomutunu kullanın.
Uygulamanız zaten PM2 tarafından çalıştırılıyorsa terminalden tekrar:
node server.jsveya:
npm startçalıştırmanız aynı portun ikinci kez kullanılmaya çalışılmasına neden olabilir.
Uygulamayı yeniden başlatmak istiyorsanız uygun durumda:
pm2 restart uygulama-adikullanabilirsiniz.
Logları kontrol etmek için:
pm2 logs uygulama-adikomutu da faydalıdır.
6. PM2 üzerinde aynı uygulamanın birden fazla kopyasını kontrol edin
Yanlış yapılandırma sonucunda aynı uygulamanın farklı PM2 process'leri aynı porta bağlanmaya çalışabilir.
Öncelikle:
pm2 listile çalışan process'leri inceleyin.
Artık kullanılmayan bir process varsa ne olduğunu doğruladıktan sonra PM2 üzerinden durdurabilir veya silebilirsiniz.
Örneğin:
pm2 stop uygulama-adiveya gerçekten kaldırılması gerekiyorsa:
pm2 delete uygulama-adikullanılabilir.
7. Uygulamanın portunu değiştirmek
Portu kullanan mevcut servisin çalışmaya devam etmesi gerekiyorsa Node.js uygulamanızı farklı bir portta çalıştırabilirsiniz.
Örneğin uygulamada:
const PORT = process.env.PORT || 3000;gibi bir yapı kullanılıyorsa environment değişkeni üzerinden farklı port belirlenebilir.
Örneğin Linux/macOS ortamında uygun kullanım şekline göre:
PORT=3001 npm startkullanılabilir.
Windows ortamında environment değişkeni tanımlama yöntemi kullandığınız terminale göre farklılık gösterebilir.
8. .env dosyasındaki PORT değerini kontrol edin
Projelerde port çoğu zaman
.env dosyasından alınır.Örneğin:
PORT=3000bulunabilir.
Aynı sunucuda birden fazla uygulama çalışıyorsa her uygulamanın uygun bir internal port kullanması gerekebilir.
Portu değiştirdiğinizde Nginx, reverse proxy, Docker veya başka servis yapılandırmalarında eski porta bağlı ayarlar varsa bunların da kontrol edilmesi gerekir.
9. Nginx kullanıyorsanız sadece Node.js portunu değiştirmek yeterli olmayabilir
Örneğin Node.js uygulamanız:
127.0.0.1:3000üzerinde çalışıyor ve Nginx istekleri bu porta yönlendiriyorsa Node.js portunu
3001 olarak değiştirdikten sonra Nginx hâlâ 3000 portuna istek gönderiyor olabilir.Bu durumda reverse proxy yapılandırmasını da yeni porta göre düzenlemeniz gerekir.
Aksi halde Node.js uygulaması çalışsa bile siteye erişimde
502 Bad Gateway gibi başka sorunlarla karşılaşabilirsiniz.10. Uygulama kapandı ama port hâlâ kullanımda görünüyorsa
Terminal penceresini kapatmanız her zaman arka plandaki servisin sona erdiği anlamına gelmeyebilir.
Özellikle PM2, Docker veya sistem servisi olarak çalışan uygulamalar terminal kapansa bile çalışmaya devam edebilir.
Portu tekrar kontrol ederek hangi process'in dinlediğini belirleyin.
11. nodemon kullanırken EADDRINUSE hatası
Geliştirme sırasında
nodemon kullanıyorsanız uygulama yeniden başlatılırken eski process'in düzgün kapanmaması gibi durumlar yaşanabilir.Öncelikle çalışan Node.js process'lerini ve ilgili portu kontrol edin.
Tüm Node.js işlemlerini topluca kapatmak yerine yalnızca sorunlu uygulamaya ait process'i belirlemek daha güvenlidir.
12. Docker kullanıyorsanız port çakışmasını kontrol edin
Docker container çalıştırırken host portu başka bir container veya uygulama tarafından kullanılıyorsa port çakışması oluşabilir.
Çalışan container'ları kontrol edin ve hangi host portlarının kullanıldığını inceleyin.
Burada container içerisindeki port ile sunucunun host portunun aynı kavram olmadığını unutmayın.
13. Production sunucusunda rastgele process öldürmeyin
İnternette port sorunları için tüm Node.js process'lerini kapatan komutlarla karşılaşabilirsiniz.
Bu yaklaşım aynı sunucuda çalışan diğer Node.js uygulamalarını da durdurabilir.
Production ortamında:
1. Kullanılan portu bulun.
2. PID'yi belirleyin.
3. Process'in hangi uygulamaya ait olduğunu doğrulayın.
4. PM2 veya ilgili servis yöneticisini kontrol edin.
5. Yalnızca doğru process üzerinde işlem yapın.
Bu yöntem daha güvenlidir.
14. EADDRINUSE hatası için hızlı kontrol sırası
Örneğin uygulamanız
3000 portunu kullanıyorsa:1. Uygulamanın başka terminalde çalışıp çalışmadığını kontrol edin.
2. PM2 kullanıyorsanız
pm2 list çalıştırın.3. Port
3000 üzerinde hangi process'in çalıştığını bulun.4. Process'in ne olduğunu doğrulayın.
5. Gereksiz process ise uygun yöntemle durdurun.
6. İki uygulamanın da çalışması gerekiyorsa portlardan birini değiştirin.
7. Nginx veya başka reverse proxy kullanıyorsanız yapılandırmayı kontrol edin.
8. Uygulamayı yeniden başlatın.
9. Logları tekrar inceleyin.
Port numarasını sürekli değiştirmek gerçek çözüm olmayabilir
Her
EADDRINUSE hatasında 3000 yerine 3001, ardından 3002 kullanmak sorunun temel nedenini çözmez.Öncelikle eski uygulamanın neden hâlâ çalıştığını veya aynı servisin neden birden fazla kez başlatıldığını araştırın.
Özetle Node.js
Port already in use veya EADDRINUSE hatası, kullanılmak istenen portun başka bir process tarafından tutulduğunu gösterir. En doğru çözüm portu kullanan process'i belirlemek, bunun gerekli olup olmadığını kontrol etmek ve ardından mevcut servisi durdurmak veya uygulamalardan birine farklı port atamaktır.Forumda yardım isterken EADDRINUSE hata mesajını, kullanılan portu, işletim sistemini ve uygulamanın PM2, Docker, Nginx veya doğrudan Node.js ile çalıştırılıp çalıştırılmadığını belirtmeniz sorunun daha hızlı çözülmesini sağlar.
