nginx能否转发到Pylons,忽略响应,返回替代响应?

0 投票
1 回答
874 浏览
提问于 2025-04-15 20:01

我有一个网址是用来跟踪cookie的。在基本的设置中,pylons控制器会解析查询字符串,进行数据库查询,然后相应地设置cookie。

我想换到nginx。我在想这样做是否可行:

  1. nginx从memcached获取cookie的值
  2. nginx写入响应头并提供静态文件
  3. nginx返回响应
  4. nginx把请求传给pylons进行日志记录
  5. 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;
}

撰写回答