Next.js でサーバー キャッシュを構成する

App Hosting のほとんどの Next.js アプリは、通常の Next.js のデフォルトを維持できます。ただし、インスタンスで Memory limit exceeded エラーが発生した場合は、experimental.isrFlushToDisk: false を設定してキャッシュをメモリに保持し、インスタンスが再起動しないようにする必要があります。

デフォルトでは、Next.js は、Incremental Static Regeneration(ISR)で生成されたページ、ルートハンドラのレスポンス、フェッチ結果など、実行時にレンダリングするページとデータをキャッシュに保存します。メモリに保持されるだけでなく、アプリの .next ディレクトリ内のファイルにも書き込まれます。Next.js はこれらのファイルを削除しません。

App Hosting では、アプリは Cloud Run で実行され、ファイル システムはメモリ内にあります。書き込まれたファイルは、インスタンスがシャットダウンするまで、各サービス インスタンス(memoryMiB)に割り当てられたメモリにカウントされます。アプリが実行時に多数の異なるページをレンダリングする場合(ビルド時に生成されないパラメータを持つ動的ルートなど)、インスタンスがメモリ上限を超えて再起動することがあります。Cloud Run は、Memory limit of 512 MiB exceeded with 515 MiB used のようなエラーをログに記録します。詳細については、ファイル システム アクセスに関する Cloud Run のドキュメントをご覧ください。

キャッシュをメモリに保持する

Next.js がキャッシュをファイル システムに書き込まないようにするには、next.config.js ファイルで experimental.isrFlushToDisk を false に設定します。

// @ts-check

/** @type {import('next').NextConfig} */
const nextConfig = {
  experimental: {
    isrFlushToDisk: false,
  },
};

module.exports = nextConfig;

Next.js は、キャッシュに保存されたコンテンツをメモリにのみ保持し(最大 cacheMaxMemorySize、デフォルトは 50 MB)、キャッシュがいっぱいになると、最も長く使用されていないエントリを削除します。各サービング インスタンスには独自のキャッシュがあり、インスタンスが再起動すると失われます。

これらの変更を含む commit を作成し、ライブ ブランチに push します。次に、App Hosting のロールアウトが完了するまで待ちます。