Выбор self-hosted веб-аналитики для VPS
Сравнение Plausible, Umami, Matomo, GoatCounter и GoAccess для размещения на VPS. Узнайте требования к RAM, выбор БД, настройку обратного прокси и влияние блокировщиков рекламы.
Какой инструмент веб-аналитики для self-hosted размещения выбрать для VPS?
Инструменты веб-аналитики для самостоятельного размещения делятся на два типа, и выбор неверного типа обойдется вам дороже, чем выбор неудачного продукта. Первый тип запускает небольшой скрипт в браузере посетителя и сохраняет данные, которые этот скрипт передает. Второй тип считывает access log, который ваш веб-сервер уже создает. Все последующие требования, включая базу данных и необходимый объем оперативной памяти, зависят именно от этого выбора.
Краткий ответ для небольшого сервера. GoatCounter и Medama помещаются в 1 GB RAM, так как каждый из них представляет собой один процесс, работающий с одним файлом. Umami добавляет контейнер с Postgres и предоставляет панель управления, понятную нетехническому специалисту. Plausible Community Edition и Rybbit используют ClickHouse, поэтому планируйте объем оперативной памяти от 2 GB и выше. Matomo — это полнофункциональный продукт, требующий ресурсов сервера в соответствии с вашим трафиком. GoAccess не добавляет на страницу ничего, так как он считывает уже существующий лог-файл.
Тег скрипта или серверный лог: что видит каждый из них
Тег скрипта измеряет активность браузеров. Страница загружается, скрипт выполняется и отправляет один запрос на ваш коллектор. Всё, что разрывает эту цепочку, остается для вас невидимым: отключенный JavaScript, фильтр, блокирующий запрос, сбой при отправке запроса к коллектору или поисковый робот, который не выполняет скрипты.
Парсер логов измеряет запросы. Ваш веб-сервер записывает по одной строке на каждый запрос независимо от того, установили ли вы что-либо, поэтому данные уже находятся на диске. Он видит каждого робота и каждое обращение к файлу, в котором нет тега скрипта. Он не может видеть, что происходило внутри браузера, и не может видеть страницу, загруженную из кэша браузера или из CDN (content delivery network), стоящей перед вашим сервером, так как этот запрос не дошел до вашего сервера.
Эти два числа не будут совпадать, и ни одно из них не является неверным. Matomo поддерживает оба метода и документирует, что именно теряется при импорте логов по сравнению с JavaScript-трекером: разрешение экрана, заголовки страниц, события, отслеживание контента, тепловые карты, записи сессий и аналитика форм. Этот список — цена подсчета запросов вместо браузеров.
Трафик ботов — вторая причина расхождений. Подсчеты на основе логов включают поисковых роботов, если вы их не отфильтруете, а на обычном сайте доля роботов достаточно велика, чтобы изменить ваши выводы. И GoAccess, и импорт логов в Matomo фильтруют известных ботов. Ни один из них не может отфильтровать робота, который подменяет свой user agent, что является веской причиной сочетать любой подсчет на основе логов с блокировкой AI-краулеров на уровне сервера и анализировать лог уже после применения блокировки, а не до неё.
GoAccess: аналитика на основе имеющихся логов
Установите GoAccess из официального репозитория проекта для Debian и Ubuntu, так как версии в системных репозиториях отстают от актуальных релизов.
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
sudo apt-get install goaccessЗатем укажите путь к лог-файлу и сформируйте статический отчет.
goaccess /var/log/nginx/access.log -o ~/report.html --log-format=COMBINEDЭта команда завершается ошибкой Permission denied для обычного пользователя, так как в Ubuntu владельцем логов nginx является root, а группа — adm. Добавьте себя в эту группу с помощью sudo usermod -aG adm $USER, затем завершите сеанс и войдите снова, так как членство в группах считывается при входе в систему. Выполните id и убедитесь, что adm присутствует в списке, прежде чем пробовать снова.
Отчет по текущему логу охватывает только те данные, которые еще не были перемещены утилитой logrotate. Запросы за вчерашний день находятся в access.log.1, а более старые записи сжаты, поэтому для формирования еженедельного отчета необходимо считывать и ротированные файлы.
zcat /var/log/nginx/access.log.*.gz | goaccess - --log-format=COMBINED -o ~/last-week.htmlТакже существует интерактивный режим --real-time-html, который обновляет страницу через WebSocket. Для него требуется отдельный порт и собственное правило проксирования. Для большинства сайтов достаточно ежечасного отчета, создаваемого через cron, что также упрощает обеспечение безопасности.
GoatCounter: один Go-бинарный файл и один файл SQLite
GoatCounter поставляется в виде статически скомпилированного бинарного файла, поэтому устанавливать среду выполнения не требуется. Загрузите сборку со страницы релизов и запустите её или используйте готовый образ.
docker run -p 8080:8080 -v goatcounter-data:/home/goatcounter/goatcounter-data arp242/goatcounterПри запуске в качестве бинарного файла goatcounter serve ожидает соединения на порту 8080 и создает базу данных SQLite по пути ./goatcounter-data/db.sqlite3. Создайте первый сайт через командную строку, а не через веб-мастер, если экземпляр уже находится за прокси-сервером.
goatcounter db create site -vhost=stats.example.com -user.email=me@example.comПриложение может самостоятельно управлять сертификатами с помощью goatcounter serve -listen=:443 -tls=tls,rdr,acme, используя ACME (автоматизированную среду управления сертификатами), что удобно для сервера, на котором больше ничего не запущено. Если порт 443 уже занят Nginx или Caddy, оставьте GoatCounter на порту 8080 и настройте проксирование запросов к нему. Размер скрипта отслеживания составляет около 3.5K, согласно данным проекта; также доступен трекинг-пиксель для страниц без JavaScript. Если на высоконагруженном сайте производительность SQLite станет ограничением, тот же бинарный файл может работать с Postgres через goatcounter serve -db 'postgresql+dbname=goatcounter'. Резервное копирование выполняется простым копированием файла, что является главным преимуществом такой архитектуры инструмента.
Medama: один контейнер с заявленным потреблением 256 МБ
Medama — это новейший вариант, поставляемый в виде одного бинарного файла. По замыслу разработчиков, он не использует cookie, а размер трекера составляет менее 1 КБ. Проект заявляет о возможности работы на виртуальных машинах с 256 МБ оперативной памяти. Это официальные данные проекта, а не результаты измерений для данного руководства.
docker volume create medama-data
docker run -d -p 127.0.0.1:8080:8080 -v medama-data:/app/data ghcr.io/medama-io/medama:latestОфициальная команда публикует порт 8080:8080. Префикс loopback в команде выше добавлен намеренно; причина этого объясняется в разделе о reverse proxy. Первичный вход выполняется под учетной записью admin с паролем CHANGE_ME_ON_FIRST_LOGIN; название этого пароля и является инструкцией.
Существует один задокументированный сценарий сбоя, с которым вы можете столкнуться. Вход в систему работает только по HTTPS или через localhost. Если вы настроите прокси до получения сертификата, форма будет отклонять верный пароль без вывода сообщения об ошибке. Сначала завершите настройку TLS (transport layer security), а затем выполняйте вход.
Umami: Postgres и привычная панель управления
git clone https://github.com/umami-software/umami.git
cd umami
docker compose up -dЭта команда запускает приложение на порту 3000 вместе с контейнером PostgreSQL. В документации указано, что минимально необходимая версия PostgreSQL — 12.14, а для сборки из исходного кода требуется Node.js версии 18.18 или новее. Существует готовый образ docker.umami.is/umami-software/umami:postgresql-latest, для которого необходимо задать DATABASE_URL, указывающий на уже запущенную базу данных.
Первичные данные для входа: логин admin и пароль umami. Измените их до того, как направите DNS на сервер, так как экземпляр станет доступен из Интернета сразу после обновления DNS-записи и начала работы прокси. Подробности о Docker Compose, файлах окружения и политике перезапуска см. в разделе стек Docker Compose на VPS, вместо того чтобы копировать стек, который вы не изучили.
Системные требования включают процесс Node и базу данных Postgres. Это потребляет больше ресурсов, чем одиночный бинарный файл, но значительно меньше, чем любая система на базе ClickHouse.
Plausible Community Edition: ClickHouse задает минимальный объем RAM
git clone -b v3.2.1 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce
touch .env
echo "BASE_URL=https://stats.example.com" >> .env
echo "SECRET_KEY_BASE=$(openssl rand -base64 48)" >> .env
docker compose up -dВерсия v3.2.1 является актуальной на август 2026 года, и команда клонирования фиксирует её намеренно. Стек состоит из трех частей: приложения, Postgres для учетных записей и настроек, а также ClickHouse для данных о событиях. Значение SECRET_KEY_BASE должно быть строкой длиной не менее 64 байт, которую генерирует вызов openssl.
Собственные требования Plausible предполагают наличие не менее 2 ГБ оперативной памяти, чтобы ClickHouse и приложение не завершались механизмом out of memory killer, а также процессор с поддержкой инструкций SSE 4.2 или NEON, необходимых для ClickHouse. Второе требование стоит проверить перед покупкой, так как это одно из практических различий при выборе между ARM и x86 VPS. ClickHouse также будет занимать столько памяти, сколько посчитает доступным, поэтому на общем сервере установите ограничение, как описано в ограничении памяти контейнера в Compose.
Значение BASE_URL должно в точности совпадать с публичным URL. Если это не так, вы входите в систему, приложение перенаправляет вас на неверный хост, а cookie сессии записывается для домена, на котором ваш браузер не находится, из-за чего вы возвращаетесь на форму входа без сообщения об ошибке.
Поставляемый файл compose не публикует порт, так как предполагается использование прокси перед приложением. Добавьте переопределение, которое публикует стандартный порт приложения только на интерфейсе loopback.
cat > compose.override.yml << EOF
services:
plausible:
ports:
- 127.0.0.1:8000:8000
EOFMatomo: полноценный продукт и требования к серверу
Matomo работает на PHP с использованием MySQL или MariaDB, что означает его соответствие классическому стеку веб-сервисов, а не контейнерному. Это также единственный инструмент в данном списке, для которого опубликованы рекомендации по аппаратному обеспечению в зависимости от объема трафика.
The data behind this chart
[
{
"label": "100K/month",
"cpu_cores": 2,
"ram_gb": 2,
"disk_gb": 50
},
{
"label": "1M/month",
"cpu_cores": 4,
"ram_gb": 8,
"disk_gb": 250
},
{
"label": "10M/month",
"cpu_cores": 8,
"ram_gb": 16,
"disk_gb": 400
}
]Это минимальные требования Matomo, опубликованные по состоянию на август 2026 года, а не измерения, полученные в ходе подготовки данного руководства. Для объема до 100 000 просмотров страниц в месяц требуется 2 ядра CPU, 2 ГБ оперативной памяти и 50 ГБ SSD; при этом один сервер обслуживает и приложение, и базу данных. На уровне 1M/month требования возрастают до 8 ГБ оперативной памяти и 250 ГБ дискового пространства. На уровне 10M/month Matomo рекомендует использовать два сервера, а последняя строка показывает параметры сервера базы данных: 16 ГБ оперативной памяти и 400 ГБ дискового пространства. Сравнивайте эти показатели объема диска с вариантами, использующими один бинарный файл, где весь набор данных хранится в одном файле SQLite.
Процесс архивации часто становится неожиданностью для пользователей. По умолчанию Matomo формирует отчеты в момент открытия панели управления, поэтому по мере накопления данных панель работает медленнее и в конечном итоге время ожидания ответа истекает. Документированное решение заключается в отключении архивации, запускаемой браузером, в общих настройках и настройке запуска архиватора через cron от имени пользователя-владельца файлов Matomo из директории Matomo.
php console core:archive --url=https://analytics.example.comMatomo также хранит таблицы необработанных логов рядом с таблицами обработанных отчетов и позволяет удалять старые необработанные данные и отчеты по расписанию. Включите эту функцию при установке, а не тогда, когда диск будет полностью заполнен. Matomo также может импортировать логи доступа сервера, что делает его единственным продуктом в данном списке, который охватывает оба типа данных одновременно.
Rybbit и новые стеки
git clone https://github.com/rybbit-io/rybbit.git
cd rybbit
chmod +x *.sh
./setup.sh your.domain.nameRybbit — это недавний проект с современным дашбордом. Скрипт установки создает файл окружения и запускает стек с помощью Docker Compose. Он использует ClickHouse и включает Caddy в качестве собственного веб-сервера, который занимает 443 порт и запрашивает сертификат для указанного домена. Если на сервере порт 443 уже занят Nginx, скрипт не сможет выполнить привязку. В этом случае используйте ручной запуск через Compose и разместите проект за уже имеющимся прокси. Документация требует минимум 2 GB оперативной памяти, тестирование проводилось на Ubuntu 24 LTS, а для архитектуры ARM требуется ARMv8.2-A или новее из-за особенностей ClickHouse.
Важное предостережение для любого молодого проекта: функции добавляются быстро, как и изменения, нарушающие обратную совместимость. Фиксируйте версию (тег), читайте примечания к релизу перед обновлением и сначала делайте резервную копию базы данных.
Хранение данных и рост дискового пространства: измерения на вашем сервере
Рост дискового пространства зависит от того, какие данные инструмент сохраняет для каждого события. GoatCounter агрегирует посещения в счетчики, поэтому размер файла больше зависит от количества уникальных страниц и дней, чем от общего объема трафика. Umami и Matomo сохраняют отдельные строки для каждого события, а Matomo дополнительно создает таблицы с обработанными отчетами поверх исходных данных. ClickHouse хранит события в столбцах и эффективно их сжимает, поэтому Plausible справляется с объемами, которые перегрузили бы строковую базу данных.
В этом руководстве не приводятся показатели расхода мегабайт на миллион просмотров страниц, так как они не были измерены для вашего трафика. Выполните замеры самостоятельно. Измените имена сервисов и пользователей в соответствии с вашим файлом Compose.
du -h goatcounter-data/db.sqlite3
docker compose exec db psql -U umami -d umami -c "SELECT pg_size_pretty(pg_database_size('umami'));"
docker compose exec plausible_events_db clickhouse-client -q "SELECT formatReadableSize(sum(bytes_on_disk)) FROM system.parts WHERE active"Запишите текущее значение, подождите неделю, запишите его снова и разделите разницу на количество просмотров страниц, отображаемое в панели управления за эту неделю. Этот показатель отражает специфику вашего сайта и фильтрацию ботов, поэтому он ценнее любого опубликованного среднего значения. Затем установите лимит хранения данных, пока объем базы невелик. Переполнение диска приводит к остановке всех сервисов на VPS, а не только системы аналитики. Это главный аргумент в пользу того, чтобы размещать том базы данных там, где df -h сможет прислать вам предупреждение. Этот риск требует особого внимания на сервере, где уже хранятся объемные данные, поскольку самостоятельно развернутый фотосервер исчерпает место на диске гораздо раньше, чем любая база данных аналитики.
Поведение за обратным прокси на поддомене
Разместите коллектор на поддомене сайта, который он отслеживает, например stats.example.com. Это делает запросы к коллектору первосторонними (first party), поэтому на них не распространяются правила браузеров, блокирующие сторонние запросы.
Привязывайте приложение к loopback при публикации порта контейнера. Docker добавляет собственные правила firewall раньше правил ufw, поэтому контейнер, опубликованный как -p 3000:3000, доступен из Интернета, даже если ufw status сообщает, что порт запрещён. Проверьте это с другой машины с помощью curl http://SERVER_IP:3000 — вы получите dashboard. При публикации как -p 127.0.0.1:3000:3000 тот же тест возвращает Connection refused, и подключиться к нему может только proxy. Эта практика нужна не только для сокрытия dashboard. Она является основой запуска onion service на том же сервере, где любой сервис, отвечающий на публичном интерфейсе, связывает скрытый адрес с вашим IP. Endpoint collector должен оставаться доступным из открытого Интернета, а dashboard — нет. Если вы предпочитаете читать его через private network, а не публиковать второй subdomain, объявление сети VPS в вашем tailnet через subnet router позволит сделать это без открытия порта.
server {
listen 443 ssl;
server_name stats.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Заголовки пересылки (forwarding headers) здесь обязательны. Без X-Forwarded-For все посещения будут приходить с 127.0.0.1, поэтому отчет по странам будет пустым, а количество уникальных посетителей сведется к одному. Каждый проект определяет, какому заголовку и при каких настройках он доверяет, поэтому лучше один раз проверить документацию по прокси, чем делать предположения. Caddy устанавливает эти заголовки автоматически, и Caddyfile для этой задачи состоит всего из двух строк.
stats.example.com {
reverse_proxy 127.0.0.1:3000
}Если вы еще не выбрали прокси, сравнение nginx, Caddy и Traefik поможет понять, какой из них лучше подходит для одного сервера с несколькими поддоменами.
Нужен ли баннер с файлами cookie при самостоятельном хостинге?
Самостоятельный хостинг меняет владельца данных, но не отменяет требования закона в отношении этих данных. Разделяйте два правила. Правило ePrivacy о согласии касается хранения или считывания любой информации на устройстве посетителя, поэтому инструмент, который не устанавливает файлы cookie и ничего не записывает в локальное хранилище, выпадает из этого конкретного требования. GDPR касается обработки персональных данных, а IP-адрес считается персональными данными. Поэтому вам по-прежнему нужны законное основание, ограничение срока хранения и готовность ответить на запрос пользователя о том, какие данные о нём у вас хранятся.
Plausible, Umami, GoatCounter и Medama по умолчанию не используют файлы cookie. То, что каждый из них получает взамен, зависит от конкретного проекта и меняется от версии к версии, поэтому читайте документацию по конфиденциальности самого проекта, а не краткие обзоры. Matomo поставляется с функцией анонимизации IP-адресов и конечной точкой для отказа от отслеживания (opt-out), которые включаются в панели администратора.
Регуляторы в разных странах приходят к разным выводам. Например, французский регулятор CNIL публикует условия, при которых измерение аудитории может быть освобождено от получения согласия. Этот раздел является фактической сводкой, а не юридической консультацией. Для реального сайта с реальными пользователями обратитесь к юристу в вашей юрисдикции.
Один момент, который часто упускают: журнал доступа (access log) — это тоже персональные данные. GoAccess не добавляет скрипты на страницу, но всё равно обрабатывает IP-адреса, поэтому аналитика на основе логов не автоматически выводит вас из-под действия правил. Перенос сервиса на собственный сервер перемещает зону ответственности, а не устраняет её. По этой же причине то, что на самом деле скрывает самостоятельный экземпляр SearXNG ограничивается поисковыми системами, в то время как сами поисковые запросы всё равно попадают в ваши собственные логи.
Блокировщики рекламы и причины снижения показателей
Списки фильтров сопоставляют запросы по имени хоста и шаблону URL. Размещаемый продукт для аналитики легко отследить, так как все загружают его с одного и того же известного домена. Перенос сборщика данных на собственный поддомен исключает этот хост из запроса, а обслуживание скрипта по выбранному вами пути скрывает известное имя файла. Оба действия меняют параметры, по которым работает список фильтров.
В этой статье не приводится процент блокировок, так как измерения не проводились. Доля посетителей, блокирующих конкретную настройку, зависит от вашей аудитории: разработчики блокируют контент гораздо чаще, чем обычные пользователи. Оцените разрыв самостоятельно. В течение одной недели подсчитайте количество запросов к HTML-страницам в access log с помощью GoAccess и сравните результат с количеством просмотров, которые фиксирует ваш скриптовый инструмент. Разница — это заблокированные визиты плюс страницы, загруженные из кэша на вашем сайте.
Ожидайте изменения итоговых цифр в день перехода с облачного продукта, при этом часть изменений не будет связана с блокировками. Разные продукты по-разному определяют просмотр страницы, учитывают ли они смену маршрута внутри single page application и когда завершается сессия. Сравнивайте тренды по неделям, прежде чем делать вывод о падении трафика.
Что и для какого сайта выбрать
- Личный сайт или блог с посещаемостью примерно до 50,000 просмотров в месяц: GoatCounter или Medama на VPS с 1 GB RAM, с резервным копированием через простое копирование файлов.
- Сайт, на который нельзя добавить скрипт, или аудитория, активно блокирующая трекеры: GoAccess, работающий по расписанию с существующими логами.
- Сайт малого бизнеса, где дашборд просматривает кто-то другой: Umami с контейнером Postgres.
- Сайт, где нужны цели и воронки, на сервере с 2 GB RAM или более: Plausible Community Edition или Rybbit, если вам нужен более современный дашборд и вы готовы использовать молодой проект.
- Множество сайтов, несколько учетных записей пользователей или требование хранить «сырые» данные согласно собственной политике удержания: Matomo, с размером ресурсов согласно опубликованным выше рекомендациям.
Начинайте с самого легкого инструмента, который отвечает на ваш конкретный вопрос. Переход с GoatCounter на Plausible в будущем потребует лишь смены поддомена и потери части истории. Переход с Matomo на что-либо другое потребует миграции, которая вам не понравится. Если вы еще решаете, что разместить на том же сервере, обзор инструментов для self-hosting подскажет, что можно установить рядом, а если вам нужно отслеживание запросов на уровне приложения, а не подсчет посетителей, то для этой задачи лучше подойдет система observability для self-hosting.
FAQ
Нужно ли размещать баннер о cookie при использовании self-hosted аналитики?
Нет, это два разных вопроса. Правило о согласии согласно ePrivacy касается хранения или считывания данных на устройстве пользователя, поэтому инструмент, который не использует cookie и не записывает данные в local storage, под это требование не подпадает. GDPR — это другой регламент, регулирующий обработку персональных данных, а IP-адрес является персональными данными, поэтому вам всё равно нужны законные основания для обработки и установленные сроки хранения, даже если cookie не используются. Self-hosting переносит данные на ваш сервер и делает вас ответственным за них лицом. Изучите рекомендации вашего регулятора и проконсультируйтесь с юристом по вашему случаю.
Сколько оперативной памяти нужно для self-hosted аналитики на VPS?
Это зависит от хранилища данных, а не от панели управления. GoatCounter и Medama работают как один процесс с одним файлом, и документация Medama указывает, что для небольших сайтов достаточно 256 MB. Umami требует контейнер Postgres в дополнение к Node приложению. Plausible Community Edition и Rybbit используют ClickHouse, и оба проекта рекомендуют минимум 2 GB. Официальные рекомендации Matomo начинаются с 2 ядер CPU и 2 GB оперативной памяти для нагрузки до 100,000 просмотров страниц в месяц.
Почему показатели self-hosted аналитики ниже, чем у предыдущего сервиса?
Есть две реальные причины. Списки блокировки фильтруют часть запросов к сборщикам данных, поэтому любой инструмент на базе скриптов теряет эти визиты. Кроме того, продукты ведут подсчёт по-разному, так как определение просмотра страницы и окончание сессии у всех различаются. Сравните количество запросов к HTML-страницам из вашего access log за неделю с количеством просмотров страниц через скрипт за тот же период. Разница — это заблокированные визиты плюс кэшированные страницы, измеренные на вашем собственном сервере, а не взятые из чужих оценок.
Можно ли запустить Plausible или Rybbit на ARM VPS?
Оба проекта используют ClickHouse, а ClickHouse требует поддержки SSE 4.2 на x86 или NEON на ARM. Требования Plausible прямо указывают на это, а документация Rybbit гласит, что для ARM-систем необходима архитектура ARMv8.2-A или новее. Современные серверные ядра ARM соответствуют этому требованию, а старые — нет. Ошибка проявляется в том, что ClickHouse отказывается запускаться из-за несовместимости набора инструкций, а не в логах самого приложения. На маломощных ARM-системах инструменты, работающие с одним файлом, позволяют избежать этой проблемы, так как они не используют ClickHouse.
Стоит ли анализировать логи сервера вместо использования скрипта отслеживания?
Используйте парсинг логов, если вы не можете добавить скрипт, если ваша аудитория активно блокирует трекеры или если вам нужен подсчёт, включающий поисковых роботов. GoAccess читает лог, который ваш сервер уже создаёт, поэтому он не увеличивает вес страницы и не требует базы данных. Вы теряете все данные о событиях внутри браузера и не видите страницы, отданные через CDN или из кэша браузера, так как эти запросы не доходят до вашего сервера. Многие сайты используют оба метода и рассматривают их как два разных источника измерений.