204レスポンスを返しつつ、ミラーリングを送信するNginxの設定

2024/10/25に公開

はじめに

誤った内容/改善案等ございましたら、フィードバックを歓迎します。

実現したかったこと

nginxをリバースプロキシとして利用しているケースを前提としています。

  • clientに対してはnginxから204レスポンスを返しつつ
  • ミラーリクエストをバックエンドに転送する

というデータの流れを実現したかったです。

以下のような用途が考えられます。

  • クライアントに対しては空のレスポンスを返しつつ、バックエンドの動作確認を行う

結論:正しく動作した設定

以下が設定の結論です。

location / { # ポイント 1
    error_page 404 = @nocontent; # ポイント 2
    mirror /mirror; # ポイント 3
}
location /mirror {
  internal;
  proxy_pass http://backend:3000$request_uri;
  
}   
location @nocontent {
    return 204;
}

ポイント 1: / に対する設定

location / に対して特定のリソースを指定していないため、通常はHTTPステータスコード404(Not Found)が返されます。

ポイント 2: 404エラーページの処理

error_page 404 = @nocontent; によって、クライアントへのレスポンスが404の場合に、@nocontentという名前付きロケーションが呼び出され、204 No Contentレスポンスが返されます。

ポイント 3: リクエストのミラーリング

mirror /mirror; ディレクティブにより、クライアントのリクエストはバックエンドサーバにミラーされます。クライアントへはこのリクエストの結果がレスポンスされることはなく、バックエンドの動作確認にのみ使われます。

補足説明

mirrorディレクティブの役割:

mirror はリクエストを複製し、指定されたロケーションに送りますが、クライアントへのレスポンスには影響を与えません。この設定によって、バックエンドの動作を確認しつつクライアントには204レスポンスを返すことが可能です。

internalディレクティブの使用

/mirror に対するリクエストは外部から直接アクセスできないように、internalディレクティブを指定しています。これにより、クライアントから直接アクセスできないセキュアなリクエストが行われます。

おわりに

この設定についての情報はインターネット上で見つけるのが難しく、試行錯誤の末に「結論」で示した設定にたどり着きました。
改善点や別のアプローチについてのフィードバックをお待ちしています。

Discussion