Nginx:响应处理和带缓存的反向代理

时间:2013-09-05 13:32:27

标签: nginx lua

我正在运行Nginx作为一个简单的反向代理和缓存,现在我想根据收到的响应(正文不是标题)设置一些标题。

看起来很简单得到了location_capture_by Lua这样做但似乎我无法让缓存正常工作。

初始设置为:

location / {
..
try_files $uri @upstream_server
}

location @upstream_server {
      proxy_pass "http://web_lb";
      proxy_cache small;
      proxy_cache_methods POST;
      proxy_cache_key "$request_uri|$request_body";
      client_max_body_size 500M;
      add_header X-Cached $upstream_cache_status;
      set_real_ip_from   10.86.102.0/24;
      real_ip_header      X-Forwarded-For;
      proxy_ignore_headers Set-Cookie;
      proxy_ignore_headers Cache-Control;
}

将其更改为:


location /{
 content_by_lua '
     local res = ngx.location.capture(
                "/new-location",
                { method = ngx.HTTP_POST, body = ngx.var.request_body})
     #update response body here and header etc based on content
      ngx.say(res.body)
      '; }

location new-location{
try_files $uri @upstream_server
}

location @upstream_server {
      proxy_pass "http://web_lb;"
      proxy_cache small;
      proxy_cache_methods POST;
      proxy_cache_key "$request_uri|$request_body";
      client_max_body_size 500M;
      add_header X-Cached $upstream_cache_status;
      set_real_ip_from   10.86.102.0/24;
      real_ip_header      X-Forwarded-For;
      proxy_ignore_headers Set-Cookie;
      proxy_ignore_headers Cache-Control;
}

==

我发现我丢失了所有原始标头,作为Proxy_Header处理的一部分添加了一个标头,包括upstream_cache_status标头。但是我发现Nginx仍然提供来自缓存本身的重复请求。

为什么会出现这种情况?我也是这里的早期首发,这是一些基本陷阱的借口。

1 个答案:

答案 0 :(得分:0)

实际上,location.capture不是为了做你正在做的事情而设计的,但是,如果我告诉你(你想发送浏览器发送给你的子请求的标题),你可能会使用ngx.ctx +破解它设置;)

但我会说这是一种非常肮脏的方式。