Node.js 在 CentOS 的系统性错误排查指南
一 快速定位与通用排查步骤
二 日志与系统层面的定位
三 常见错误与修复对照表
| 症状 | 典型错误信息 | 快速检查 | 修复建议 |
|---|---|---|---|
| 命令未找到 | command not found: node | echo $PATH、which node | 安装 Node.js 或将可执行目录加入 PATH |
| 模块缺失 | Error: Cannot find module ‘xxx’ | ls node_modules/xxx | 执行 npm install,或检查本地/私有包可达性 |
| 端口被占用 | Error: listen EADDRINUSE :::3000 | ss -ltnp | 结束占用进程或改用未占用端口 |
| 权限被拒 | Error: EACCES | 目录权限、运行用户 | 调整目录权限或以合适用户运行 |
| 监听权限不足 | Error: listen EACCES (需要 1024 以下端口) | 端口号 | 改用**1024+**端口,或以具备权限的用户运行 |
| 文件监视上限 | Error: ENOSPC | dmesg | 提升 inotify 限制:/etc/sysctl.conf 增加 fs.inotify.max_user_watches |
| 原生模块编译失败 | gyp ERR! | gcc、make、python3 | 安装Development Tools与openssl-devel等依赖后重装 |
| 依赖安装缓慢/失败 | npm ERR! | 网络 | 切换npm registry镜像源,或检查网络代理 |
| 服务启动但访问异常 | 无应用日志输出 | systemctl status、journalctl | 检查服务ExecStart、工作目录、环境变量与端口映射 |
四 性能与稳定性问题的排查
五 一键排查脚本示例
#!/usr/bin/env bash
set -e
APP_NAME="my-node-app"
APP_DIR="/opt/$APP_NAME"
LOG_DIR="$APP_DIR/logs"
PORT=3000
echo "=== 1) 版本与环境 ==="
node -v || echo "Node.js 未安装"
npm -v || echo "npm 未安装"
echo "=== 2) 端口占用检查 ==="
ss -ltnp | grep ":$PORT" || echo "端口 $PORT 未被占用"
echo "=== 3) 目录与权限 ==="
ls -ld "$APP_DIR" "$LOG_DIR" 2>/dev/null || echo "目录不存在或不可读"
echo "=== 4) 服务日志(若存在)==="
if systemctl is-active --quiet "$APP_NAME"; then
journalctl -u "$APP_NAME" -n 50 --no-pager
else
echo "服务 $APP_NAME 未运行"
fi
echo "=== 5) 应用日志尾部 ==="
if [[ -f "$LOG_DIR/app.log" ]]; then
tail -n 50 "$LOG_DIR/app.log"
else
echo "日志文件 $LOG_DIR/app.log 不存在"
fi
echo "=== 6) 常见错误关键词检索 ==="
grep -i -n "error\|exception\|fail" "$LOG_DIR/app.log" 2>/dev/null | tail -20 || echo "未检索到错误关键词"
echo "=== 7) 原生模块编译依赖检查 ==="
if command -v gcc >/dev/null 2>&1; then
echo "gcc 已安装: $(gcc --version | head -n1)"
else
echo "gcc 未安装,建议:sudo yum groupinstall 'Development Tools' -y"
fi
if command -v make >/dev/null 2>&1; then
echo "make 已安装: $(make -v | head -n1)"
else
echo "make 未安装,建议:sudo yum install make -y"
fi
echo "=== 8) 网络连通性(示例:数据库)==="
# curl -v http://127.0.0.1:$PORT/health || echo "应用健康检查失败"
# 如需检查数据库,替换为实际地址与端口
将脚本保存为check-node.sh,赋予执行权限并运行:chmod +x check-node.sh && ./check-node.sh。