PM2显示online但请求无响应,需查真实日志:执行pm2 logs --lines 100,重点排查模块缺失、端口占用、ESM语法错误;再用ss -tuln | grep :3000确认监听地址是否为*:3000或:::3000,而非仅127.0.0.1:3000,并检查宝塔防火墙与云安全组是否放行该端口。

PM2 进程显示 online 但请求无响应?先看真实日志
宝塔界面显示“启动成功”不等于 Node 进程真在跑。PM2 可能卡在初始化阶段就退出,而面板没刷新状态。最直接的办法是登录服务器终端,执行:pm2 logs --lines 100。重点看最后一屏有没有以下内容:
-
Error: Cannot find module—— 路径填错或工作目录不对 -
port 3000 is already in use—— 端口冲突,可能是旧进程没杀干净 -
ReferenceError: require is not defined—— 用了 ESM 语法(import)但 Node 版本太低("type": "module" - 空日志?说明 PM2 根本没执行到你的脚本,问题出在启动命令或解释器路径
注意:pm2 logs 默认只查最近一个应用;多项目时加 --name my-api 指定名称。宝塔界面上的“日志”页签是操作日志,不是应用日志,别混淆。
启动命令写 npm start 就失败?必须用绝对路径
宝塔 PM2 管理器不会自动加载你的 shell profile(比如 .bashrc),所以它找不到 nvm 安装的 npm,也不会识别 ~ 或相对路径。填 npm start 在绝大多数情况下都会报 command not found。
诊断并恢复通过 SSH 隧道连接的 OpenClaw 节点。用于解决配对必需错误、隧道冲突、远程端点错误以及 SSH 目标配置错误等问题。
- 正确做法:在宝塔“启动脚本”栏填完整绝对路径,例如:
/www/server/nvm/versions/node/v18.19.1/bin/npm start - 如果项目根目录是
/www/wwwroot/my-app,那“项目路径”必须填这个,不是/www/wwwroot/my-app/src - 更稳妥的方式是改用
ecosystem.config.js,显式指定cwd和script,比宝塔表单更可控 - 检查 Node 解释器是否匹配:在入口文件第一行加
console.log('NODE_VERSION:', process.version),对比你预期的版本
Nginx 反向代理配了还是 502?关键头缺失是高频原因
宝塔点“反向代理”自动生成配置,但默认不加 proxy_set_header Host $host;,这会导致后端框架(如 Express、Nest)读不到 req.headers.host,鉴权、重定向、静态资源路径全乱套。
- 进「网站」→ 对应站点 → 「配置文件」,确认有这几行(尤其
Host和X-Real-IP):proxy_pass http://127.0.0.1:3000;<br>proxy_set_header Host $host;<br>proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>proxy_set_header X-Forwarded-Proto $scheme;
- 删掉“启用缓存”——Node.js 是动态服务,开缓存会返回过期响应
- 执行
nginx -t验证语法,再bt reload或nginx -s reload生效 - 如果
curl http://127.0.0.1:3000能通,但域名访问 502,基本就是 proxy_pass 地址写错端口,或 Nginx 没连上本地服务
服务监听地址是 127.0.0.1:3000?外部请求根本到不了
这是最隐蔽也最常被跳过的环节。Node 进程默认监听 127.0.0.1,意味着只有本机能访问,Nginx 作为同机进程可以连上,但浏览器通过公网 IP 或域名访问时,流量压根进不来。
- 检查项目入口(如
server.js)里app.listen()的调用:
✅ 正确:app.listen(3000, '0.0.0.0', () => {...})
❌ 错误:app.listen(3000, '127.0.0.1', () => {...}) - 验证方式:执行
ss -tuln | grep :3000,输出中必须含*:3000或:::3000,不能只有127.0.0.1:3000 - 如果没输出,说明服务根本没起来——回退查 PM2 日志和启动命令
- 即使监听对了,还要过两道网关:宝塔防火墙 + 云平台安全组,二者都得放行对应端口(如 3000)
真正卡住的地方往往不在代码,而在监听地址、环境路径、Nginx 头三者之间的微小错位。每次改完,记得用 ss -tuln、pm2 logs、nginx -t 逐层验证,别依赖面板状态。

















