You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:20:18