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
А в итоге сделали хитрую статистику, поэтому все запросы обязательно
попадают на бекенды.
К сожалению, никакой магии вроде узкоспециализированных регекспов или
перл-обработчика не было задействовано.
2008/12/5 Sergey Shepelev <temotor@xxxxxxxxx>:
> Отпишусь на следущей неделе когда будет тестовая нагрузка.
>
> 2008/12/5 Valery Kholodkov <valery+nginxru@xxxxxxxxxxx>:
>>
>> Я ошибся. Читать, конечно же, "Поэтому выбор en верен".
>>
>> Я просто слежу за ходом Ваших мыслей и пытаюсь выяснить, сможете ли Вы найти
>> элегантное решение существующими средствами.
>>
>> ----- Исходное сообщение -----
>> От: "Sergey Shepelev" <temotor@xxxxxxxxx>
>> Кому: nginx-ru@xxxxxxxxx
>> Отправленные: Четверг, 4 Декабрь 2008 г 18:10:58 GMT +01:00 Амстердам,
>> Берлин, Берн, Вена, Рим, Стокгольм
>> Тема: Re: memcache_key и HTTP Accept-Language
>>
>> Я написал de,en для краткости.
>> В этом (accept-language de,en) случае у юзера сломанный бравзер,
>> потому что формат заголовка не соблюдён, если вы хотите придираться.
>> Перефразируем это в
>>
>> Accept-Language: de;q=0.9,en;q=0.7
>>
>> и поведение не меняется, юзер предпочитает de.
>>
>> 2008/12/4 Valery Kholodkov <valery+nginxru@xxxxxxxxxxx>:
>>>
>>> В этом случае пользователь не предпочитает de, а предпочитает в равной
>>> степени как de, так и en. Поэтому выбор de верен.
>>>
>>> ----- Исходное сообщение -----
>>> От: "Sergey Shepelev" <temotor@xxxxxxxxx>
>>> Кому: nginx-ru@xxxxxxxxx
>>> Отправленные: Четверг, 4 Декабрь 2008 г 16:40:38 GMT +01:00 Амстердам,
>>> Берлин, Берн, Вена, Рим, Стокгольм
>>> Тема: Re: memcache_key и HTTP Accept-Language
>>>
>>> Да, я тоже думаю, что таких несравнимо мало.
>>>
>>> Но может быть accept-language de,en
>>> а владелец создаст контент для en и de.
>>> Мы увидим, что ru нету и попробуем взять en. А юзер предпочитает de.
>>>
>>> 2008/12/4 Борис Долгов <boris@xxxxxxxxxxx>:
>>>> А если просто проверять, начинается ли accept-encoding с ru? Если да -
>>>> ставить русский, если нет - ставить английский. Думаю, таких, кто будет
>>>> ходить с броузеров, где какой-нить mn;q=0.9;ru;q=0.8;en;q=0.7, несравненно
>>>> мало, чтобы ими пренебречь.
>>>>
>>>> 4 декабря 2008 г. 1:28 пользователь Sergey Shepelev <temotor@xxxxxxxxx>
>>>> написал:
>>>>>
>>>>> Спасибо, здорово.
>>>>> 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/
>>>>> > Без бэкапа по жизни.
>>>>> >
>>>>> >
>>>>> >
>>>>
>>>>
>>>>
>>>> --
>>>> С уважением, Борис Долгов.
>>>> icq 77556665
>>>> e-mail boris@xxxxxxxxxxx
>>>>
>>>
>>> --
>>> Regards,
>>> Valery Kholodkov
>>>
>>
>> --
>> Regards,
>> Valery Kholodkov
>>
>
|