Внедрение фрагмента отслеживания Google Analytics на веб-сайты за обратным прокси-сервером Nginx

Я давно хотел использовать Google Analytics и не хочу вставлять фрагмент отслеживания вручную на каждую веб-страницу. Кроме того, это может даже не поддерживаться сторонними приложениями, такими как Plex, Deluge и т. Д.

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

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

У кого-нибудь есть идеи? Обязательно ли перенаправлять порты или что-то еще, чтобы использовать Google Analytics? Все исходящие запросы в настоящее время не фильтруются, чего бы это ни стоило. Вот конфигурации, которые я пробовал до сих пор:

1) Глобальный тег сайта:

http {
    server  {
        listen  443 ssl;
        server_name www.website.com;
        ssl  on;
        location  / {
            proxy_pass http://12.34.56.78:2000/;

            sub_filter   </head>
                    "<script>
                        <!-- Global site tag (gtag.js) - Google Analytics -->
                        <script async src='https://www.googletagmanager.com/gtag/js?id=UA-##########-1'></script>
                        <script>
                          window.dataLayer = window.dataLayer || [];
                          function gtag(){dataLayer.push(arguments);}
                          gtag('js', new Date());

                      gtag('config', 'UA-##########-1');
                    </script>
                </script>";
            sub_filter_once on;
    }
}

2) Analytics.js:

http {
    server  {
        listen  443 ssl;
        server_name www.website.com;
        ssl  on;
        location  / {
            proxy_pass http://12.34.56.78:2000/;

            sub_filter </head> '<script>(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,"script","https://www.google-analytics.com/analytics.js","ga");ga("create","UA-##########","auto");ga("send","pageview");</script></head>';        

            sub_filter_once on;
    }
}

3) Analytics.js без встроенного в конфигурацию фрагмента JS:

http {
    server  {
        listen  443 ssl;
        server_name www.website.com;
        ssl  on;
        location  / {
            proxy_pass http://12.34.56.78:2000/;

            sub_filter  </head>
            '<script language="javascript" src="/etc/nginx/analytics.js"></script></head>';
            sub_filter_once on;
    }
}

Файл analytics.js, упомянутый выше:

<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-##########', 'auto');
ga('send', 'pageview');
</script>
<!-- End Google Analytics -->

Системная информация:

Операционная система: CentOS 7.5
Nginx Версия: 1.15.2
Включенные модули: http_ssl_module, stream, http_stub_status_module, http_sub_module

Источники, которые я использовал:

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

1) Gist Proof of Concept: https://gist.github.com/jirutka/5279057

2) Подтверждение концепции сообщения в блоге: https://adarrohn.com/blog/nginx-google-analytics

3) Вопрос по Ruby-форуму: https://www.ruby-forum.com/topic/1985946

4) Документы Google Analytics на gtag.js: https://developers.google.com/analytics/devguides/collection/gtagjs/

5) Документы Google Analytics на analytics.js: https://developers.google.com/analytics/devguides/collection/analyticsjs/

6) Документы Nginx на http_sub_module: https://nginx.org/en/docs/http/ngx_http_sub_module.html


person TJ Zimmerman    schedule 02.08.2018    source источник


Ответы (1)


Вот как это сработало для меня

sub_filter '</body>' '<script src="/tealeaf/file.js" type="text/javascript"></script>\r\n</body>';

Т.е. в одну строку.

Добавление кода GA на каждую страницу веб-сайта - это не то, чем люди сейчас занимаются. Я предлагаю начать использовать GTM и вставить фрагмент кода GTM на каждую страницу (используя тот же метод). Таким образом, вы сможете настроить сбор данных, не меняя код отслеживания [много].

Что нужно проверить, вы не указываете здесь URL-адрес своего веб-сайта, но - пожалуйста, загрузите страницу и убедитесь, что фрагмент кода GA включен перед тегом

  • пожалуйста, откройте инструменты разработчика в своем браузере, перейдите на вкладку сети и нажмите cntrl + f5 (жесткое обновление) страницы. Затем посмотрите, загружен ли файл analytics.js с сервера google

  • Если да, посмотрите, поступил ли запрос на / сбор конечной точки Google Analytics. Если это правда, вы должны увидеть данные в GA.

Если ничего из вышеперечисленного, я бы посмотрел, поддерживается ли sub_flter в локациях proxy_pass в nginx

Отредактировано 8 августа 2018 г.  Возникла проблема с файлом JS

введите здесь описание изображения

person Dmitry    schedule 03.08.2018
comment
Привет, Спасибо за ответ. После проверки вкладки сети в моем браузере выяснилось, что файл javascript имеет ошибку 404ing. Это связано с тем, что целевой файл находится не на общедоступном веб-сервере, а в другом месте файловой системы. Разве нельзя передать статический файл в sub_filter? В конце концов, я бы не хотел делать этот файл общедоступным, поскольку он содержит частный идентификатор отслеживания. - person TJ Zimmerman; 03.08.2018
comment
Ваш идентификатор отслеживания НЕ является частным, поскольку вашей клиентской библиотеке (javascript) требуется доступ к нему. Невозможно скрыть это от человека, который хочет его извлечь. У меня это работает с локальным файлом. Что-то не так с путем? Как nginx трактует относительные пути? Какой у вас 404-й запрашиваемый URL? - person Dmitry; 05.08.2018
comment
В этом есть смысл. Проблема заключалась в том, что на обратном прокси-сервере у меня был js-файл, а не на веб-сервере. С тех пор я исправил это, и теперь у меня есть обратный прокси, вставляющий две разные строки sub_filter в зависимости от поддомена, к которому вы подключаетесь. Первое - это ваше решение, а второе - это глобальный тег сайта, указанный в пункте 1) выше. Я могу подтвердить, что файл analytics.js доступен для чтения в Интернете, кроме того, оба экземпляра внедряют скрипт в раздел ‹head›. Однако «сетевая» часть консоли разработчика не показывает трафик в Google Analytics. И GA не сообщает ни о каком трафике :( - person TJ Zimmerman; 05.08.2018
comment
@TJZimmerman - не могли бы вы поделиться URL-адресом веб-сайта, чтобы я мог посмотреть, отслеживается ли он? - person Dmitry; 06.08.2018
comment
Конечно, вот два упомянутых выше примера. Обратите внимание, как субдомен (и источник страницы) различаются для каждого из них. tjzimmerman.com и tjzimmerman.com | И, наконец, вот фрагмент конфигурации nginx, который вводит эту информацию: Сообщите мне, могу ли я предоставить дополнительную информацию. - person TJ Zimmerman; 06.08.2018
comment
Пытался прикрепить изображение, не получилось. Но есть проблема с вашим фрагментом кода GA. Вы копируете / вставляете фрагмент (который является HTML) в файл JS (JavaScript), который браузер пытается интерпретировать и, очевидно, терпит неудачу. Попробуйте удалить тег ‹SCRIPT›, ‹/ SCRIPT› и ‹! - ... -› (теги комментариев HTML) - person Dmitry; 08.08.2018