Heroku

将 Nitro 应用部署到 Heroku。

预设: heroku

Read more in heroku.com.

#使用 Heroku CLI

创建一个新的 Heroku 应用。

heroku create myapp

配置 Heroku 使用 nodejs 构建包。

heroku buildpacks:set heroku/nodejs

配置你的应用。

heroku config:set NITRO_PRESET=heroku

确保在 package.json 文件中有 startbuild 命令。

"scripts": {
  "build": "nitro build", // 如果使用 nuxt 则为 `nuxt build`
  "start": "node .output/server/index.mjs"
}

#使用 Nginx

将 Nitro 配置中的预设更改为 node_middleware

nitro.config.ts
import { defineConfig } from "nitro";

export default defineConfig({
  preset: "node_middleware",
})

或者,如果你使用的是 Nuxt:

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: "node_middleware",
  },
})

如构建包文档的现有应用部分所述,需要完成以下两个关键步骤才能正常运行:

  • /tmp/nginx.socket 上监听套接字
  • 在应用准备好接受连接时创建文件 /tmp/app-initialized

创建一个自定义应用运行器(例如,在项目根目录下创建 apprunner.mjs)。在此文件中,使用 node_middleware 预设生成的中间件创建服务器,然后按照构建包文档中的详细说明监听套接字:

import { createServer } from 'node:http'
import { middleware } from './.output/server/index.mjs'

const server = createServer(middleware)

server.listen('/tmp/nginx.socket') //遵循构建包文档

要创建 /tmp/app-initialized 文件,请使用 Nitro 插件(例如,在项目根目录下创建 initServer.ts):

import fs from "node:fs"
import { definePlugin } from "nitro"

export default definePlugin((nitroApp) => {
   if((process.env.NODE_ENV || 'development') != 'development') {
      fs.openSync('/tmp/app-initialized', 'w')
   }
})

最后,在项目根目录下创建一个 Procfile。它会告知 Heroku 启动 nginx,并使用自定义的 apprunner.mjs 启动服务器:

Procfile
web: bin/start-nginx node apprunner.mjs

附加内容:创建一个 config/nginx.conf.erb 文件来定制你的 nginx 配置。默认情况下,node_middleware 预设不会生成静态文件处理程序,因此你可以通过向服务器代码块中添加正确的 location 规则,让 nginx 提供静态文件。或者,将 serveStatic 设置为 true,强制预设生成静态文件处理程序。