CentOS上Node.js运行不稳定的常见解决方法
内存泄漏会导致Node.js进程内存持续增长,最终因内存耗尽而崩溃。需通过以下步骤定位和修复:
heapdump模块生成堆快照,通过Chrome DevTools分析内存分配情况。安装命令:npm install heapdump --save;生成快照:在代码中添加heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot')(如内存泄漏触发时调用);分析:用Chrome打开生成的HTML文件,查看内存中残留的对象(如未释放的全局变量、事件监听器)。fs.close()关闭文件、db.connection.end()关闭数据库连接、removeListener()移除事件监听器、为缓存添加maxAge或LRU策略。top/htop/vmstat监控进程内存使用;引入memwatch-next或gc-stats库,当内存增长超过阈值时触发报警;使用PM2等进程管理器,在内存超过限制时自动重启应用。进程意外崩溃是运行不稳定的常见表现,需通过进程管理器实现自动恢复:
sudo npm install pm2 -g;启动应用:pm2 start app.js;设置开机自启:pm2 startup(按提示执行命令);保存进程列表:pm2 save(防止重启后丢失进程)。系统资源不足(内存、磁盘空间、文件描述符)会导致Node.js运行缓慢或崩溃:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048;格式化交换文件:sudo mkswap /swapfile;启用交换文件:sudo swapon /swapfile;永久生效:将/swapfile swap swap defaults 0 0添加到/etc/fstab文件中。df -h检查磁盘使用情况,删除无用文件(如日志、缓存);使用du -sh *定位大文件。/etc/security/limits.conf,添加* soft nofile 65535和* hard nofile 65535;编辑/etc/systemd/system.conf,添加DefaultLimitNOFILE=65535,然后执行systemctl daemon-reload。Node.js版本与CentOS系统或依赖库不兼容会导致运行错误:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash;重新打开终端后,安装指定版本:nvm install 16(推荐使用LTS版本);切换版本:nvm use 16。wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz;解压并编译安装:tar xvf glibc-2.28.tar.gz && cd glibc-2.28 && mkdir build && cd build && ../configure --prefix=/usr && make && make install。系统配置不当会影响Node.js的网络性能和稳定性:
sudo firewall-cmd --add-port=3000/tcp --permanent;重载防火墙:sudo firewall-cmd --reload。sudo setenforce 0;永久禁用:编辑/etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled(不推荐生产环境使用)。/etc/sysctl.conf,添加net.core.somaxconn=65535(增加TCP连接队列长度)、net.ipv4.tcp_tw_reuse=1(复用TIME_WAIT连接),然后执行sysctl -p使配置生效。代码中的错误(如未处理的异常、同步阻塞操作)会导致应用崩溃:
app.js)中添加全局异常处理,避免未捕获的异常导致进程退出。示例:process.on('uncaughtException', (err) => { console.error('Uncaught Exception:', err); // 记录日志或发送报警 });;process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled Rejection at:', promise, 'reason:', reason); // 记录日志或发送报警 });。fs.readFile替代fs.readFileSync),防止阻塞事件循环。server { listen 80; server_name example.com; location / { proxy_pass http://localhost:3000; } }。通过以上方法,可系统性解决CentOS上Node.js运行不稳定的问题。需根据具体错误日志(如pm2 logs、journalctl -u your-service)定位问题根源,优先处理内存泄漏、进程崩溃等高频问题。