CentOS上Node.js数据库连接优化
一 连接池与驱动配置
- 使用连接池而非单连接,优先选择支持 Promise 的驱动(如 mysql2/promise、pg),便于 async/await 与统一错误处理。
- 典型 MySQL 连接池示例(使用环境变量管理敏感信息):
const { createPool } = require('mysql2/promise');
require('dotenv').config();
const pool = createPool({
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT, 10),
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
enableKeepAlive: true,
keepAliveInitialDelay: 0,
});
module.exports = pool;
- 关键参数建议:
- connectionLimit:从 10 起步,结合数据库 max_connections 与应用并发逐步压测调优。
- waitForConnections / queueLimit:开启排队避免瞬时报错,队列过长需考虑扩容或优化慢查询。
- idleTimeoutMillis / connectionTimeoutMillis(PostgreSQL 常用):如 idleTimeoutMillis=30000、connectionTimeoutMillis=2000,及时回收空闲连接并快速失败。
- 始终使用环境变量或 secret 管理凭证,避免硬编码。
二 SQL 与索引优化
- 为高频查询条件建立合适的索引,避免全表扫描与不必要的 JOIN。
- 仅查询需要的列,分页与批量操作使用合适索引与 LIMIT/OFFSET 或游标。
- 对大结果集使用流式处理或分页,减少内存占用与连接占用时间。
- 定期分析执行计划,更新统计信息,必要时进行索引重建与归档冷数据。
三 缓存与架构层优化
- 对不常变的数据使用缓存(如 Redis、内存缓存),设置合理 TTL,在数据库前形成多层缓存,显著降低连接与 QPS 压力。
- 在 CentOS 上使用 Nginx 作为反向代理与静态资源缓存,启用 HTTP/2/SSL/TLS,并可对多实例做 负载均衡,减少单实例数据库连接争用。
- 读写分离与只读副本:将报表、搜索等读多写少流量路由到副本,缓解主库连接压力。
- 连接治理:避免在请求作用域外长期持有连接;在 Express 等框架中使用中间件或依赖注入统一管理连接/事务生命周期。
四 CentOS 系统网络与资源调优
- 调整内核网络参数(/etc/sysctl.conf),示例:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 1024
net.core.netdev_max_backlog = 2000
执行 sudo sysctl -p 使配置生效。
- 提升文件描述符与进程数限制(/etc/security/limits.conf),避免 “Too many connections/open files”。
- 选用 SSD、保证足够 内存/CPU,并对 Node.js 设置合理内存上限(如
--max-old-space-size),防止 OOM 影响连接稳定性。
- 监控与维护:持续跟踪连接数、查询时延、错误率;定期备份、重建索引与更新统计信息。
五 监控排障与安全加固
- 监控与诊断:
- PostgreSQL 可用
pg_stat_activity 查看活跃/等待连接与慢查询;
- 应用侧记录连接获取耗时、排队与超时,结合 APM/日志定位瓶颈。
- 常见错误与处理:
- ENOTFOUND:检查 DB_HOST 是否可解析、网络与防火墙策略;
- 连接超时/队列溢出:适当提升 connectionLimit/queueLimit,并优化慢查询与引入缓存;
- 空闲被断开:启用 keepAlive 与合理的 idleTimeoutMillis。
- 安全加固:
- 使用环境变量或 secret 管理凭证,禁止硬编码;
- 通过 防火墙 限制数据库访问来源,仅开放必要端口与网段;
- 公网传输启用 TLS/HTTPS,避免明文凭据与数据泄露。