NGinx によって提供される画像に対して時間のかかる処理を行う必要があり、部分的に処理された画像をキャッシュからすばやく応答できるようにしたいと考えています。
私がしたいの手順は次のとおりです。
- ユーザーが画像 A を最初に要求する
- ユーザーは何も処理せずに画像 A を取得します
- 接続が解放されました
- 画像 A がキャッシュに置かれる (A0)
- 「切り離された」サブリクエストが開始される(S1)[1回目の画像変換]
- サブリクエスト S1 が完了するまで、画像 A に対するすべてのリクエストは A0 を取得します
- サブリクエスト S1 が完了すると、キャッシュ値がその結果に置き換えられます (A1)
- これ以降、画像 A のすべてのリクエストは A1 を取得します
- 「切り離された」サブリクエストが開始される(S2)[2回目の画像変換]
- サブリクエスト S2 が完了するまで、イメージ A に対するすべてのリクエストは A1 を取得します
- サブリクエスト S2 が実行されると、キャッシュ値がその結果に置き換えられます (A2) 。. . 等々
NGinx Lua モジュールを使用して画像を処理していますが、proxy_cache 機能 (LRU クリーンアップ、TTL など) を使用できるようにしたいと考えています。
proxy_pass、post_action、および ngx.location.capture を使用してみましたが、それらはすべてサブリクエストが終了して接続を閉じるのを待ちます。Drupal Cache Warmerのように、curl への OS 呼び出しを発行するソリューションをいくつか見てきましたが、できればそうしたくありません。
これはこれまでの私のテストケースです
server {
listen 8080;
location / {
rewrite_by_lua '
ngx.say(".")
--res = ngx.location.capture("/internal")
ngx.exit(ngx.OK)
';
proxy_pass http://127.0.0.1:8080/internal;
}
location /internal {
content_by_lua '
ngx.log(ngx.ERR, "before")
ngx.sleep(10)
ngx.say("Done")
ngx.log(ngx.ERR, "after")
ngx.exit(ngx.OK)
';
}
}