Plesk上Node.js TCP服务器启动失败,提示端口未定义
问题诊断
你的核心问题是Passenger未正确传递PORT环境变量给Node.js TCP服务器,导致process.env.PORT为undefined,进而引发Passenger的进程启动失败日志。本地运行正常是因为你本地可能手动设置了PORT变量,或测试时直接指定了端口,不存在环境变量传递的问题。
另外,你尝试硬编码端口3000后仍未启动,大概率是以下原因之一:
- Plesk服务器防火墙未开放目标端口
- 目标端口已被其他进程占用
- Passenger默认的HTTP应用托管模式,与TCP服务器的启动逻辑不兼容
解决方案
1. 让Passenger正确加载环境变量
Plesk自带的「自定义环境变量」功能主要为HTTP应用设计,Passenger不会自动读取该配置。需通过以下方式传递PORT:
- 在Node.js项目根目录创建
passenger_envvars文件,写入:
保存后重启Plesk的Node.js应用服务。PORT=3000 - 或者在Plesk的「Node.js设置」中,修改启动命令为:
替换PORT=3000 node your-server-file.jsyour-server-file.js为你的实际入口文件名。
2. 硬编码端口并验证端口可用性
如果环境变量方式仍失效,直接在代码中指定端口,同时完成端口验证:
- 修改代码中的端口定义:
const serverPort = 3001; // 选一个未被占用的端口,避免冲突 - 登录服务器终端,检查端口是否被占用:
若有结果返回,更换其他端口。lsof -i :3001 - 在Plesk的「防火墙」设置中,添加入站规则,允许TCP端口3001的外部访问。
3. 调整Passenger的应用类型配置
Passenger默认将Node.js应用识别为HTTP应用,需显式声明适配TCP服务器:
- 在项目根目录创建
Passengerfile.json,写入:
确保{ "app_type": "node", "startup_file": "your-server-file.js", "environment": "production" }startup_file指向你的TCP服务器入口文件。
验证步骤
- 重启Plesk的Node.js应用服务
- 在本地终端执行
telnet your-server-ip 3001,测试是否能建立连接 - 查看Passenger日志和应用标准输出,确认无「Port undefined」类提示
额外注意事项
- TCP服务器需要直接绑定端口,无法使用Passenger的反向代理功能,必须确保端口对外可访问
- 若服务器为云主机,还需在云服务商的安全组中开放对应端口
内容的提问来源于stack exchange,提问作者Dr. PPSN
相关产品推荐
相关产品推荐

