Статьи

Анализ веб-сервисов REST с помощью Squid и AWStats

Фон

У меня есть приложение Java, запущенное на
Tomcat в
Amazon EC2 , которое предоставляет
веб-сервисы
RESTful, предоставляющие
JSON различным мобильным приложениям и веб-сайтам.

Я использую
сервер
Squid в качестве обратного прокси-сервера для кэширования перед веб-службами для кэширования определенного содержимого на уровне HTTP.

(Я также кеширую на уровне приложений, используя
Ehcache и
Spring— но добавление кеша Squid перед этим позволяет мне кэшировать больше контента, чем просто JSON, и позволяет мне использовать прокси-функции Squids для легкого управления внутренними сервисами. Это также требует большей нагрузки от сервера Tomcat, который также выполняет запланированные задачи для обновления данных в системе.)

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

На данный момент все это выполняется на одном экземпляре сервера EC2 Ubuntu.

Весь HTTP-трафик поступает на сервер Squid, работающий на порте 80. Это кэширует определенный контент html, image, json, php и т. Д. (Как определено в /etc/squid3/squid.conf) — и если он не может найти запрос в кеше (или было сказано не кэшировать его), будет перенаправлен на один из вышестоящих серверов для обслуживания запроса — Tomcat (на порту 8080 — для обслуживания моих веб-служб Java и приложения администратора) или Apache (на порту 9898) — обслуживание моих веб-сайтов, PHP / HTML).

Итак, моя основная установка похожа на эту диаграмму:

Проблема — Как анализировать трафик веб-службы?

Я хочу отслеживать посетителей всех веб-сайтов и мобильных приложений. Я могу отслеживать посетителей сайта с помощью
Google Analytics . Однако мобильные приложения обращаются к веб-службам напрямую, поэтому клиентский трекер, такой как Analytics, не может отслеживать эти запросы.

Поскольку все запросы направляются через Squid, все данные о доступе находятся в squid ‘access.log’. Это единственное место, которое знает обо всем трафике (поскольку при этом регистрируется весь доступ, независимо от того, доставлен ли он из кеша или с внутренних серверов).

Хотя Squid предоставляет
инструмент
cachemgr — он больше ориентирован на мониторинг доступа к кешу, чем на фактические детали о том, что доставлено, куда и кому (какая информация мне больше интересна)

 

Мое решение

Рассматривая различные доступные инструменты анализа журналов — я решил
попробовать
AWStats — он бесплатный, кажется хорошо документированным и широко используемым.

Моя цель состояла в том, чтобы установить этот AWStats на моем Ubuntu-боксе, чтобы читать журналы Squid и предоставлять хороший вывод HTML. — обновляется на регулярной основе, чтобы я мог следить за использованием в течение дня.

Так что мой план заключался в том, чтобы примерно так

Предпосылки

  • До того, как я начал — у меня уже были настроены и запущены на моем Ubuntu (версия 12)
    • Squid Server (работает на порте 80)
    • Apache (работает на порту 9898)

 

Шаг 1. Установите AWStats


Первым шагом было просто установить AWStats в Ubuntu с помощью этих команд apt (примечание: последние 2 нужны только, если вы хотите отслеживать статистику по стране):

sudo aptitude install awstats
sudo aptitude install libnet-ip-perl
sudo aptitude install libgeo-ipfree-perl

Шаг 2: Настройте ведение журнала Squid

Следующим шагом является изменение формата логов Squid. По умолчанию Squids access.log в основном предназначен для регистрации только той информации, которая полезна для регистрации операций кэширования (что было запрошено, когда оно было доставлено из кэша …).

Пример этого приведен ниже.

1369117923.612     26 209.20.75.224 TCP_MISS/200 4204 GET http://.../rest/feeds/v3/feeditem/9932/ - FIRST_UP_PARENT/tomcat application/json
 
1369117947.802      0 209.20.75.224 TCP_MEM_HIT/200 12130 GET http://.../rest/feeds/v3/latest/WH/2000-01-01-00-00? - NONE/- application/json
 
1369118022.040    139 209.20.75.224 TCP_MISS/200 12929 GET http://.../rest/feeds/v3/search/JAVA/JSF - FIRST_UP_PARENT/tomcat application/json
 
1369118027.240      0 209.20.75.224 TCP_MEM_HIT/200 12130 GET http://.../rest/feeds/v3/latest/WH/2000-01-01-00-00? - NONE/- application/json
 
1369118041.264      0 209.20.75.224 TCP_MEM_HIT/200 12130 GET http:/.../rest/feeds/v3/latest/WH/2000-01-01-00-00? - NONE/- application/json
 
1369118062.362      0 209.20.75.224 TCP_MEM_HIT/200 12130 GET http://.../rest/feeds/v3/latest/WH/2000-01-01-00-00? - NONE/- application/json
 
1369118062.811      0 96.28.139.57 TCP_MEM_HIT/200 9397 GET http://.../rest/image/38 - NONE/- image/png
 
1369118062.830      0 96.28.139.57 TCP_MEM_HIT/200 6936 GET http://.../rest/image/44 - NONE/- image/png

Чтобы AWStats мог проанализировать его и предоставить больше информации, нам нужно изменить формат ведения журнала на журнал в стиле Apache. Что-то вроде этого:

92.40.254.172 - - [23/May/2013:14:52:25 +0000] "GET http://.../rest/image/34 HTTP/1.1" 200 5043 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; en-gb; U8815 Build/HuaweiU8815C02B895) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" TCP_MEM_HIT:NONE
 
86.150.72.140 - - [23/May/2013:14:53:26 +0000] "GET http://.../rest/feeds/v3/jsonp/feeditem/20112? HTTP/1.1" 200 5277 "-" "Mozilla/5.0 (Linux; U; Android 2.2; en-gb; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" TCP_MISS:FIRST_UP_PARENT
 
86.150.72.140 - - [23/May/2013:14:53:39 +0000] "GET http://.../rest/feeds/v3/jsonp/feeditem/20109? HTTP/1.1" 200 7114 "-" "Mozilla/5.0 (Linux; U; Android 2.2; en-gb; HTC Desire Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" TCP_MISS:FIRST_UP_PARENT

Чтобы изменить
формат ведения журнала
/var/log/squid3/acccess.log — добавьте следующие строки в
/etc/squid3/squid.conf

logformat combined %>a %ui %un [%{%d/%b/%Y:%H:%M:%S +0000}tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
 
access_log /var/log/squid3/access.log combined

Остановите Squid, сделайте резервную копию и удалите старый
/var/log/squid3/access.log и перезапустите squid — теперь все входящие в систему с этого момента будут использовать этот новый формат файла — который AWStats будет обрабатывать

sudo stop squid3
sudo mv /var/log/squid3/access.log /var/log/squid3/access.log.backup
sudo start squid3

Шаг 3. Настройка AWStats

Нам нужно сообщить AWStats, какой файл журнала мы хотим использовать и в каком формате.

Есть несколько способов настроить свой домен в AWStats. Для простоты здесь — я просто предполагаю, что у нас есть один домен, и мы просто используем конфигурацию awstats.conf «из коробки» (я считаю, что обычной практикой является использование разных conf-файлов для каждого домена — но мы просто будем использовать по умолчанию на данный момент).

Найдите следующие строки в
/etc/awstats/awstats.conf и измените их на эти параметры (более подробную информацию о настройке
LogFormat смотрите здесь ):

LogFile="/var/log/squid3/access.log
LogFormat=1
SiteDomain=yourdomainname

Шаг 4: Генерация отчета

Теперь у нас установлен и настроен AWStats, и Squid регистрирует правильный формат, и мы можем сгенерировать отчет об анализе. Используйте следующую команду, чтобы сделать это:

sudo /usr/lib/cgi-bin/awstats.pl -config=awstats.conf –update

Это должно дать вам вывод, похожий на: 

sudo /usr/lib/cgi-bin/awstats.pl -config=awstats.conf -update
Create/Update database for config "/etc/awstats/awstats.conf" by AWStats version 7.0 (build 1.971)
From data in log file "/var/log/squid3/access.log"...
Phase 1 : First bypass old records, searching new record...
Direct access after last parsed record (after line 412)
Jumped lines in file: 412
 Found 412 already parsed records.
Parsed lines in file: 53
 Found 25 dropped records,
 Found 0 comments,
 Found 0 blank records,
 Found 0 corrupted records,
 Found 0 old records,
 Found 28 new qualified records.

Шаг 5: Настройка Apache / Squid для просмотра отчетов

Теперь у нас установлен AWStats и Squid регистрирует правильный формат, следующим шагом является настройка Apache и Squid для просмотра отчетов.

Мы хотим просмотреть отчеты по URL:
http: //yourdomainname/statistics/awstats.pl

Поскольку весь наш трафик проходит через Squid — нам просто нужно добавить некоторые директивы в
/etc/squid3/squid.conf для перенаправления любого URL-адреса, проходящие через «/ statistics» непосредственно на сервер Apache. Мы также отображаем URL-адреса ‘/ awstats’ на сервере apache — чтобы перехватить ссылки на файлы css и js AWStats.

# allow access to the awstats.pl - redirect to Apache
acl statisticsAcl url_regex -i (/statistics)
cache deny statisticsAcl
http_access allow statisticsAcl
cache_peer 127.0.0.1 parent 9898 0 no-query originserver name=statisticsPeer
cache_peer_access statisticsPeer allow statisticsAcl
 
# allow access to the awstats css, js, etc - redirect to Apache
acl awstatsAcl url_regex -i (/awstats)
cache deny awstatsAcl
http_access allow awstatsAcl
cache_peer 127.0.0.1 parent 9898 0 no-query originserver name=awstatsPeer
cache_peer_access awstatsPeer allow awstatsAcl

Затем нам нужно настроить Apache для работы с AWStats. Мы можем легко сделать это, создав новый файл
/etc/apache2/conf.d/statistics (со следующим содержимым):

Alias /awstatsclasses "/usr/share/awstats/lib/"
Alias /awstats-icon/ "/usr/share/awstats/icon/"
Alias /awstatscss "/usr/share/doc/awstats/examples/css"
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
ScriptAlias /statistics/ /usr/lib/cgi-bin/
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch

Последний шаг — просто перезапустить Apache и Squid.

sudo /etc/init.d/apache2 restart
sudo stop squid3
sudo start squid3

После этого вы сможете получить доступ к своей статистике по адресу «
http: //yourdomainname/statistics/awstats.pl »:

 

Шаг 6: Планирование как Cron Job

Если вы хотите запланировать обновление статистики (скажем, каждые 30 минут) — просто добавьте это в / etc / crontab

*/30 * * * * root /usr/lib/cgi-bin/awstats.pl -config=awstats.config -update > /dev/null

Шаг 7: опция — создание статических веб-страниц

Пока что — все, что мы делаем, вызывает Perl-скрипт awstats.pl, который динамически генерирует одни и те же веб-страницы с последней информацией.

Если вы хотите — вы также можете создавать статические веб-страницы. Например — я хочу генерировать статические страницы — каждый день разные наборы (с указанием года, дня и месяца в заголовке HTML-страницы).

Вы можете сделать это с помощью следующей команды:

sudo /usr/share/awstats/tools/awstats_buildstaticpages.pl -awstatsprog=/usr/lib/cgi-bin/awstatsl.pl -config=awstats.conf -dir=/var/www/awstats-report -builddate=%YYYY-%MM-%DD

Это создаст набор страниц в
«/ var / www / awstats-report /» в формате «
awstats.awstats.conf.130524.html » (примечание: вам нужно будет создать / var / www / awstats-report Каталог / с правильными разрешениями.

Вам нужно будет добавить новый набор правил в /etc/squid3/squid.conf, чтобы:

# allow access to the awstats static reports folder - redirect to Apache
acl awstatsReportAcl url_regex -i (/awstats-report)
cache deny awstatsReportAcl
http_access allow awstatsReportAcl
cache_peer 127.0.0.1 parent 9898 0 no-query originserver name=awstatsReportPeer
cache_peer_access awstatsReportPeer allow awstatsReportAcl

Точно так же — вы можете запланировать это на регулярной основе. Например, чтобы запускаться через 55 минут каждый час — добавьте эту строку в
/ etc / crontab

55 * * * * root /usr/share/awstats/tools/awstats_buildstaticpages.pl -awstatsprog=/usr/lib/cgi-bin/awstatsl.pl -config=awstats.conf -dir=/var/www/awstats-report -builddate=%YYYY-%MM-%DD

Затем вы можете получить доступ к статическим страницам по URL:
‘yourdomainname / awstats-report / awstats.awstats.conf.130523.html’ 

Вывод

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

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

И в его главной роли — в качестве обратного прокси-сервера веб-ускорения — он работает превосходно, ускоряя веб-сервис и обслуживание изображений без каких-либо ворчаний. Теперь у меня есть AWStats, и я могу развернуть его и получить гораздо больше информации о том, что происходит под одеялом!