在发布任何 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
这样的工具来确保您的应用程序服务器在崩溃时会重新启动。无论您选择哪个守护进程,您都需要确保它按照上述方式启动服务器。