ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: memcache_key и HTTP Accept-Language


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: memcache_key и HTTP Accept-Language
  • From: "Sergey Shepelev" <temotor@xxxxxxxxx>
  • Date: Thu, 4 Dec 2008 01:28:12 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:references; bh=4xx6LUpYme9Mc9GWZSdS/+LM5c6kIkJXhIq4OMMQ7Pk=; b=LLQvLEvPsOffgZrEQ0Nt4+yXXC+sVXvyFztnjm/AwouHJ1Eut7xmxmVskgwSunRlM/ ra3KYUgdXAdN9qTde7W4gSx9CAzidguOA3RHZbGJl+hDAVCiaWiho/CPnW9g/Jmasu4N hFdSkygKX6xIL0Zg4ShlRRDt49j4apN9kXwHU=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :references; b=LH0nVLnxHAyPz6KgfpSD7etzdEFTpm1kbyVrZ2891AOIJ27zkgrteV+i72t2oXIJW4 v83pCC36fYsDkMidbvPte7T+qRo8kSj3M1aNJa/X1HaUpF14w5nQZt2lOOg9Wme0we9p wDOtPYFCk+ojL7z8OCzWl1aA2O7YdbGXpnlD0=
  • In-reply-to: <1544765242.20081203221221@xxxxxxxxxxxxx>
  • References: <2d8fb9950812030554j4075e022t9a96005a16894425@xxxxxxxxxxxxxx> <1544765242.20081203221221@xxxxxxxxxxxxx>

Спасибо, здорово.
set оказался мощнее чем я думал.

Только если правильно понимаю, ваш код неправильно обработает случай

Accept-Language: en;q=0.9,ru;q=0.8

то есть выберет русский, хотя юзер предпочитает английский. Но
проблема глубже - бекенд не знает своего решения, относительно какой
именно язык будет использован (там есть бекенд второго уровня, который
отдает контент взамен на домен и список языков), поэтому он может
положить в кеш контент по ключу списка языков, например домен#en,ru

Т.е. что-то вроде

if ($http_accept_language ~*
"^(\w\w)-?\w?\w?(;q=\*|;q=\d\.\d),?(\w\w)-?\w?\w?(;q=\*|;q=\d\.\d),?(\w\w)-?\w?\w?(;q=\*|;q=\d\.\d),?")
{
  set $hislang "$1,$3,$5"
}

но нужны все языки, а не первые 3. И что будет, если указаны только
один/два? "en,," "en,ru," ?

Я понимаю, что больше двух языков в настройках почти никогда не бывает.
Также я вижу несколько прагматичных решений с разными ограничениями,
типа всё-таки брать первые два языка, остальных юзеров обрабатывать
медленными бекендами, благо всё равно запас производительности
большой. Но как всегда хочется чтоб и красиво и быстро и дешево.

2008/12/3 Михаил Монашёв <postmaster@xxxxxxxxxxxxx>:
> Здравствуйте, Сергей.
>
> Хост и язык можно регэкспами через set установить
> http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#set
>
> и из эти новых переменных потом формировать $memcached_key:
>
>    set  $myhost  $host;
>    if ($host ~* "^.*\.([^.]+\.[^.]{2-4})$" ) {
>        set  $myhost  $1;
>    }
>    set  $mylang  "en";
>    if ($http_accept_language ~* "ru" ) {
>        set  $mylang  "ru";
>    }
>    $memcached_key "parked#$myhost#$mylang"
>
> SS> Парковка доменов. Имеется маленькая кучка fastcgi бекендов, которые
> SS> генерят динамику в зависимости от запрошенного HTTP Host и
> SS> Accept-Language.
> SS> На морде стоит nginx шестой ветки и проксирует всё подряд на бекенды.
> SS> Которые либо отдают страничку из кеша, либо генерят и кладут в кеш.
>
> SS> Так как бекенды по сравнению с nginx сильно медленные в целом и
> SS> неасинхронные, хочется не проксировать *каждый* запрос на них, а
> SS> задействовать http_memcached_module.
> SS> Не знаю как составить ключ $memcached_key "parked#test-host.tld#ru,en"
> SS> из заголовков
>
> SS> Host: test-host.tld
> SS> Accept-Language: ru-ru;q=1.0,en-us;q=0.9,*;q=0.8
>
> SS> хост понятно, это $host. И то, от него надо откусить www. если есть.
>
> SS> Уверен, что многие сталкивались с такой задачкой. Есть ли готовые рецепты?
>
> SS> Писать свой сишный модуль не подходит.
>
> SS> Решаема ли задача в таких условиях?
>
>
>
>
>
> --
>
> С уважением,
> Михаил Монашёв, SoftSearch.ru
> mailto:postmaster@xxxxxxxxxxxxx
> ICQ# 166233339
> http://michael.mindmix.ru/
> Без бэкапа по жизни.
>
>
>


 




Copyright © Lexa Software, 1996-2009.