nginx能否转发到Pylons,忽略响应,返回替代响应?
我有一个网址是用来跟踪cookie的。在基本的设置中,pylons控制器会解析查询字符串,进行数据库查询,然后相应地设置cookie。
我想换到nginx。我在想这样做是否可行:
- nginx从memcached获取cookie的值
- nginx写入响应头并提供静态文件
- nginx返回响应
- nginx把请求传给pylons进行日志记录
- nginx忽略pylons的响应
这样的变动是否可行?我想把请求和pylons控制器中记录日志的延迟分开,因为最终的响应只是一个带有特定cookie头的静态文件。
谢谢!
1 个回答
2
你描述的情况几乎不可能“照原样”实现。问题有:
- 据我所知,Nginx 不能从 memcached 读取 cookie,它只能传递响应的内容。
- Nginx 确实可以调用“post_action”,但这个功能还在测试阶段,最好还是避免使用。
坦白说,我不太明白你想在实际请求之前把什么 cookie 写入 memcached,可能你需要提供更多细节。
不过,Nginx 有很多功能可以帮助你,我来简单列举一些。
Nginx 可以返回一个空的 GIF,这个功能是内置的:
location /tracking {
empty_gif;
}
Nginx 的日志记录非常有效,你可以轻松定义日志格式,并将查询参数、请求和响应头写入日志:
log_format tracking '$remote_addr "$request" "$http_referer" $arg_param $upstream_x_track_id';
location /tracking {
access_log /var/log/tracking.log tracking buffer=16k;
proxy_pass http://upstream;
}
既然你打算使用 memcached,可能是想缓存响应,而这正是 Nginx 可以为你做的(我会给你一个使用代理的例子,但用 FastCGI 也可以):
proxy_cache_path /var/cache/nginx/cache_tracking keys_zone=tracking:20m;
location /tracking {
access_log /var/log/tracking.log tracking buffer=16k;
proxy_cache tracking;
proxy_cache_valid 200 1m; # Cache responses with code 200 for 1 minute
proxy_pass http://upstream;
}
你可以定义自己的缓存键,并且不把它传递给客户端:
location /tracking {
access_log /var/log/tracking.log tracking buffer=16k;
proxy_cache_key $upstream_x_track_id;
proxy_cache tracking;
proxy_cache_valid 200 1m; # Cache responses with code 200 for 1 minute
proxy_hide_header X-Track_Id;
proxy_pass http://upstream;
}