Если кто-то из здесь присутствующих разработчиков делал периодический биллинг (скользящий или календарный) на 100К и более пользователей (в идеале - 2М), откликнитесь, пожалуйста. Требуется консультация. Предлагаю вместе пообедать (в Москве).
lehha.developer: 6К - их можно в цикле всех обойти и обсчитать, если не ошибаюсь. Меня же интересует ситуация, когда всех обойти очень сложно, ибо много их. Как делают в таком случае - об этом и хотел пообщаться за обедом...
- Дмитрий Котеров
6к пользователей, 320к доменов - каждый домен обсчитывается. Сейчас всё делается где-то за 2-3 минуты, плюс 5-7 минут обновления статистики. По сути в цикле и работает, берется каждый домен и берутся транзацкции за предыдущие сутки, биллятся (вносятся на баланс, обсчитываются комиссии, вознаграждения и удержания, блокировки и откаты). Собственно биллинг - это простая процедура...
more...
- lehha.developer
О, это интересно. 2-3 минуты - ИМХО очень быстро! А что за проект (можно ссылку?)? По описанию похоже на регистратора доменов. :-)
- Дмитрий Котеров
Nginx, regex-домены, "root /your/app/$1/htdocs". Не работает fastcgi_php? Замените одну "root ..." на две директивы: "set $docroot /your/app/$1/htdocs; root $docroot;". Видимо, nginx неправильно воспринимает директиву "fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;", если определение в директиве "root" содержит regexp-маркеры.
Кстати, есть еще грабли при использовании регулярок в server_name: внутренние редиректы начинают работать криво. Лечится добавлением server_name_in_redirect off;
- Илья Пирогов
Почему я использую nginx+fastcgi_php, а не nginx+apache+mod_php? Соображение производительности здесь вовсе не главное. Смотрите. Nginx по любому нужен для "медленных" клиентов, его нельзя исключить. А в связке "apache+nginx" конфигов поддерживать в 2 раза больше, чем в связке "просто nginx". Так что apache сбривается бритвой Оккама, не более того.
>Так что apache сбривается бритвой Оккама... Получается, Апач совсем не нужен? Как же так, столько лет работали на нем, и теперь отказаться? Грустно как-то. Сразу стишок такой на ум пришел. Сервер Апач. Молчит угрюмо твой лог. Сервер Апач. Сжимает память висок. Сервер Апач в даль прощальную дня Зовет меня. Сервер Апач. Хочу твоей быстроты. Сервер Апач. Свои открой мне скрипты. Сервер...
more...
- Vol Gavr
:-) Ну что значит - "совсем не нужен"... В каких-то проектах - нужен, в каких-то - не очень. Хостинг на много пользователей, например, без апача организовать сложновато.
- Дмитрий Котеров
Большинство подводных камней автор подкладывает вам сам. Кеширование 304, игнорирование no-cache от бекенда, принудительная установка no-cache клиенту, обнуление Last-Modified. Для ротации есть ngx_http_random_index_module.
- Sergey Homenkow
ngx_http_random_index_module для статичных страниц. Дмитрий объяснил как сделать это без прегенерации и раскатывания в динамике.
- Maxim Gurets
@gurets Угу. В статье говориться о ~5000r/s. Когда 500 из них ломануться к бекенду обновлять один блок... Уж лучше cron.
- Sergey Homenkow
Серег, но решение, согласись, элегантное. Для этого будут бизи-локи. Сысоев, правда?
- Maxim Gurets
К сожалению не вижу элегантности в этой набле. nginx, например, как порядочный кеш сам умеет отдавать 304 на данные из кеша (по If-Modified-Since). Может и HEAD умеет. Не проверял. if-non-match при кешировани на 30-300 сек тоже особого смысла не имеет.
- Sergey Homenkow
Кешировать на 5 мин на сервере и запрещать кеширование у клиента/в шаред-кеше - тоже странное решение.
- Sergey Homenkow
Ну отчего же странное? Страница "псевдо-динамическая" и при каждом рефреше нужно отдавать рандомные блоки. В условиях применимости решения это описано.
- Maxim Gurets
В статье 3 раздела. Запрет кеширования в том числе и на раздел кеширование страницы целиком. Мне нравятся наблы Дмитрия. Но не все.
- Sergey Homenkow
Не понял вторую фразу, уточните, пожалуйста.
- Дмитрий Котеров
Если вы о том, что fastcgi_ignore_headers блокирует вывод в браузер заголовка Cache-Control, то это не так. Директива fastcgi_ignore_headers блокирует только ИНТЕРПРЕТАЦИЮ указанных заголовков nginx-ом, в браузер они попадают (только что специально еще раз проверил).
- Дмитрий Котеров
Первая часть статьи про кеширование страницы целиком. В этой части тоже отключается кеширование на стороне клиента.
- Sergey Homenkow
Перечитал. Я ошибся. В первой части кеширование на стороне клиента не отключается. Ok.
- Sergey Homenkow
Не понял фразу "Это как раз пример строчку, написанных кровью" - опечатка?
- Изменить - Вставить
Ну нахрена ж ещё и ещё клоны твиттера, когда он уже есть?!
- Благовестник
залез, огляделся. youtube-rutube twitter-rutvit может быть что-то и получится
- Сашенька
Честно говоря не понимаю зачем. А лого просто ужос.
- Anton Egorov
С доменом на мой взгляд неудачный выбор сделали, W было бы уместнее.
- Anton Egorov
По поводу домена rutwit.ru с буквой "w". Комментарии здесь и на Хабре прекрасно иллюстрируют полезность обратной связи от сообщества. Мы действительно недооценили важность приобретения домена rutwit.ru, хотя и вели вялые переговоры о его покупке. К счастью, после данных комментариев на Хабре мы и предыдущие владельцы домена быстро пришли к разумному соглашению. В дополнение к...
more...
- Дмитрий Котеров
Отлично. Очень рад за вас. Поработайте еще над дизайном и типографикой в частности. И будет совсем хорошо)
- Банал Когнитивной Науки
from iPhone
От ознакомления с сайтом остановила принудительная рега
- bbsodbbsod
Интересно по архитектуре было бы пообщаться в jabber-е, если автор не против
- Sergey Konoplev
HAProxy 1.3.20 - http://haproxy.1wt.eu - замечательно работает как TCP-балансер. Но в HTTP-режиме - это один сплошной глюк. Например, режет HTTP-ответ до 8032 байт (или до другой цифры, зависящей от погоды на улице, а иногда и настроек fastcgi_buffer_size из nginx, который стоит за балансером). Предупрежден - вооружен.
...как тут выяснилось (см. мой более поздний пост) - и в TCP-режиме есть глюки.
- Дмитрий Котеров
Купил iPhone. Накидайте в комментарии, пожалуйста, список приложений, которые имеет смысл поставить (и какие у них преимущества). Желательно со ссылками.
Спасибо всем откликнувшимся! Пойду ставить.
- Дмитрий Котеров
Кто знает, каким образом FriendFeed заставляет Firebug не показывать в консоли крутилку XMLHttpRequest-а? Сам запрос идет, а в консоли он не отображается.
Постоянное, но в Windows в Firebug этого соединения не видно.
- Дмитрий Котеров
Жмите gzip на стороне PHP (ob_gzhandler), а не средствами nginx. Я серьезно. Потому что так вы сможете при необходимости легко закэшировать отдельно уже сжатый контент через fastcgi_cache или proxy_cache (не забудьте только замешать в ключ кэширования $http_accept_encoding!), а не тратить CPU на сжатие nginx-ом каждый раз.
...даже несмотря на то, что gzip на стороне PHP приводит к бОльшему простою PHP-процесса, а также требует затрат памяти на хранение несжатого контента целиком.
- Дмитрий Котеров
Я вот вынужден gzip выключить и в nginx и в PHP - первый действительно жмет при каждом обращении к кешу, а второй кушает ну очень много процессорного времени (машинка куплена слабая). Люди скажите кроме повышенного расхода трафика на что я еще попадаю?
- Mikhail Pilin
"Попадают" в основном пользователи. Ведь это им приходится ждать загрузки в 2-3 раза дольше обычного...
- Дмитрий Котеров
В nginx fastcgi_cache* не работает при наличии заголовков "Pragma: no-cache", "Cache-Control: private" и др. Осторожно! Эти заголовки неявно выставляет session_start() в PHP. Отключить сессии и подавить заголовки Expires, Cache-Control, Pragma и Last-Modified можно так: ini_set('session.use_cookies', 0); ini_set('session.cache_limiter', '');
Когда страница кэшируется целиком в nginx, куки не имеют смысла. Потому что любая кука, установленная скриптом, будет закэширована и потом отдана другому клиенту. Наверное, это совсем не то, что хотелось получить, верно? С сессией все еще опаснее, потому что, если допустить просачивание сессионной куки наружу, все клиенты получат единую сессию, что приведет к разрушительным последствиям.
- Дмитрий Котеров
Оказалось, что можно написать: ini_set('session.cache_limiter', '') - это подавляет вывод заголовков кэширования. Обновил исходный текст поста. Решение превратилось в довольно аккуратное.
- Дмитрий Котеров
И даже более того: можно в PHP ничего не править, а обойтись fastcgi_hide_header "Set-Cookie"; fastcgi_ignore_headers "Cache-Control" "Expires";
- Дмитрий Котеров
Сам такое пользую - fastcgi_ignore_headers Cache-Control Expires;
- Mikhail Pilin
HA-Proxy version 1.3.17, TCP-проксирование. Работал долгое время отлично. Вдруг внезапно соединения начали подвисать. Не вылечилось ничем (включая перезагрузки), конфигурация машины точно не менялась. Я еще понимаю, когда проблемы были в HTTP, но TCP-то чего... Все, с меня хватит. Пойду искать замену.
В 1.3.17 тоже не было на протяжение почти года. А потом вдруг раз! - и есть. В changelog-е нет сколько-нибудь похожих багфиксов, так что, я думаю, они это не починили (как не починили HTTP-проксирование). А возможно, HA-Proxy просто не дружит с OpenVZ...
- Дмитрий Котеров
Директива nginx fastcgi_cache_valid - http://sysoev.ru/nginx... - игнорируется, если в ответе скрипта есть либо заголовок Cache-Control: public; max-age=ЧИСЛО_СЕКУНД, либо заголовки, запрещающие кэширование. (Кстати, они выставляются, например, в session_start()). Кэш начинает храниться ЧИСЛО_СЕКУНД. Осторожно!
А еще, похоже, при наличии "Cache-Control: public; max-age=ЧИСЛО_СЕКУНД" nginx (гад такой) кэширует даже ответы "304 Not Modified" (полученные по If-Modified-Since или If-None-Match), хотя в fastcgi_cache_valid прописано только кэширование "200 OK". В кэш-файликах прямо так и записывается, с заголовками и пустым телом ответа, и все последующие пользователи получают белую страницу. Это поведение лишено смысла и очень похоже на баг. Чуть позже буду более детально разбираться.
- Дмитрий Котеров
Валидация коммита в Git: 1) в hooks/pre-receive пишем sudo /usr/bin/rsync -a --delete /repo /repo.COPY; 2) в hooks/post-receive проверяем файлы из репозитория и, если коммит плохой, делаем обратно sudo /usr/bin/rsync -a --delete /repo.COPY /repo; 3) в post-receive можно ходить по SSH и делать git-pull, если нужно: http://bit.ly/djSjc
под валидацией скорее всего подразумевается, например, проверка кода на синтаксис или запуск какого-нибудь быстрого теста.
- Ilyas
Или configtest/reload какого-нибудь демона, если в репозитории хранится его конфиг. Если configtest закончился с ошибкой, коммит надо запретить.
- Дмитрий Котеров
Спасибо, интересно. Не приходило в голову на этом этапе отвергать код :) Надо попробовать.
- Alex Kapranoff
На STDIN хука, кстати, передается список измененных объектов. Правда, я с ним не экспериментировал пока.
- Дмитрий Котеров
Еще при валидации в PHP-проектах я проверяю: а) что в PHP-файле ровно один "<?" и нет ни одного "?>"; б) что PHP-файл состоит только из комментариев, директив require_once и объявлений классов class Xxx { ... }, т.е. что его можно подключить без побочных эффектов через autoload (это очень удобно на практике).
- Дмитрий Котеров
Если дефолтная системная локаль - UTF8, а надо запустить старый скрипт Perl в windows-1251, использующий LWP, то решение проблемы с кодировками такое: use POSIX qw(setlocale LC_ALL); setlocale(LC_ALL, "ru_RU.cp1251"); ... $result = Encoding::encode("cp1251", LWP::Simple::get(...))". Увы, новый LWP всегда возвращает результат с флагом UTF8...
Хехе, поздравляю :). Где-то в новостях читал, что Яндекс является для государства стратегическим важным предприятием, вот видимо потихоньку работников Яндекса в твиттер добавляет :)
- youROCK
Используете pgBouncer в режиме Session Pooling? Не забудьте прописать в конфиге "server_reset_query = DISCARD ALL", чтобы следующий процесс не зависел от предыдущего в случае внезапной смерти скрипта.
Поставили CentOS на SATA-диск, а диск стал жутко тормозить (hdparm -t /dev/md0 выдает чтение 3-4 М/с)? Добавьте параметры "acpi=off pci=nommconf ide0=noprobe ide1=noprobe" в grub.conf, чтобы строчка выглядела так: "kernel /boot/vmlinuz-2.6.18-128.el5 ro root=/dev/md0 acpi=off pci=nommconf ide0=noprobe ide1=noprobe". Все начнет работать быстро.
Заметил интересный рекламный ход, повышающий кликабельность баннера. См. первый скриншот (вертикальный): в нем намеренно допущена орфографическая ошибка (я отметил ее стрелкой). Кликаем и видим тот же баннер, но горизонтальный и уже без ошибки (см. второй скриншот). Не верю, что это безграмотность. Думаю, что специально так сделали.
Мне кажется, описка, а потом исходник потеряли или кто в отпуск ушел, потом поправят :)
- Dennion
Пригласить всех-всех людей из своей адресной книги GMail во FiendFeed можно так: идем на http://friendfeed.com/friends... , выбираем там GMail, а затем вводим в адресной строке браузера заклинание: javascript:$("input[type='checkbox']").each(function(){this.click()});void(0) - это взводит все галочки разом.
только что получили на support@habrahabr.ru :) (вернее 3 часа назад)
- Глеб Арестов
Согласно http://www.ietf.org/rfc... - RFC на cookies - хост вида y.x.foo.com не может поставить cookie на .foo.com. (См. по этой ссылке "domain-matches" и секцию "4.3.2 Rejecting Cookies" - "because ... y.x ... contains a dot"). Однако прекрасно ставит (в Firefox, например). Что за...?
Полезные команды Linux при превышении лимитов на ресурсы: "sysctl -a", "ipcs", "cat /proc/user_beancounters" (последняя для OpenVZ). Некоторые настройки есть еще в файле /etc/sysctl.conf. В том числе - в контейнере OpenVZ, особенно kernel.shm*: они должны быть раскомментированы и установлены достаточно большими.
Как известно, Windows 32-бит не видит все 4Г оперативки в силу архитектуры своих драйверов. У меня видит только 2.5Г. Решение: создать RAM-диск - http://www.megaleecher.net/RAMDisk - и разместить на нем... файл подкачки на 1.5Г. Это не бред, это Windows! Работает. Теперь все 4Г при деле. Еще полезная ссылка: http://www.computerperformance.co.uk/Registr...
64-бита я тоже хотел поставить вначале, но остановили 2 аргумента: а) говорят, драйвера сложнее найти потом, б) хотелось оставить Windows лицензионным, который вместе с ноутбуком шел.
- Дмитрий Котеров
В случае ноутбука может быть и проблемы будут, ага. А на обычном десктопе — ну какое тут специфичное железо такое есть, что дров не найти, м?
- Denya
В случае ноутбука специфичное железо -- это: видеокарты, вай-фай драйвера, блютус драйвера, веб-камеры и т.д.
- youROCK
У меня так на ноутбуке 8 Гб, будет ли разумно создавать рам-диск на 4,5 Гб? Я так понимаю, своп работает на уровне ядра, и переключений контекста для вызова дисковых драйверов/системных вызовов быть не должно? То есть, это работает довольно быстро, да?
- youROCK
Если ОС 32-битная (и только в этом случае) - то да, будет разумно поставить файл подкачки на RAM-диск. По-другому эту память просто в 32-битной Windows не задействовать (альтернативный способ - режим со включенным PAE - дает осложнения при установке многих драйверов).
- Дмитрий Котеров
@dennydov А в чем его "хитовость"? Очень удобная фича: ссылка из письма сразу же логинит на сайт, пароль не нужно вспоминать.