Как я делал самый популярный сайт о выборах

:

Статистика President2012.ru Друзья, я хочу вам рассказать историю развития проекта president2012.ru. Сайт является лидером по тематике выборов президента России, за 3 месяца его посетило около 2 млн. человек, в пике имел до 20 тыс. посетителей онлайн и более 1 млн. хитов в сутки, задействовано было 3 сервера облака.

Интересных моментов в процессе работы над проектом набралось столько, что держать в себе эти знания я не могу, и хочу поделится с вами. Я понимаю, что многое, о чем я сейчас собираюсь рассказать, уже описано качественнее в специализированных разделах, и ничего нового я не открою. Моя задача скорее в том, чтобы через отдельные нюансы передать ту атмосферу, в которой проходила работа над проектом. А так же в миллионный раз с помощью success story показать таким же как я людям, что всё возможно и всё в их руках.

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

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

Буду вести рассказ в хронологическом порядке.

Предыстория


Начиналось всё в феврале 2010 года, когда на нашем местном форуме (живу я в Кемерово) пробежала весть о том, что бывший владелец не продлил домен president2012.ru и он выставлен на аукцион. Не долго думая, я принял участие в аукционе и, о чудо, был единственным покупателем с итоговой ценой 100 рублей!

До апреля 2011 года на домене стояла заглушка в виде списка потенциально возможных кандидатов, которую я лишь базово пропиарил по запросам типа «выборы 2012». В марте 2011 года я заказал разработку своим программистам и дизайнерам (я директор вебстудии и ещё пары IT-шных компаний) и 6 апреля сайт был выпущен «на волю». Основной функционал — страницы кандидатов с их описанием, программами и т.д., а так же рейтинг этих кандидатов по итогам голосования посетителей. Второстепенный контент — агрегируемые по тематике новости, статьи и видео (с обязательным указанием ссылки на источник и соблюдением требований этого источника к копированию материалов). Был привлечен контент-менеджер для агрегации контента и модерирования пользовательских комментариев.

Разогрев


Реакция интернет-пользователей не заставила себя ждать, каждый месяц число посетителей удваивалось, а к августу 2011 года общее число комментариев достигло 2000 и встала проблема спама/флуда/флейма. До августа комментирование было анонимным с капчей. Лишаться такого замечательного источника UGC не хотелось, поэтому для максимального облегчения комментирования для посетителей я выбрал Loginza, которая позволяет упростить работу с API авторизации соцсетей и разных сервисов. Не буду здесь описывать сложности её интеграции в сайт, но даже при минимальном знании программирования это дело всего нескольких часов.

В тот же день число комментариев снизилось в несколько раз, тем более, что комментирование стало не анонимным и за свои слова уже приходилось нести теоретически бОльшую ответственность. Но уже через несколько дней посетители распробовали нововведение и объемы комментирования вернулись. Для меня же упростилась задача модерации, а качество комментариев между тем улучшилось. Конечно, чем ближе подходила дата выборов, тем больше комментаторы выходили за все мыслимые рамки, и пришлось делать уже более гибкие системы модерации, массовое удаление сообщений, массовый бан клонов и т.д.

Голосование


Отдельного описания заслуживает процесс голосования. Сторонники кандидатов использовали все мыслимые способы накрутки голосов: подстановка рефереров, юзерагентов и т.д., они сидели сутками над распознанием капч, использовали прокси-сервера, даже TOR задействовали. В итоге, единственным нетрудозатратным способом хоть как-то ограничить их рвение было выбрано подтверждение голоса посредством СМС. Ведь получить большую массу мобильных номеров намного сложнее, чем поменять IP или зарегистрировать новый аккаунт в соцсетях.

На выбор было два варианта:

  • После нажатия на кнопку «Голосовать», предлагать ввести свой номер телефона и отправлять на него смс с кодом подтверждения, который в свою очередь вводится в соседнее поле. Минус этого варианта — при сохранении скорости голосования посетителями (несколько тысяч голосов в сутки), я бы просто-напросто не справился с бюджетной нагрузкой, т.к. за каждую исходящую СМС пришлось бы платить. Но, тем не менее, рынок сервиса отправки изучил и нашёл два самых дешевых и удобных варианта: smspilot.ru и sms24x7.ru. Оба позволяют отправлять СМС не дороже 30 копеек за штуку и с произвольным именем отправителя, например — именем вашего бренда.
  • Второй вариант — выдавать голосующему уникальный код, который необходимо отправить на короткий СМС-номер для подтверждения своего голоса. Главный минус этого способа — платность отправляемой СМС, что отпугивает многих голосующих. С другой стороны, этот способ не уменьшает ваши бюджеты, а наоборот, позволяет компенсировать часть затрат. Я постарался минимизировать расходы голосующих, выбрав самый дешевый короткий номер со стоимостью СМС около 3 рублей. Плюс провел «разъяснительную» работу на странице голосования, описав причины выбора такого способа, плюс пообещав часть вырученных средств отправить на благотворительность. Сейчас, кстати, выбираю детский дом в своем городе для выполнения этого обещания.

Здесь меня ждали очередные грабли. Первоначально был выбран СМС-сервис A1Pay, но в определенный момент они, видимо, чего-то испугавшись, прикрыли мой сервис, «предупредив» об этом тикетом в своем интерфейсе в пятницу вечером(!), причем никакого уведомления на почту и т.п. Сообщение было таким:

Просьба в срочном порядке снять наши номера с сайта president2012.ru. Если в течение дня номера не будут сняты, мы заблокируем корневой префикс и Ваш аккаунт.

Обнаружил я этот тикет в воскресенье вечером, когда счетчик голосования уже долгое время не изменялся, а сотни людей отправили свои СМС «в никуда», в заблокированный сервис. В «круглосуточную» техподдержку так и не смог дозвониться в течение нескольких часов. Долгой перепиской со «службой безопасности» A1Pay удалось добиться только такого объяснения: «Мы являемся аполитичной компанией и не работаем с подобными ресурсами.»

Мне предстоял подбор нового партнера. В процессе этого подбора я натолкнулся на то, что большинство операторов мобильных платежей представляют собой «шаражки» с отвратительной техподдержкой и отсутствием всяческих гарантий. Так, к примеру, разрекламированный на сёрченджинс Smsbill.ru выдал мне «Сервис не прошел проверку, информация: icq xxxxxx». При обращении в указанную аську, я получил ответ в стиле «А вы получили согласие президентов?» и «Мы не работаем с такими серыми сайтами, как ваш». Человек из «техподдержки» автоматически записал меня в «недостойные». Ну да ладно, нашёл всё-таки оператора, который после раунда переговоров согласился запустить мой сервис — smsdostup.ru. После чего проблем с голосованием не возникало.

Надо сказать, что со вводом СМС-подтверждения, число голосов снизилось в несколько раз, но и качество их выросло на порядок. Качество видно по временному, географическому, номерному распределению. Видно, что голосование начало происходить более равномерно без перекосов и накруток.

Успех и его плоды


А рост между тем продолжался. Любое политическое событие приводило к всплескам посещаемости. Ссылки на сайт в соцсетях периодически приводили к вирусной волне. Яркий пример — волна, которая началась после публикации мной программы кандидата Пеунова Светлана Михайловна. В тот день мой сайт попал в топы dirty.ru, vott.ru, pikabu.ru, onliner.by, nigma.ru, leprosorium.ru, блоги teh-nomad, exler.ru, получил +400 ссылок из твиттера, сотни ссылок из FB, VK, OK. И даже Вести меня процитировали.

К слову, SMO-работа над сайтом привела к отличному распространению информации по всей сети. Наибольший эффект получен, конечно же, от ВКонтакте, но и остальные соцмедиа не подкачали. Особенно понравился Твиттер, где ежедневно появлялось до сотни сообщений с призывом голосовать. Наиболее перспективные обсуждения моего сайта я старался поддерживать, собирал обратную связь, работал с претензиями и т.д.

image
Начиная примерно с декабря 2011 года сайт president2012.ru занял ТОП1 практически по всем запросам, касающимся выборов, как в Яндексе, так и в Гугле. К слову, о конкурентах: на предыдущих выборах 2008 года топовым сайтом был vibori.net, который я в этот раз оставил далеко позади, отдав им лишь пятую часть от возможного трафика. Остальные «конкуренты», к моему удивлению, даже не старались стать первыми, не занимались продвижением, не модернизировали свои сайты под возникающие реалии. Так, многие из них даже не обновили дату предстоящих выборов, когда её перенесли с 11 на 4 марта 2012 года.

Растущий постоянно трафик привёл меня к тому, что в декабре 2011 года максимальный тариф у моего хостера nic.ru перестал удовлетворять требованиям сайта по оперативной памяти, а индивидуальных настроек памяти хостер не предоставляет. Начались периодические падения. Я поставил и настроил ngnix для отдачи статического контента. Это снизило нагрузку в 2 раза, но через несколько дней уже и этого не хватало. Перенёс сайт на облако clodo.ru, выделив 2Гб RAM и 4x2267MHz процессора. До марта 2012 года этого хватило продержаться.

Новые препятствия


23 февраля я получил очередную подножку. Яндекс запустил свой сайт vybory2012.yandex.ru, поставив его первым по всем поисковым запросам, содержащим слово «выборы» и нарушив тем самым свои же правила, которые Яндекс транслирует на вебмастеров. Этим действием они забрали у меня примерно 15% трафика — доля небольшая, но мириться с этим не хотелось. Написал им сообщение в блог, на что через сутки получил удар ещё сильнее под предлогом исправления ошибки. На этот раз они убрали свой сайт из выдачи «широкого» запроса «Выборы», но поставили его в выдачу по намного более частотному множеству запросов со словами «выборы», «кандидаты» и т.д. Сдаваться я не собирался, понимая, что это, возможно, просто самодеятельность отдельных членов команды Яндекса. Я написал жалобу в аккаунты Яндекса в Фейсбуке, ЖЖ, Твиттере, написал письмо в поддержку поиска. И через пару дней справедливость восторжествовала. Яндекс оставил свой сайт первым лишь по очень узким запросам, а по остальным — «подмешал» в выдачу на непервых позициях. К слову, после этого я стал больше уважать Яндекс.

27 февраля для меня неожиданно открылся тот факт, что согласно 19-му федеральному закону о выборах Президента, за 5 дней до голосования запрещена публикация результатов опроса общественного мнения. Передо мной стала дилемма — или нарушать закон, т.к. фактически мое голосование можно было приравнять к такому опросу, либо закрывать существенную часть сайта в те дни, когда собственно эту информацию люди массово и будут искать на моем сайте. И я вывернулся! Остановил обновление рейтинга, пообещав голосующим результаты обновить 5-го марта, а везде на сайте написал, что дата публикации рейтинга кандидатов — 27 февраля. Это полностью согласовывалось с требованиями закона, и сайт мог продолжать спокойно работать.

В экстазе


Итак, подошёл официальный день голосования. К 3 марта трафик вырос до 80тыс человек в сутки. Я начал прогнозировать, какая будет нагрузка 4 марта. График посещаемости сайта vibori.net в 2008 году путем экстраполяции давал мне прогноз в 200тыс. посетителей в день голосования. Тогда я и не знал, что это слабый прогноз и всё будет ещё интереснее.

3 марта я максимально закешировал средставми CMS (MODx) все страницы сайта (кстати, браузерное кэширование у меня было к тому моменту уже давно настроено), увеличил оперативку до 3Гб, а так же вынес статический контент на отдельный сервер и спокойно ушёл спать. Проснувшись в 11 утра (MSK+3) я обнаружил, что серверы уже на пределе и нужно что-то делать. Благо, сайт был на облаке и у меня были широкие возможности для маневров.

Первым делом выделил БД на отдельный сервер. Помогло, но не надолго.

Увеличил оперативку до 8Гб и число ядер процессоров до 8. Ещё час жизни сайта был выигран.

И тут проснулась Москва! Стало страшно, число онлайн-посетителей достигло 6000 и постоянно росло. Настала очередь более тонкой настройки ngnix. Никогда этого не делал, но Хабр спас хорошим мануалом. Увеличил число рабочих процессов до 8 по количеству ядер, число коннектов — до 8тыс, ограничил время соединений до 15 секунд. В сумме изменения настроек ngnix дали прирост в скорости отдачи страниц в 2 раза.

Это было похоже на игру в салочки. Каждая новая порция изменений в сервере давала улучшение производительности и автоматически приносила новую волну посетителей, опять снижая производительность.
Мои переживания в Твиттере
Мои переживания в Твиттере

Далее, принялся за ужесточение кэширования. Самые посещаемые страницы, имеющие редко изменяющийся контент сохранил в виде html-файлов, полностью убрав участие php, и прописал их выдачу в .htaccess. Сайт внутри всё больше отдалялся от начального движка и превращался в закостыленного и закешированного франкештейна. Но такова была цена скоростного принятия решений и скоростной же их реализации.

Параллельно наращивал железные мощности. К концу дня на меня работало 3 сервера по 8 двух-гигагерцовых ядер и 8Гб оперативки: вебсервер, файлсервер, сервер БД.

Потом я обнаружил большую очередь долго исполняемых запросов к БД. Начал оптимизировать SQL для тех страниц, которые ещё не были так жестко закешированы. Некоторые запросы, такие, как подсчет числа прочтений, вообще удалил, чтобы не тратить время на оптимизацию не самого существенного функционала. Вообще, в такие моменты, когда каждая секунда дорога, мозг быстрее соображает, что важнее, а чем можно пренебречь. Одновременно, подтюнинговал MySQL, уменьшил wait_timeout до 10 секунд, увеличил max_connections до 1000. Претензий к разработчикам я не имел, т.к. перед ними не была поставлена задача о высоканагруженном сайте.
Подробная картина

Начало каждого часа сопровождалось резким ростом, связанным, по-видимому, с тем, что открывались/закрывались избирательные участки в очередном часовом поясе и люди шли смотреть на статистику (хотя выводить оперативно по закону я мог только проценты явки). И вот, в момент, когда закрылись участки в главном часовом поясе России — московском — сервер не выдержал и лёг. В тот момент на сайте было онлайн около 20тыс. человек. Звоню в техподдержку Clodo, понимающим и извиняющимся голосом говорю, что сервак пал смертью храбрых, а они мне и отвечают: «Знаем, это по нашей вине (!), в течение 10 минут исправим». Не стал с ними спорить, и через 40 минут сайт снова ожил. Сильно не переживал, т.к. понимал, что и так выполнил и перевыполнил все планы, и ожидал, что сайт упадет намного раньше и на дольший срок.

С момента восстановления активность посетителей пошла на спад и я смог спокойно обновить раздел новостей и видео, а после завершения голосования в Калининграде раскупорил бутылочку красного вина и вместе с женой отпраздновали в своем «предвыборном штабе» окончание этого прекрасного дня. Ощущение было такое, что президентом выбрали меня. В крови бегала смесь адреналина, дофамина и эндорфинов.
Мой предвыборный штаб

Результаты


В следующие дни посещаемость спала намного резче, чем росла, и к празднику остановилась на отметке 7-8 тысяч посетителей в сутки.

Итоговые результаты проекта:


За период активного голосования (3 месяца) сайт посетило около 2млн. человек
Из них около 500 тыс. — за сутки с 8:00 4 марта по 8:00 5 марта (MSK).
За эти же сутки было просмотрено около 1 200 000 страниц.
За эти же сутки исходящего трафика: 0,5 Тб.
Затрачено на разработку и поддержку около 60 000 руб. Из них: 33 000 руб. на разработку, 8 000 руб. на хостинг, 19 000 руб. на контентную и другую поддержку.
Получено от рекламы Google Adsense около 190 000 руб.
Приобретено опыта: бесценно.
Доходы в Гугл Адсенс

Резюме


Выводы, которые я сделал из этого проекта:
  • Событийные проекты могут приносить хороший профит не смотря на их краткость во времени, разовость.
  • Важно активно работать с соцсетями, как с целью стимулирования UGC, так и для роста отдачи от PR и усиления SEO.
  • Важно отслеживать всех своих конкурентов и всегда идти на шаг впереди них в предложении удобных и полезных инструментов пользователям.
  • Важно концентрироваться на определенных деталях своего проекта и под них подстраивать всю рекламную кампанию. Так, у меня концентрация была в рейтинге и процессе комментирования кандидатов. Я не стал создавать широкотематичный политпортал.
  • Если вы прогнозируете рост интереса к вашему проекту — подготовьтесь к этому росту, чтобы не оказаться в ситуации, когда спрос на вашу услугу/товар есть, а вы тупо не можете его удовлетворить из-за нехватки ресурсов.
  • Ну и главное — нужно иметь четкий структурированный план действий по проекту, закрывающий все аспекты его существования и развития, и тогда останется верить в свои силы и всё!

P.S. С нетерпением жду ваших вопросов, отзывов, критики по каждому из аспектов проекта — от идеи до технической реализации.

P.P.S. Администрацию прошу не рассматривать этот пост как политический, если ограничение на политику ещё остается. Я сам человек аполитичный и постарался в тексте обойти все острые углы.