5

我需要对 NGinx 提供的图像进行一些耗时的处理,并且我希望能够快速响应缓存中部分处理的图像。

以下是我想要的步骤:

  • 用户首次请求图像 A
  • 用户无需任何处理即可获得图像 A
  • 连接被释放
  • 图像 A 被放入缓存 (A0)
  • 启动“分离”子请求 (S1) [第一次图像转换]
  • 直到子请求 S1 完成,所有对图像 A 的请求都得到 A0
  • 当子请求 S1 完成时,缓存值被其结果替换 (A1)
  • 从现在开始,所有对图像 A 的请求都得到 A1
  • 启动“分离”子请求 (S2) [第二次图像转换]
  • 直到子请求 S2 完成,所有对图像 A 的请求都得到 A1
  • 当子请求 S2 完成时,缓存值将替换为其结果 (A2) 。. . 等等

我正在使用 NGinx Lua 模块来处理图像,并且我希望能够使用 proxy_cache 功能(LRU 清理、TTL 等)

我尝试过使用 proxy_pass、post_action 和 ngx.location.capture,但它们都在等待子请求完成以关闭连接。我见过一些像Drupal Cache Warmer这样的解决方案,它们会发出 OS 调用 curl,但如果可能的话,我不想这样做。

这是我到目前为止的测试用例

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)
        ';
    }
}
4

1 回答 1

4

我曾尝试使用 post_action 和 ngx.location.capture,但它们都在等待子请求完成以关闭连接。

看看ngx.eof()文档。

更新:http ://wiki.nginx.org/HttpLuaModule#ngx.eof

于 2013-03-11T09:23:49.183 回答