Фон
У меня есть приложение 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, и я могу развернуть его и получить гораздо больше информации о том, что происходит под одеялом!