Node.js és Apache / Nginx portkonfliktusok kezelése lokális környezetben

A webfejlesztők egyik leggyakoribb bosszúsága a helyi fejlesztőkörnyezet kialakításakor jelentkezik, amikor a különböző szolgáltatások ugyanazt a hálózati portot próbálják meg lefoglalni. Tipikus példa, amikor egy Apache vagy Nginx webszerver (mint amilyen a XAMPP vagy a WAMP csomagokban található) mellett egy Node.js (Express) alkalmazást is futtatni szeretnénk lokálisan.

Miért történik a portkonfliktus?

Alapértelmezés szerint sok rendszer a 80-as (HTTP) portot, illetve fejlesztési célokra a 8080-as vagy 8081-es portot rendeli a szerverekhez. Ha elindítunk egy Node.js alkalmazást, ami a 8080-as portot figyelné, miközben az Apache Virtual Host is erre van konfigurálva, a hírhedt Error: listen EADDRINUSE: address already in use :::8080 hibába ütközünk.

Ez a hiba azt jelenti, hogy az operációs rendszer (legyen az Windows, macOS vagy Linux) megtagadja a hozzáférést a porthoz, mivel egy másik folyamat (process) már lefoglalta azt.

1. Megoldás: A Node.js portjának megváltoztatása

A leggyorsabb megoldás, ha a Node.js alkalmazásunk kódjában módosítjuk a használt portot. Ha Express.js-t használunk, a környezeti változók (Environment Variables) segítségével dinamikusan is beállíthatjuk a portot:

const express = require('express');
const app = express();

// A portot a környezeti változóból olvassa ki, ha nincs, akkor 3000
const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => {
    res.send('Szerver fut a ' + PORT + '-es porton!');
});

app.listen(PORT, () => {
    console.log(`Node.js szerver elindítva a http://localhost:${PORT} címen.`);
});

Ezzel a módszerrel a Node.js szerver a 3000-es porton fog futni, míg az Apache nyugodtan maradhat a 8080-ason.

2. Megoldás: Az Apache / Nginx portjának módosítása

Ha a Node.js alkalmazásunknak mindenképpen a 8080-as portra van szüksége (például egy külső API integráció miatt), akkor a lokális Apache konfigurációt kell áthelyeznünk egy kevésbé használt egyedi portra, például a 8090-re. Ehhez módosítanunk kell az Apache konfigurációs fájlját (httpd.conf vagy a httpd-vhosts.conf fájlt):

# Részlet az Apache httpd-vhosts.conf fájlból
<VirtualHost *:8090>
    ServerAdmin webmaster@localhost
    DocumentRoot "/var/www/simplesolution"
    ServerName simplesolution.local
    ErrorLog "logs/simplesolution-error.log"
    CustomLog "logs/simplesolution-access.log" common
</VirtualHost>

Ne felejtsük el megkeresni a fő httpd.conf fájlban a Listen 8080 sort, és átírni Listen 8090-re. Miután elmentettük a fájlokat, az Apache webszervert újra kell indítani a változások érvénybe lépéséhez. Ezzel felszabadítjuk a 8080-as portot a Node.js számára.

3. Megoldás: Reverse Proxy használata (Haladó)

Éles környezetben (Production) a legprofibb megoldás a Reverse Proxy (Fordított proxy) beállítása. Ekkor az Nginx vagy az Apache figyel a publikus 80-as (vagy 443-as HTTPS) porton, és a bejövő kéréseket automatikusan továbbítja a háttérben (pl. a 3000-es porton) futó Node.js alkalmazásnak.

Összegzés

A portkonfliktusok elkerülése alapvető feladat a többtechnológiás fejlesztőkörnyezetekben. A legegyszerűbb, ha környezeti változókkal (.env fájlok) dolgozunk, így minden fejlesztő a saját gépén tudja konfigurálni a szabad portokat anélkül, hogy a forráskódot módosítania kellene.

Gyakran Ismételt Kérdések (GYIK)

Hogyan tudom megnézni, hogy melyik program foglalja a portot Windows alatt?

Nyiss egy Parancssort (CMD) rendszergazdaként, és futtasd a netstat -ano | findstr :8080 parancsot. A sor végén megjelenő PID (Process ID) alapján a Feladatkezelőben azonosíthatod a futó programot.

Linux / macOS alatt hogyan találom meg a portot foglaló folyamatot?

Használd az lsof -i :8080 parancsot a terminálban. Ha szükséges, a folyamatot a kill -9 [PID] paranccsal állíthatod le.


Ezek is érdekelhetnek: