Как выбрать лаковый бэкэнд с inline-c

В зависимости от запроса uri я хочу пересылать запросы с лаком на разные серверы, используя данные из базы данных mysql. База данных содержит 2 поля: name и base_url. Если запрос отправляется на /forwards/%name%, я хочу перенаправить запрос на сервер/бэкэнд, определенный base_url. Сначала я попытался установить существующий бэкенд с помощью VRT_SetHdr, но это не сработало:

VRT_SetHdr(sp, HDR_REQ, "\010backend:", my_backend, vrt_magic_string_end);

Может быть, можно задать заголовок типа X-backend, а затем сделать выборку обычным VCL?

Я также хочу определить серверные части во время выполнения, используя те же данные из mysql. Это вообще возможно?


person Kai Mysliwiec    schedule 03.07.2013    source источник
comment
Другим решением может быть просто создание файлов VCL из данных базы данных и повторная загрузка их с помощью лака. Это может быть даже лучшим решением по соображениям производительности.   -  person Kai Mysliwiec    schedule 04.07.2013
comment
Хм, похоже, для этого есть запрос на функцию: лак -software.com/blog/   -  person Kai Mysliwiec    schedule 04.07.2013


Ответы (1)


Как вы говорите, вы можете переключать бэкэнды в VCL, если установлен заголовок, при условии, что все бэкэнды предварительно объявлены в VCL:

vcl_recv {
  # ...
  if ( req.http.X-backend ) {
    set req.backend = req.http.X-backend;
  }
  # ...
}

РЕДАКТИРОВАТЬ: Как указал @Bhaskar в своем комментарии, для каждого бэкэнда требуется дополнительный if из-за ограничений назначения структуры лака. Что-то типа:

vcl_recv {
  # ...
  if ( req.http.X-backend ) {
    if ( req.http.X-backend == "predefined" ) {
      set req.backend = "predefined";
    }
  }
  # ...
}
person NITEMAN    schedule 05.07.2013
comment
Это неправильно, вы не можете присвоить строку req.http.X-backend структуре типа backend. varnish -C -f <vcl file> должен отображать соответствующую ошибку. - person Bhaskar; 19.02.2014
comment
Вы правы, отдельный, если он нужен для каждого бэкэнда. Извините, я отредактирую свой ответ - person NITEMAN; 19.02.2014