Nginx分离了子请求

时间:2013-03-11 03:39:31

标签: nginx lua

我需要对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这样的解决方案发出了一个操作系统调用来卷曲,但如果可能的话我不想这样做。

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

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

1 个答案:

答案 0 :(得分:4)

  

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

查看ngx.eof()文档。

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