跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何解决宝塔面板Node.js项目部署后无法访问_排查PM2管理状态与反向代理

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
。 正确做法:在宝塔“启动脚本”栏填完整绝对路径,例如:
/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
,鉴权、重定向、静态资源路径全乱套。 php版微信js-sdk支付接口类 php版微信js-sdk支付接口类 下载 进「网站」→ 对应站点 → 「配置文件」,确认有这几行(尤其
Host
和
X-Real-IP
):
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
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
逐层验证,别依赖面板状态。

相关文章