nodejs+Koa2实际项目中遇见的问题
- 记得刚开始用nodejs写接口服务时,那时候服务是基于nodejs+express+mysql搭建的,直到前段时间需要提供部分CRM系统接口功能,这次选择nodejs+koa2+sequelize+mysql搭建的项目,线上部署都是采用pm2进程守护部署
-
以下是在实际发布上线时遇见的各种坑,总结如下:
项目目录
1、pm2配置文件——服务不定时挂掉
pm2配置
{
"apps": [
{
"name": "management-server",
"script": "bin/www",
"log_date_format": "YYYY-MM-DD HH:mm:SS",
"log_file": "logs/node.log",
"error_file": "logs/node-err.log",
"out_file": "logs/node-out.log",
"pid_file": "pids/node.pid",
"instances": 1,
"min_uptime": "200s",
"max_restarts": 30,
"max_memory_restart": "10M",
"cron_restart": "1 0 * * *",
"watch": false,
"merge_logs": true,
"exec_interpreter": "node",
"exec_mode": "cluster_mode",
"autorestart": true,
"vizion": false
}
]
}
项目中pm2配置是从网上找的,搜的大部分都是以上这种,也看了各个字段大致意思,于是就把项目部署至服务器,然后每隔个几天服务就会不定时挂掉,为此运维也配合加了服务监控脚本,然而并没有用,这种状态持续了大概半个月,当时慌了一批,于是尝试了解具体每个配置项并在开发环境上配置观察
当试了"max_memory_restart": "10M", // 重启占用最大内存
这个配置时把10M改成1024M,服务从此没在挂掉
参考文章:
https://blog.csdn.net/Baby_lucy/article/details/82216454
https://www.jianshu.com/p/e2a929ea8cfd
2、连接数据库配置
- config/db.js——关于连接mysql数据库配置文件
const Sequelize = require('sequelize')
let user = 'test_online'
let pwd = '@#$12wipo'
let host = '192.168.13.123'
const HealthyDB = new
// 连接数据库简单写法
Sequelize(`mysql://${user}:${pwd}@${host}/test_management`, {
host: '192.168.13.123',
port: 3306,
define: {
timestamps: false // 取消Sequelize自动给数据表加入时间戳(createdAt 以及 updatedAt)
},
timezone: '+08:00' // Mysql时区与Node时区不一致问题
})
module.exports = {
HealthyDB // 将HealthyDB暴露出接口,方便Model调用
}
以上写法在以ip为host的地址是可以的,但是在发布上线时就不适用了,原因是因为线上数据库用的是阿里云rds数据库,host是rm-bnsq123.mysql.rds.aliyuncs.com这种形式,不是上面那种ip地址形式,会报连接数据库失败,猜测原因可能是上面拼接形式解析时出的问题,各种搜索后找到了以下配置方式:
const Sequelize = require('sequelize')
let configInfo = database[process.env.NODE_ENV]
// // 预发环境
const config = {
// 数据库
database: 'test_management',
// 用户名
username: 'test_online',
// 密码
password: '@#$12wipo',
// 使用哪个数据库程序
dialect: 'mysql',
// 地址
host:'rm-bnsq123.mysql.rds.aliyuncs.com',
// 端口
port: 3306,
// 连接池
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
define: {
timestamps: false // 取消Sequelize自动给数据表加入时间戳(createdAt 以及 updatedAt)
},
timezone: '+08:00' // Mysql时区与Node时区不一致问题
}
console.log(config,'config')
const HealthyDB = new Sequelize(config)
module.exports = {
HealthyDB // 将HealthyDB暴露出接口,方便Model调用
}
以上配置方式使用了host为ip和阿里云rds数据库形式的配置
3、解决Mysql时区 与 Node时区 不一致导致问题
这个问题主要是接口新增后的时间字段和mysql中对应不上,通过Sequelize中添加配置项解决,在2中的config中添加timezone: '+08:00' // Mysql时区与Node时区不一致问题
参考:
https://blog.csdn.net/u011249920/article/details/80941799
https://blog.csdn.net/chanlingmai5374/article/details/93190983