宝塔面板部署Node.js应手动安装官方二进制包至/www/server/nodejs并配置软链;Nginx需正确设置proxy_header、WebSocket支持及HTTPS反代;pm2须显式指定node路径和环境变量。

宝塔面板里装 Node.js 别选“软件商店”的一键部署
宝塔自带的 Node.js 环境(尤其旧版本)常卡在 v14 或 v16,且 npm 权限混乱、全局模块路径错乱,npm install -g 装的命令根本进不了 $PATH。真实项目跑不起来,不是代码问题,是环境本身就不干净。
- 直接去宝塔「软件商店」搜 Node.js 安装 → 大概率踩坑,尤其用
express、nuxt、next这类需要编译或 CLI 的项目 - 正确做法:用宝塔终端手动安装 Node.js 官方二进制包,控制版本、路径和权限
- 推荐路径固定为
/www/server/nodejs,避免和宝塔自建路径冲突;软链/usr/bin/node和/usr/bin/npm必须手动建
Node 项目启动前必须改这三项配置
哪怕 node app.js 能跑通,上线后也大概率 502 —— 宝塔的 Web 服务(Nginx)默认不转发 WebSocket、超时短、不透传 Host,而 Node 服务又默认监听 127.0.0.1:3000,不处理反向代理头。
-
app.listen()必须绑定0.0.0.0,不能只写127.0.0.1或留空(某些框架默认只绑本地) - Nginx 配置里要加
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,否则req.ip拿到的是127.0.0.1 - 如果项目用
socket.io或长连接,还得加proxy_http_version 1.1;和proxy_set_header Upgrade $http_upgrade;
pm2 启动后进程消失?检查用户权限和环境变量
pm2 start app.js 看似成功,但 pm2 list 过两分钟就空了,或者日志里报 command not found: node —— 这不是 pm2 问题,是宝塔终端和 pm2 后台运行时加载的 shell 环境不一致。
- 用
pm2 start app.js --interpreter /www/server/nodejs/bin/node显式指定 node 路径,别依赖$PATH - pm2 默认以
www用户运行,但该用户家目录下没.bashrc,NODE_ENV=production这种变量不会自动生效,得用--env "NODE_ENV=production" - 避免用
pm2 startup,宝塔系统服务管理更稳;改用pm2 save+ 宝塔「计划任务」里加开机启动命令:su - www -c "pm2 start /www/wwwroot/myapp/ecosystem.config.js"
HTTPS 下 WebSocket 连不上?Nginx 和前端 URL 都得同步改
明明 Nginx 配了 wss:// 反代,前端连 new WebSocket('wss://api.example.com/ws') 还是失败,浏览器控制台报 net::ERR_CONNECTION_REFUSED —— 很可能后端还在用 ws:// 协议响应,或前端硬编码了 http 协议。
- 后端
socket.io初始化时必须设transports: ['websocket']并关掉轮询,否则降级走 HTTP 长轮询,Nginx 默认不支持 - 前端连接地址必须和页面协议一致:HTTPS 页面不能连
ws://,必须用wss://;可以用window.location.protocol.replace('http', 'ws') + '//'+ window.location.host + '/ws'动态生成 - 宝塔 SSL 设置里「强制 HTTPS」打开后,Nginx 会 301 重定向,但 WebSocket 升级请求(
Upgrade: websocket)不能被重定向,所以反代配置必须独立写在 443 server 块里,不能靠 rewrite
Node 环境真正的麻烦点不在安装,而在「谁在读环境变量」「谁在解析 Host 头」「谁在决定用哪个协议升级 WebSocket」——这些链路一环断,整个服务就静默失效,查日志还看不出错。










