Node.js 项目的部署配置/环境设置该怎么存?
Node.js 配置管理四种方式:环境变量(敏感信息首选)、配置文件(JSON/YAML,按环境分文件)、配置管理库(config/convict)、云密钥服务(生产密钥)。本文对比选型与安全红线。
**主流答案:敏感信息走环境变量,结构化配置走配置文件,两者组合使用。**按敏感度分层是核心原则。
方案一:环境变量(敏感信息首选)
// 开发期用 dotenv 加载 .env
require('dotenv').config();
const apiKey = process.env.API_KEY;
const dbUrl = process.env.DATABASE_URL;
优点:不进代码库、与 12-Factor 方法论一致、所有部署平台(Docker/K8s/Serverless)原生支持。红线:.env 必须进 .gitignore。
方案二:配置文件(结构化配置)
// config/default.json + config/production.json 按环境分层
const config = require('./config/' + (process.env.NODE_ENV || 'default') + '.json');
优点:层级清晰、可校验、非敏感配置进版本库有历史可追。适合端口、超时、功能开关这类"安全但随环境变"的项。
方案三:配置管理库
- config:
config/目录按default.json、production.json自动按 NODE_ENV 层叠合并; - convict:带 Schema 校验的配置,启动时就能发现配置错误;
- dotenv-flow:dotenv 的多环境增强版。
方案四:密钥管理服务(生产推荐)
数据库密码、第三方密钥这类高机密配置,生产环境用 AWS Secrets Manager / HashiCorp Vault / 云厂商 KMS,应用启动时拉取,而不是落盘成文件。
组合实践(推荐)
非敏感配置(端口、超时、开关)→ config 文件,进 Git
敏感配置(密码、密钥) → 环境变量 / 密钥服务,不进 Git
本地开发 → .env(gitignore)+ .env.example(示例入库)
提供一个 .env.example(只有键名没有真实值)提交到仓库,新人照着填,是协作体验的关键细节。
常见问题(FAQ)
Q:配置文件能注释吗?
JSON 不支持注释。需要注释用 YAML、JSON5 或 .js 配置文件(module.exports = {...})。
Q:多环境配置怎么避免重复?
用层叠模式:default 放全量默认值,production.json 只写差异项(config 库自动合并)。
Q:Docker 里怎么注入配置?
docker run -e KEY=value,或 compose 的 env_file。K8s 用 ConfigMap(非敏感)+ Secret(敏感)。