Статьи

Выполнение A / B-тестирования с Apache HTTPD

Когда я начал писать целевую страницу «Руководства хакера по Python» , я хотел попробовать что-то новое одновременно. Я читал об А / Б тестировании некоторое время назад, и я подумал, что это хорошая возможность проверить это.

A / B тестирование

Если вы не знаете, что такое A / B-тестирование, взгляните на страницу Википедии на эту тему . Короче говоря, идея состоит в том, чтобы предоставить посетителям две разные версии страницы и проверить, какая из них пользуется наибольшим успехом. Когда вы нашли, какая версия лучше, вы можете определенно переключиться на нее.

В случае с моей книгой я использовал эту технику на предварительной странице, где люди могли подписаться на рассылку. У меня не было много вещей, которые я хотел бы протестировать на этой странице, поэтому я просто использовал этот подход в подзаголовке: «Изучите все, что вам нужно для создания успешного проекта Python» или «Пора сделать максимум вне питона «.

По статистике, каждая версия будет обслуживаться половину времени, поэтому обе стороны получат одинаковое количество просмотров. Затем я построил бы статистику о том, какая страница привлекает наибольшее количество подписчиков. С результатами я смог бы окончательно переключиться на эту версию целевой страницы.

Технический дизайн

Мой веб-сайт, этот веб-сайт, полностью статичен и обслуживается Apache httpd . Я не хотел использовать динамическую страницу, язык или что-то еще. Главным образом потому, что я не хотел, чтобы на моем сервере было что-то еще для установки и обслуживания.

Оказывается, Apache httpd достаточно мощный, чтобы реализовать такую ​​функцию. Существуют разные способы его построения, и я собираюсь описать свой выбор здесь.

Первое, что нужно выбрать, — это способ сбалансировать отображение страницы. Вам нужно найти способ, чтобы, если вы получите 100 посетителей, около 50 увидят версию A вашей страницы, а около 50 увидят версию B страницы.

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

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

Наконец, я выбрал балансировку на основе времени: если вы посещаете страницу в четную секунду, вы получаете версию A страницы, а если вы посещаете страницу в нечетную секунду, вы получаете версию B. Простая и т. Д. далеко ничто не доказывает, что на четных секундах больше посетителей, либо наоборот.

Следующее — всегда показывать одну и ту же страницу возвращающемуся посетителю. Я имею в виду, что если посетитель вернется позже и получит другую версию, это обман. Я решил, что система всегда должна обслуживать одну и ту же страницу, когда посетитель «выбирает» версию. Для этого достаточно просто, вам просто нужно использовать куки для хранения страницы, на которую ссылается посетитель, а затем использовать этот куки, если он вернется.

Реализация

Для этого в Apache httpd я использовал мощный mod_rewrite, который поставляется вместе с ним. Я поместил в каталог книг 2 файла с именами «the-hacker-guide-to-python-a.html» и «the-hacker-guide-to-python-b.html», которые были доставлены при запросе »/ книги /-хакер-руководство к питону».

RewriteEngine On
RewriteBase /books
 
# If there's a cookie called thgtp-pre-version set,
# use its value and serve the page
RewriteCond %{HTTP_COOKIE} thgtp-pre-version=([^;])
RewriteRule ^the-hacker-guide-to-python$ %{REQUEST_FILENAME}-%1.html [L]
 
# No cookie yet and…
RewriteCond %{HTTP_COOKIE} !thgtp-pre-version=([^;]+)
# … the number of seconds of the time right now is even
RewriteCond %{TIME_SEC} [02468]$
# Then serve the page A and store "a" in a cookie
RewriteRule ^the-hacker-guide-to-python$ %{REQUEST_FILENAME}-a.html [cookie=thgtp-pre-version:a:julien.danjou.info,L]
 
# No cookie yet and…
RewriteCond %{HTTP_COOKIE} !thgtp-pre-version=([^;]+)
# … the number of seconds of the time right now is odd
RewriteCond %{TIME_SEC} [13579]$
# Then serve the page B and store "b" in a cookie
RewriteRule ^the-hacker-guide-to-python$ %{REQUEST_FILENAME}-b.html [cookie=thgtp-pre-version:b:julien.danjou.info,L]

С этими несколькими строчками это работало безупречно.

Полученные результаты

Результаты были очень хорошими, так как все работало отлично. В сочетании с Google Analytics я смог следить за счетом каждой страницы. Оказывается, что тестирование именно этого небольшого фрагмента содержимого страницы, как и ожидалось, было действительно бесполезным. Финальный счет не позволил выбрать победителя. Что также отчасти доказывает, что система работала отлично.


Но это все еще был интересный вызов!