在Plesk部署Node.js项目遇EADDRINUSE端口占用问题求助
解决Ubuntu 18.04.1 + Plesk环境下Node.js项目EADDRINUSE端口占用问题
问题概述
服务器环境为Ubuntu 18.04.1 + Plesk,部署Node.js项目时,无论更换随机端口,均提示EADDRINUSE(端口已占用)错误,但该项目在Render平台可正常运行。
项目核心配置代码
const app = express(); // CORS配置 const domainWhiteList = [process.env.ORIGIN1, process.env.ORIGIN2] app.use(cors({ origin: function (origin, callback) { console.log(origin) if (!origin || domainWhiteList.includes(origin)) { return callback(null, origin) } return callback('Not allowed by CORS ' + origin) } })); // 启用cookie解析 app.use(cookieParser()); // 启用JSON请求体解析 app.use(express.json()); // 登录API路由 app.use("/api/v1/auth", authRouter); // 链接API路由 app.use("/api/v1/links", linkRouter) // 端口配置 const PORT = process.env.PORT || 5000; // 启动服务 app.listen(PORT, () => {console.log("Server is running on port:"+ PORT + " http://localhost:"+ PORT)});
错误日志详情
Error: listen EADDRINUSE: address already in use :::4657 at Server.setupListenHandle [as _listen2] (node:net:1740:16) at listenInCluster (node:net:1788:12) at Server.listen (node:net:1876:7) at Function.listen (/var/www/vhosts/vexshe.fun/proyects.vexshe.fun/node_modules/express/lib/application.js:635:24) at file:///var/www/vhosts/vexshe.fun/proyects.vexshe.fun/index.js:47:5 at ModuleJob.run (node:internal/modules/esm/module_job:193:25) Emitted 'error' event on Server instance at: at emitErrorNT (node:net:1767:8) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { code: 'EADDRINUSE', errno: -98, syscall: 'listen', address: '::', port: 4657 } Node.js v19.6.0
排查与解决方案
1. 检查Plesk Node.js运行模式
Plesk默认用Passenger模式部署Node.js项目,此模式下无需手动调用app.listen()——Passenger会自动接管端口监听,手动调用会直接导致端口冲突。
- 操作:进入Plesk项目的Node.js配置页面,确认运行模式。若为Passenger,删除代码中的
app.listen()代码块;若要保留手动监听逻辑,切换为Standalone模式。
2. 清理残留Node进程
可能存在未彻底关闭的Node进程占用端口,即使换端口也会因重复启动逻辑触发冲突:
- 查看端口占用:执行
lsof -i :<端口号>或netstat -tulpn | grep <端口号>,确认占用端口的进程PID。 - 终止进程:执行
kill -9 <进程PID>强制结束残留进程。
3. 修改服务绑定IP
默认app.listen(PORT)会绑定所有IP(::/0.0.0.0),易与Plesk反向代理冲突,改为绑定本地回环地址:
app.listen(PORT, '127.0.0.1', () => { console.log("Server is running on port:"+ PORT + " http://localhost:"+ PORT) });
服务仅监听本地,由Plesk反向代理对外提供访问。
4. 检查PORT环境变量设置
Plesk可能自动设置PORT变量,但该端口可能被其他系统服务占用:
- 尝试手动指定高位端口(如30000以上),或在Plesk的Node.js配置页面手动设置
PORT环境变量。
5. 降级Node.js版本
当前使用Node.js v19.6.0(非LTS版本),Ubuntu 18.04.1系统库对高版本Node兼容性有限,建议降级到LTS版本(如v18.x或v16.x),避免兼容性问题导致的异常端口占用。
内容的提问来源于stack exchange,提问作者tankiale
相关产品推荐
相关产品推荐

