【问题标题】:Verify if my node.js instance is dev or production验证我的 node.js 实例是 dev 还是 production
【发布时间】:2012-05-28 12:05:20
【问题描述】:

现在,每当我想将 node.js 服务器部署到我的生产服务器时,我都需要更改所有 IP/DNS/用户名/密码,以便与我的数据库和外部 API 进行各种连接。

这个过程很烦人,有没有办法验证当前运行的 node.js 实例是在 cloud9ide 还是我的生产joyent smartmachine?

如果我能够确定(在我的运行代码中)我的 node.js 实例正在哪个服务器上运行,我将添加一个条件,将值设置为 prod 或 dev。

谢谢

【问题讨论】:

  • 你的 node.js 应用是 HTTP 服务器吗?
  • 是的。还与 mongodb 有连接。

标签: javascript node.js express cloud9-ide joyent


【解决方案1】:

我认为设置环境的最简单方法是将命令行参数传递给您的应用程序。

node ./server.js dev

在您的脚本中,您需要处理此参数并设置您需要的配置。

var env = process.argv[2] || 'dev';
switch (env) {
    case 'dev':
        // Setup development config
        break;
    case 'prod':
        // Setup production config
        break;
}

另外,我创建了module,这使得配置过程更容易一些。也许对你有帮助。

【讨论】:

  • +1 这允许您创建多个设置,从开发到阶段再到生产。
【解决方案2】:

通常您应该像这样在生产环境中运行节点应用程序:

NODE_ENV=production node app.js

带有 Express、Socket.IO 等的应用程序使用process.env.NODE_ENV 来判断环境。

在开发中,您可以省略它并使用node app.js 正常运行应用程序。

您可以像这样在代码中检测环境:

var env = process.env.NODE_ENV || 'development';
loadConfigFile(env + '.json', doStuff);

资源:

How do you detect the environment in an express.js app?

【讨论】:

  • 在 Express 3.x 和 4.x 中,env 变量由 express 本身 here 设置为 development
  • 在现代版本的原始节点(没有 express)中,这个值也设置为development。你能更新这个 sn-p 以反映新的默认值吗?
【解决方案3】:

实际上,我不建议将数据库连接信息、密码、访问令牌等配置值存储在实际应用程序代码中,原因如下:

  1. 硬编码这些值使得以后很难更改它们。您必须发布新版本的应用程序才能更改这些值。

  2. 这是严重的安全违规行为,因为不应将生产级配置数据和密码存储在代码中。这些敏感数据很容易泄露。

更好的方法是将这些数据外部化并在执行期间将其传递给您的应用程序。这通常通过环境变量来完成。您只需为需要在不同环境之间更改的每个数据和平定义唯一的环境变量。

例如:DB_HOSTDB_USERDB_PASSWORD。然后,您可以通过这种方式将这些值传递给生产中的应用程序:

$ NODE_ENV=production DB_HOST=1.2.3.4 DB_USER=someusername DB_PASSWORD=somerandompassword /bin/node app.js

实际上,这些值可以加密并添加到代码库中,然后在部署期间解密。但是,请确保解密密钥安全地存储在部署系统中或由发布工程师以交互方式提供。 Shippable allows to do this 开箱即用。

在开发环境中变得更简单了,因为你可以使用非常方便的dotenv module。只需在项目的根目录中创建一个.env 文件并将所有变量添加到其中:

DB_HOST=1.2.3.4
DB_USER=someusername
DB_PASSWORD=somerandompassword

但是,请确保将其从您的 VCS 中排除,因为每个开发人员都可能希望拥有个人配置。您可以创建一个.env.dist 文件来包含默认配置,以后可以将其用作模板:cp .env.dist .env

【讨论】:

  • 具有禁用身份验证(登录名/密码)的 ubuntu(最常用的操作系统)可以完成这项工作吗?通过 ssh 将 .env 安全复制到您的 vps 并且安全环境变量非常节省?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
相关资源
最近更新 更多