Rack は、ファイルアップロードなど、multipart なコンテントタイプのリクエストを処理するときに、送られてきたデータをテンポラリファイルとして保存する。
https://github.com/rack/rack/blob/1.6.4/lib/rack/multipart/parser.rb#L21-L22
https://github.com/rack/rack/blob/1.6.4/lib/rack/multipart/parser.rb#L135
ruby の Tempfile クラスを使ってテンポラリファイルを作っている。Tempfile は #close!
(または #close(true)
)したらテンポラリファイルも削除するが、そうでないと GC されるかアプリケーションが終了するまで残り続けてしまう。
https://github.com/ruby/ruby/blob/v2_2_0/lib/tempfile.rb#L180-L183
https://github.com/ruby/ruby/blob/v2_2_0/lib/tempfile.rb#L131
すぐに close! してくれないかなー、と Rack を眺めていたら、Rack::TempfileReaper というものがあった。Eliminate dependency on garbage collection for cleanup of Tempfiles created by Rack for multipart form data という PR で入ったらしい。
config/application.rb あたりに config.middleware.use Rack::TempfileReaper
と書いてこいつを使うようにしておけば、リクエストで使った Tempfile を close! してくれる。結果テンポラリファイルもすぐに消える