我们最近发现了 nginxespost_action
。
我们想知道,如果代理缓存命中,是否有办法使用该指令?
我们希望的流程如下:
1) User request comes in
2) If cache HIT goto A / If cache MISS goto B
A) 1) Serve Cached Result
A) 2) post_action to another url on the backend
B) 1) Server request from backend
B) 2) Store result from backend
有什么想法是否可以通过 post_action 或任何其他方法实现?
其背后的原因如下:
我们本质上想在显示缓存内容时修改用户会话(php,但相同的概念可以应用于大多数服务器端语言)。这将大大增加我们处理的可缓存请求的数量,因为这些请求只写入会话,而不是从会话中读取。
谢谢!
答案1
如果您还没有解决这个问题,这里有一个符合您要求的示例配置:
服务器 { 听80; 服务器名称img1.example; 根目录/var/www/图像; location / { // 用户请求进入 try_files $uri @proxy; // 如果缓存命中,则转到 A(显示)/ 如果缓存未命中,则转到 B(@proxy),服务器缓存结果 post_action /url.php; // post_action 到后端的另一个 url } 位置@proxy { proxy_pass http://static.exmaple; //来自后端的服务器请求 proxy_store /var/www/images$uri; // 存储后端的结果(缓存) } }
答案2
我还没有测试过,但你可以用try_files。
location / {
post_action /update-session;
try_files $uri @cachemiss;
}
location @cachemiss {
#pass to relevant backend
post_action off; #this may or may not be needed... is post_action cleared when we change location blocks?
}
location /update-session {
#pass to session update script
}
我们做出的另一个假设是 post_action 接收与父请求相同的所有 HTTP 标头。