Nginx 分离子请求

我需要对由 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](https://github.com/perusio/drush-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)
        ';
    }
}
点赞
用户2060502
用户2060502

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

看一下ngx.eof()的文档。

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

2013-03-11 09:23:49