在发布任何 web 应用程序之前,您应该问问自己一些问题
sails.log() 与像 Papertrail 这样的托管服务结合使用?NODE_ENV 环境变量设置为“production”的情况下在本地提升?(快速测试的方法是运行 NODE_ENV=production node app (或者,作为捷径:sails lift --prod)。)您可以以 几种不同的方式 提供仅在生产中适用的配置。大多数应用程序会发现自己同时使用环境变量和 config/env/production.js。无论您采用哪种方式,本节和文档的 扩展部分 都涵盖了您在进入生产之前应该查看的配置设置。
Node.js 非常快。对于许多应用程序来说,一台服务器足以处理预期的流量,至少最初是这样。
本节重点介绍单服务器 Sails 部署。这种部署在规模上固有地有限制。有关在负载均衡器后部署 Sails/Node 应用的信息,请参阅 扩展。
许多团队决定将他们的生产应用程序部署在负载均衡器或代理后面(例如,在 Heroku 或 Now 这样的 PaaS 中,或者在 nginx 服务器后面)。这通常是正确的方法,因为它有助于让您的应用程序为未来做好准备,以防您的可扩展性需求发生变化,并且您需要添加更多服务器。如果您使用的是负载均衡器或代理,则下面的列表中有一些内容可以忽略。
如果您的应用程序使用套接字并且您使用的是 nginx,请确保将其配置为将 websocket 消息中继到您的服务器。您可以在 nginx 有关该主题的文档 中找到有关代理 WebSockets 的指南。
NODE_ENV 环境变量设置为 'production'将您的应用程序的环境配置设置为 'production' 会告诉 Sails 准备好迎接挑战,即您的应用程序正在生产环境中运行。这是毫无疑问的最重要的一步。如果您只有时间在部署 Sails 应用之前更改一个设置,这应该是那个设置!
当您的应用程序在生产环境中运行时
migrate: 'safe'。这是一个保险措施,可以防止在部署过程中意外损坏您的生产数据。.css 和 .js 文件,以减少页面加载时间并降低带宽消耗。res.serverError() 的错误消息和堆栈跟踪仍将记录,但不会在响应中发送(这是为了防止潜在的攻击者访问任何敏感信息,例如加密密码或您的 Sails 应用程序在服务器文件系统上的位置)。注意:如果您通过其他方式将
sails.config.environment设置为'production',那也没关系。请注意,Sails 可能会自动将NODE_ENV环境变量设置为'production',或者它会记录警告,因此请注意控制台!这个环境变量之所以如此重要,是因为它是 Node.js 中的通用约定,无论您使用的是哪个框架。Sails 中的内置中间件和依赖项期望NODE_ENV在生产中设置,否则它们会使用为开发使用而设计的效率较低的代码路径。
sails.config.sockets.onlyAllowOrigins 值如果您已为您的应用程序启用套接字(即,您已安装 sails-hook-sockets 模块),那么出于安全原因,您需要将 sails.config.sockets.onlyAllowOrigins 设置为允许通过 websockets 连接到您的应用程序的源数组。您可能需要在应用程序的 config/env/production.js 文件中设置它。有关 onlyAllowOrigins 的更多信息,请参阅 套接字配置文档。
无论是使用 sails_port 环境变量、设置 --port 命令行选项还是更改您的生产配置文件,请将以下内容添加到 Sails 配置的顶层
port: 80
如上所述,如果您的应用程序将在负载均衡器或代理后面运行,请忽略此步骤。
如果您的应用程序的所有模型都使用默认数据存储,那么设置生产数据库就像在 config/env/production.js 文件中使用正确的设置配置 sails.config.datastores.default 一样简单。
如果您的应用程序使用多个数据库,您的过程将类似。对于应用程序使用的每个数据存储,在 config/env/production.js 中的 sails.config.datastores 字典中添加一个项目。
请记住,如果您使用的是版本控制(例如 git),那么如果您在应用程序的配置文件中包含任何敏感凭据(例如数据库密码),这些凭据将被检入存储库。解决此问题的常见方法是将某些敏感配置设置作为环境变量提供。有关更多信息,请参阅 配置。
如果您使用的是关系型数据库(例如 MySQL),则需要执行一个额外的步骤。还记得 Sails 在生产中运行时如何将所有模型设置为 migrate:safe 吗?这意味着在提升应用程序时不会运行自动迁移……这意味着默认情况下您的表将不存在。在为您的 Sails 应用程序首次设置关系型数据库期间处理此问题的常见方法如下
frenchfryparty)。'production',并将模型的配置保留为 migrate: 'alter'。现在运行 sails lift 一次,并在本地服务器完成提升后,将其关闭。如果这使您感到紧张,或者您无法远程连接到生产数据库,您可以跳过上述步骤。相反,只需将您的本地模式转储并将其导入到生产数据库中。
保护免受 CSRF 攻击是 Sails 应用程序的重要安全措施。如果您还没有在启用 CSRF 保护的情况下进行开发(请参阅 sails.config.security.csrf),请确保在进入生产环境之前 启用 CSRF 保护。
如果您的 API 或网站执行任何需要身份验证的操作,您应该在生产环境中使用 SSL。要将您的 Sails 应用程序配置为使用 SSL 证书,请使用 sails.config.ssl。
如上所述,如果您的应用程序将在负载均衡器或代理后面运行,请忽略此步骤。
部署的最后一步实际上是启动服务器。例如
NODE_ENV=production node app.js
或者,如果您更习惯使用命令行选项,您可以使用 --prod
node app.js --prod
# (Sails will set `NODE_ENV` automatically)
如您所见,您应该使用 node app.js 在生产环境中启动 Sails 应用程序,而不是 sails lift。这样,您的应用程序就不再依赖于访问 sails 命令行工具,而是运行捆绑在 Sails 应用程序中的 app.js 文件(它执行相同的事情)。
除非您要部署到像 Heroku 这样的 PaaS,否则您将需要使用像 pm2 或 forever 这样的工具来确保您的应用程序服务器在崩溃时会重新启动。无论您选择哪个守护进程,您都需要确保它按照上述方式启动服务器。