部署
部署 AdonisJS 应用程序与部署任何其他 Node.js
应用程序没有什么不同。首先,你需要一个可以安装和运行 Node.js
且版本大于等于 v14
的服务器或平台。
注:要获得顺畅的部署体验,你可以尝试 Clewr, 它是一项服务器配置服务,并为部署 AdonisJS 应用程序提供一流的支持。
免责声明:Cleavr 是 AdonisJS 的赞助商。
将 TypeScript 编译为 JavaScript#
AdonisJS 应用程序是用 TypeScript 编写的,并且必须在部署期间编译为 JavaScript。你可以直接在生产服务器上编译应用程序,或在 CI/CD 管道中执行构建步骤。
你可以通过运行以下 Ace 命令来构建你的 生产代码,编译后的 JavaScript 输出写在 build
目录中。
node ace build --production
如果你已经在 CI/CD 管道中执行了构建步骤,那么你可以只将 build
文件夹移动到生产服务器并直接在服务器上安装生产依赖项。
启动生产服务器#
你可以通过运行 server.js
文件来启动生产服务器。
如果你已经在生产服务器上执行了构建步骤,请确保首先 cd
进入 build
目录,然后启动服务器。
cd build
npm ci --production
# 启动服务器
node server.js
如果构建步骤是在 CI/CD 管道中执行的,并且 你仅将 build
文件夹复制到生产服务器 ,则 build
目录将成为应用程序的根目录。
npm ci --production
# 启动服务器
node server.js
使用进程管理器#
在基础服务器上管理 Node.js
应用程序时,建议使用进程管理器。
进程管理器确保在应用程序在运行时崩溃时重新启动应用程序。此外,一些流程管理器 (如 PM2 ) 还可以在重新部署应用程序时执行优雅的重启。
以下是 PM2 的 ecosystem 文件 示例。
module.exports = {
apps: [
{
name: 'web-app',
script: './build/server.js',
instances: 'max',
exec_mode: 'cluster',
autorestart: true,
},
],
}
Nginx 反向代理#
当在基础服务器上运行 AdonisJS 应用程序时,出于 许多不同的原因,你必须将其放在 Nginx (或类似的 Web 服务器) 之后,其中最重要的原因之一是 SSL 端接。
注:请务必阅读 受信任的代理指南 以确保在代理服务器之后运行 AdonisJS 应用程序时可以访问访问者的正确 IP 地址。
以下是 Nginx 配置的示例,用于代理对你的 AdonisJS 应用程序的请求。 确保替换尖括号 <>
内的值。
server {
listen 80;
server_name <APP_DOMAIN.COM>;
location / {
proxy_pass http://localhost:<ADONIS_PORT>;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
数据库迁移#
使用 node ace migration:run --force
命令可以迁移你的生产数据库。在生产环境中运行迁移时,--force
标志是必需的。
何时迁移#
此外,最好总是在重新启动服务器之前运行迁移。然后,如果迁移失败,请不要重新启动服务器。
使用像 Cleavr 或 Heroku 这样的托管服务,他们可以自动处理这个用例。否则,你将不得不在 CI/CD 管道中运行迁移脚本或通过 SSH 手动运行它。
不要在生产中回滚#
迁移文件中的 down
方法通常包含破坏性操作,例如 drop the table 或 remove a column 等等。建议在 config/database.ts
文件中关闭生产中的回滚。
在生产中关闭回滚将会导致 node ace migration:rollback
命令错误。
{
pg: {
client: 'pg',
migrations: {
disableRollbacksInProduction: true,
}
}
}
避免并发迁移任务#
当在多个服务器上部署 AdonisJS 应用程序时,请确保只从一个服务器运行迁移,而不是所有服务器。
对于 MySQL 和 PostgreSQL,Lucid 将获取 咨询锁 以确保不允许并发迁移。但是,最好首先避免从多个服务器运行迁移。
用于文件上载的持久存储#
现代的部署平台,如 Amazon ECS、Heroku 或 DigitalOcean apps 在一个 临时文件系统 中运行你的应用程序代码,这意味着每次部署都将摧毁现有的文件系统并创建一个新的文件系统。
如果将用户上传的文件存储在与应用程序代码相同的存储中,你将丢失该文件。因此,必须考虑使用 Drive 将用户上传的文件保存在 Amazon S3 或谷歌云存储服务上。
日志记录#
AdonisJS Logger 将日志以 JSON 格式写入 stdout
和 stderr
。你可以设置外部日志记录服务以从 stdout/stderr 读取日志,或者将它们转发到同一服务器上的本地文件。
框架核心和生态系统包在 trace
级别写入日志。因此,在调试框架内部时,你必须将日志记录级别设置为 trace
。
调试数据库查询#
当数据库调试打开时,Lucid ORM 会触发 db:query
事件。你可以使用 Logger 侦听此事件并调试 SQL 查询。
以下是在开发中优雅的打印数据库查询并在生产中使用 Logger 的示例。
# start/event.ts 文件
import Event from '@ioc:Adonis/Core/Event'
import Logger from '@ioc:Adonis/Core/Logger'
import Database from '@ioc:Adonis/Lucid/Database'
import Application from '@ioc:Adonis/Core/Application'
Event.on('db:query', (query) => {
if (Application.inProduction) {
Logger.debug(query)
} else {
Database.prettyPrint(query)
}
})
环境变量#
你必须确保生产环境变量的安全,并且不要将它们与应用程序代码放在一起。如果你使用的是部署平台,如 Clewr、Heroku 等,则必须从它们的 Web 仪表板管理环境变量。
在基础服务器上部署代码时,你可以将环境变量保存在 .env
文件中。该文件也可以存在于应用程序代码库之外,但请确保使用 ENV_PATH
环境变量通知 AdonisJS 它的位置。
cd build
ENV_PATH=/etc/myapp/.env node server.js
缓存视图#
你必须使用 CACHE_VIEWS
环境变量在生产环境中缓存 Edge 模板,模板在运行时缓存在内存中,不需要预编译。
CACHE_VIEWS=true
静态资源访问#
有效地服务静态资产对于应用程序的性能至关重要。无论你的 AdonisJS 应用程序有多快,静态资源的访问对于更好的用户体验都起着重要作用。
使用 CDN 服务#
最好的方法是使用 CDN 从你的 AdonisJS 应用程序访问静态资源。
使用 Webpack Encore 编译的前端资产经过指纹认证,这允许你的 CDN 服务器主动缓存它们。
根据你使用的 CDN 服务和你的部署技术,你可能需要在部署过程中添加一个步骤,将静态文件移动到 CDN 服务器,简而言之,这就是它应该如何运作。
创建生产版本时,更新
webpack.config.js
使用 CDN URL。if (Encore.isProduction()) { Encore.setPublicPath('https://your-cdn-server-url/assets') Encore.setManifestKeyPrefix('assets/') } else { Encore.setPublicPath('/assets') }
照常构建你的 AdonisJS 应用程序。
将
public/assets
的内容复制到你的 CDN 服务器。 例如,这个命令 是我们用来将静态资源发布到 Amazon S3 存储桶的命令。
使用 Nginx 传输静态文件#
另一种选择是将传输静态资源的任务转移给 Nginx。如果你使用 Webpack Encore 来编译前端资源,你必须积极地缓存所有静态文件,因为它们是指纹的。
将以下代码块添加到你的 Nginx 配置文件中。请确保替换尖括号 <>
中的值
location ~ \.(jpg|png|css|js|gif|ico|woff|woff2) {
root <ADONISJS 应用的 public 目录>;
sendfile on;
sendfile_max_chunk 2mb;
add_header Cache-Control "public";
expires 365d;
}
使用 AdonisJS 静态文件服务器#
你还可以依靠 AdonisJS 内置的静态文件服务器来提供来自 public
目录的静态资源,以使事情变得简单。
无需额外配置。只需像往常一样部署你的 AdonisJS 应用程序,静态资源请求就会自动处理。但是,如果你使用 Webpack Encore 编译前端资产,则必须使用以下选项更新 config/static.ts
文件。
{
// ... 其余的配置
maxAge: '365d',
immutable: true,
}
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。