Может ли nginx переслать Pylons, игнорировать ответ, вернуть альтернативный ответ? - PullRequest
0 голосов
/ 05 марта 2010

Один из моих URL-адресов предназначен для отслеживания файлов cookie. В базовой конфигурации контроллер pylons анализирует строку запроса, выполняет запрос к БД и соответственно устанавливает cookie.

Я хочу перейти на nginx. Мне интересно, возможно ли это:

  1. nginx извлекает значение cookie из memcached
  2. nginx записывает заголовки и обслуживает статический файл
  3. nginx возвращает ответ
  4. nginx передает запрос на пилоны для регистрации
  5. nginx игнорирует реакцию пилонов

Возможно ли какое-либо изменение этого? Я пытаюсь отделить запрос от задержки входа в контроллер pylons, потому что ответ в конечном итоге является статическим файлом с определенным заголовком cookie.

Спасибо!

1 Ответ

2 голосов
/ 07 марта 2010

Сценарий, который вы описали, вряд ли возможен "как есть". Проблемы:

  • Насколько мне известно, Nginx не может читать cookie из memcached. Он может передавать только тело ответа.
  • Nginx действительно может вызывать "post_action", но эта функция находится в бета-версии, и вам лучше ее избегать.

Честно говоря, я не совсем понимаю, какие куки вы собираетесь записывать в 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;
}
...