Node.js部署cPanel主机后MySQL连接报ECONNRESET崩溃如何解决
问题根因及解决方案
你遇到的ECONNRESET错误核心是cPanel服务器的MySQL服务默认会主动断开长时间无请求的闲置连接,而你当前使用的单连接方案没有处理连接断开后的错误捕获和重连逻辑,错误没有被捕获导致进程直接崩溃。具体可按以下步骤修复:
1. 优先替换单连接为连接池
不要使用createConnection创建单连接,改用createPool创建连接池,连接池会自动管理连接的复用、心跳检测、断开重连,稳定性远高于手动维护的单连接。
修改connectDB.js代码如下:
const mysql = require('mysql'); const dotenv = require('dotenv').config(); const settings = process.env.ENV === 'dev' ? require('./devSettings.json') : require('./prodSettings.json'); // 扩展连接池配置 const poolConfig = { ...settings, connectionLimit: 10, // 个人小项目5-10个连接足够,可按需调整 acquireTimeout: 60000, waitForConnections: true, idleTimeout: 60000, // 闲置1分钟自动释放连接,避免被MySQL服务主动断开 enableKeepAlive: true, keepAliveInitialDelay: 10000 }; const pool = mysql.createPool(poolConfig); // 监听连接池错误,避免未捕获异常导致进程崩溃 pool.on('error', err => { console.error('MySQL连接池错误:', err); // 连接断开类错误连接池会自动重建,无需手动重连,仅打日志即可 if (!['PROTOCOL_CONNECTION_LOST', 'ECONNRESET'].includes(err.code)) { throw err; } }); module.exports = pool;
后续业务代码执行SQL直接调用pool.query()即可,连接池会自动分配、回收连接,不需要手动管理连接生命周期。
2. 修复CRON任务逻辑
你当前的CRON任务里pkill node、pkill npm会杀死所有node相关进程,包括刚启动的服务进程,这是配置CRON后服务刚启动就崩溃的直接原因。修改CRON规则如下:
PATH=$PATH:$HOME/bin; export PATH; /usr/bin/pgrep -f "node app.js" >/dev/null || (cd /home/adminis6/Artesofa/; nohup npm start &)
用-f "node app.js"精准匹配你的服务进程,避免误杀正常进程。
3. 可选:用进程守护工具替代CRON监控
比CRON监控更稳定的方式是使用pm2管理node进程,pm2会自动捕获进程崩溃、自动重启,还支持日志轮转、性能监控等功能,安装配置命令如下:
# 全局安装pm2 npm install pm2 -g # 进入项目目录启动服务 cd /home/adminis6/Artesofa/ pm2 start app.js --name "artesofa-service" # 保存进程列表,服务器重启后自动恢复服务 pm2 save pm2 startup
内容的提问来源于stack exchange,提问作者Carlo
相关产品推荐
相关产品推荐

