Цель: Предоставить инструкцию по сборке динамического модуля, дать понимание принципа сборки динамического модуля для Nginx поставленного из репозитория Debian.

Целевая аудитория: Администраторы серверов, продвинутые администраторы сайтов, сео-оптимизаторы и просто те кто хочет добиться хорошей оценки от сервиса Google PageSpeed.

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

План действий такой:

1. Арендуем vps на час.
2. Собираем на арендованной vps динамический модуль на той же самой версии Nginx что была использована на боевом (это ВАЖНО!!!. Поддержка динамических модулей у Nginx появилась с версии 1.9.11).
3. Перекидываем модуль на новый сервер.
4. Конфигурируем Nginx.
5. Применяем настройки.
6. Замораживаем версию Nginx (Если это не сделать, то при ближайшем обновлении Nginx, произойдёт падение сервера. Причина в том что скомпилированный модуль будет работать только с конкретной версией Nginx. Если захотите обновиться, скомпилируете модуль для новой версии и обновитесь).

Или следим за тем что обновляем и своевременно добавляем новый собранный модуль.

Преимущество в том что боевой сервер не подвергается изменению и если Вам к примеру не понравится ngx_pagespeed, то вы просто уберёте строчки конфигурирующие его и сам модуль. Ну и если Вы используете несколько серверов с Nginx Вы можете один раз скомпилировать модуль для них всех.

Годные ссылки на аналогичные статьи, но не достаточно раскрытые на мой взгляд:

> Install Nginx ngx_pagespeed Module on Ubuntu 16.04
> How to Install Nginx and Google PageSpeed on Debian/Ubuntu
> НАСТРОЙКА NGINX

Официальные ссылки ngx_pagespeed
> ngx_pagespeed — gihub
> Документация ngx_pagespeed

Переходим к самой инструкции.

Подключаемся к тестовому серверу по ssh.

Устанавливаем apt-src.

apt install apt-src

Добавляем репозиторий исходного кода и репозиторий пакетов с необходимой версией Nginx.У меня это Nginx/1.13.5

echo -e 'deb-src http://ftp.ru.debian.org/debian sid main\ndeb http://ftp.ru.debian.org/debian sid main' >> /etc/apt/sources.list

Обновим кэш пакетов.

apt update
apt-src update

Скачаем исходники Nginx в текущую папку.

apt-src install nginx

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

Установим необходимые зависимости для модуля:

apt install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip ca-certificates

Проверим текущую версию модуля.

Укажем версию для установки.

NPS_VERSION=1.12.34.3-stable

Скачаем исходники модуля:

wget https://github.com/pagespeed/ngx_pagespeed/archive/v${NPS_VERSION}.zip

Распакуем в текущую папку:

unzip v${NPS_VERSION}.zip

Подготовим исходники к сборке:

cd ngx_pagespeed-${NPS_VERSION}/
NPS_RELEASE_NUMBER=${NPS_VERSION/stable/}
psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_RELEASE_NUMBER}.tar.gz
[ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget ${psol_url}
tar -xzvf $(basename ${psol_url})

Теперь добавим в сырцы информацию о нашем модуле чтобы он собрался вместе с Nginx, предварительно узнаем путь к сырцам нашего модуля.

pwd
nano ../nginx-1.13.5/debian/rules

Высветившийся путь после первой команды копируем чтобы добавить в rules.

--add-dynamic-module=/root/ngx_pagespeed-1.12.34.3-stable

image

Приступаем к сборке предварительно вернувшись на уровень выше.

cd ../
apt-src build  nginx

В процессе сборки будет задан вопрос, отвечаем на него нет.

image

После успешной сборки модуль я нашёл по адресу:

./nginx-1.13.5/debian/build-extras/objs/ngx_pagespeed.so

На боевом сервере размещаем в папку:

/usr/lib/nginx/modules

Далее в файле:

/etc/nginx/nginx.conf

добавляем загрузку модуля:

load_module modules/ngx_pagespeed.so;

Если Вы хотите задействовать модуль в работе всех сайтов, там же укажите вот эти две строчки.
Если папку которую Вы указываете не существует, создайте её и присвой права пользователя nginx.

mkdir -p /var/cache/nginx/ngx_pagespeed
chown www-data:www-data /var/cache/nginx/ngx_pagespeed

# Pagespeed
 pagespeed on;
 pagespeed FileCachePath /var/cache/nginx/ngx_pagespeed;

image

В виртуальном хосте сайтов на которых мы хотим чтобы работал модуль добавляем:

location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
 add_header "" "";
}
location ~ "^/pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon$" { }

В виртуальные хосты сайтов на которых он не должен работать добавляем:

pagespeed off;

Буду рад любым комментариям, если у Вас что-то не получилось, пишите. Буду дополнять статью по мере возникновения вопросов.

Комментарии (29)


  1. Code5
    12.10.2017 07:40
    +3

    и зачем это? статья так и не раскрыла для чего нужен этот модуль


    1. castomi Автор
      12.10.2017 11:41

      Ну так в целях статьи и не планировалось раскрывать для чего он нужен. В статье есть ссылка на документацию, а если кратно, он помогает повысить оценку Google PageSpeed.
      Прям всё раскрыть это надо книгу писать, если будут возникать вопросы, буду дополнять.


      1. kernUSR
        12.10.2017 12:53

        он помогает повысить оценку Google PageSpeed

        Простите, но это звучит бредово. Да, оценка повышается, но какой профит от этих попугаев? Вы ведь сайт оптимизируете не ради оценки, а для клиентов!
        Если уж говорить кратко о пользе модуля, то он увеличивает скорость загрузки страниц сайта за счёт сжатия js и css, оптимизации изображений, использование браузерного кэша (подставляет заголовки Expires, Cache-Control, Last-Modified). И всё это без вмешательства в код проекта. Так же этот модуль имеет встроенный механизм кэширования на стороне сервера, что значительно снижает нагрузку на сервер при запросах контента клиентами.

        Прям всё раскрыть это надо книгу писать

        Ели вникать в технологию, с подробным разбором и примерами, то тут и на 3х-томник можно набрать =).


        1. castomi Автор
          12.10.2017 13:03

          Простите, но это звучит бредово.
          Сходите в документацию и посмотрите, там нет ничего бредового.

          Да, оценка повышается, но какой профит от этих попугаев?
          Есть. И Вы их сами перечислили. И это далеко не всё, я сам ещё все доки не прочитал…

          Вы ведь сайт оптимизируете не ради оценки, а для клиентов!
          Я да, правда есть и такие которым не важно что там творится на сайте лишь бы циферку по больше увидеть))

          Ели вникать в технологию, с подробным разбором и примерами, то тут и на 3х-томник можно набрать =).
          Это да. Буду дополнять то что не понятно.


  1. Sovigod
    12.10.2017 08:37
    +1

    Ручное компилирование и раскладывание библиотеки по серверам? Вы прям в 2005 год ушли.
    А как же автоматизация, оркестрация и тестирование? Тут лучше бы подошел плейбук для ansible или что-то подобное, как цель этой статьи. Что бы проблем с обновлением не было.

    И укажите линк на оригинал интрукции по сборке. Она ведь меняется иногда.


    1. castomi Автор
      12.10.2017 11:42

      Линк указан, на гитхабе инструкция. Вернее ссылка на неё.
      И к тому же я планирую поддерживать данную инструкцию в актуальном состоянии.


      1. Sovigod
        12.10.2017 12:36

        В актуальном состоянии? Актуально клонировать исходники одной командой. А не держать лишнюю копипасту.

        bash <(curl -f -L -sS https://ngxpagespeed.com/install)


        1. castomi Автор
          12.10.2017 12:49

          Я не пробовал, но для Nginx из репозитория Debian это скорее всего не подойдёт, а статья именно о нём. О том как собирать Nginx из официальных реп nginx инфы хватает.


  1. berezuev
    12.10.2017 10:40
    +1

    Банальной настройкой конфигов Nginx и грамотной версткой балл GPSI можно поднять в зеленую зону без всяких левых плагинов.


    1. castomi Автор
      12.10.2017 11:45

      Согласен, так не просто можно, так правильнее на мой взгляд.
      Данный способ хорош когда до этого всё делал не правильно, а теперь вдруг нужен быстрый результат. И сеошники поговаривают что сайты с включённым модулем особенно учитываются при ранжировании, правда лично я 100% доказательств этого не встречал, это больше домыслы.


      1. berezuev
        12.10.2017 11:58
        +1

        Все сеошники должны гореть спички жидкость для розжига противопожарные системы не дорого в аду)

        Ну и, добавить с десяток строчек в конфиг и сделать минифакцию всего — это явно быстрее, чем проводить все манипуляции из статьи. Некоторые уникумы даже умудряются за это брать по 100000 руб.


        1. castomi Автор
          12.10.2017 12:02

          Все сеошники должны гореть спички жидкость для розжига противопожарные системы не дорого в аду)
          Я отношусь к этому несколько более спокойно)

          Некоторые уникумы даже умудряются за это брать по 100000 руб.
          Ну они же наверное там не только ngx_pagespeed настраивают?)) Хотя конечно 100к это ни чё так деньги. Я беру за полную настройку сервера от 5к)))), причём за эти деньги я даю серьёзное ускорение даже на тарифе младше первоначального. Может мне пора повышать цены?)))


  1. ibKpoxa
    12.10.2017 11:12

    Сделайте пакет под debian, раз уж под него инструкция. Как раз можно, даже нужно, сделать проверку зависимостей от нужной версии nginx.


    1. castomi Автор
      12.10.2017 11:46

      Идея хорошая, но заниматься подобным нет желания.


  1. Alexmaru
    12.10.2017 11:47
    +1

    А ещё он есть в dotdeb, и к слову — под pagespeed всё равно нужно переделывать сайт, чтобы он отдавал больше статики (и не с private заголовками), иначе ему приходится анализировать и сравнивать каждый ответ, что быстро приводит и к перенагрузке, и к медленному ответу сервера.


    Сразу нужно сайт проектировать, чтобы всё компилировалось, и картинки пересжимались.


    В общем, довольно опасный пакет.


    1. castomi Автор
      12.10.2017 11:52

      А ещё он есть в dotdeb
      Не знал, правда в моём случае эта информация никак не помогает, ведь у меня Debian 9, а Nginx из unstable репозитория. Но спасибо за инфу, я наверное чуть позже допишу эту информацию в статью, предварительно только проверю как оно там пашет.

      В общем, довольно опасный пакет.

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

      что быстро приводит и к перенагрузке, и к медленному ответу сервера

      На практике ответ сервера увеличивается примерно на 40мс, не скажу что это сильно критично, многое зависит от качества настройки. Ну и мощности Вашего сервера.


  1. kernUSR
    12.10.2017 11:53

    Статья хороша для совсем несмыслящих в настройке сервера. Разжовано всё по полочкам!
    Но, лично я, не вижу смысла в этой статье, т.к. подобных статей уйма. А вот статей о настройке пэйджспида, с таким подробным объяснением, днём с огнём не сыщишь! (во всяком случае в рускоязычном сегменте интернета)


    1. castomi Автор
      12.10.2017 11:58

      Но, лично я, не вижу смысла в этой статье, т.к. подобных статей уйма.

      У данной статьи есть несколько особенностьей.
      1. Я нассказываю как скомпилировать модуль из исходников Nginx взятых из репозиторией Debian, то есть данный модуль можно будет подкинуть всем кто использует Nginx не из официальных реп Nginx, а из официальных реп Debian. Процесс сборки несколько отличается.
      2. Я показываю как собирать именно динамический модуль.

      Разжовано всё по полочкам!
      Старался, хотя думаю вопросы у новичков всё равно будут.

      А вот статей о настройке пэйджспида, с таким подробным объяснением, днём с огнём не сыщишь! (во всяком случае в рускоязычном сегменте интернета)

      Это да, но есть же документация официальная. Я дал на неё ссылку. Да она на забугорном, но в принципе всё понятно. Может найдутся желающие заняться её переводом, но я не рискну)


  1. castomi Автор
    12.10.2017 11:54

    Прошу прощения, я тут чей-то комментарий случайно отклонил, парень писал о том что года два назад пробовал этот модуль, я тыкал чтобы ответить ему, а там не ответить, а отклонить. Если Вы читаете это, напишите пожалуйста комментарий снова. Ещё раз прошу прощения.


  1. VBart
    12.10.2017 17:09
    +1

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


    1. castomi Автор
      12.10.2017 17:19

      может легко привести к крайне низкой производительности
      Всё что делаешь может привести к низкой производительности. Логично что если коряво настроено то будет плохо.

      ато попугаи в неком сервисе будут радовать глаз и не важно, что сайт тормозит и ложиться под нагрузкой.
      Во всём Важен баланс, я не говорил что циферки это главное.


      1. VBart
        12.10.2017 18:50
        +1

        Люди, включающие pagespeed и удивляющиеся почему nginx на 10 rps начинает упираться в cpu, приходят периодически.


        1. castomi Автор
          12.10.2017 19:22

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


          1. darken99
            13.10.2017 13:44

            Скупой всегда платит дважды.
            А для себя я давно решил со скупыми не работать.


            1. castomi Автор
              13.10.2017 14:47

              Я бы с удовольствием жил бы по таким же правилам. Но моё имя пока ещё не гремит чтобы люди выстраивались ко мне в очередь). Довольствуюсь теми заказами которые есть. Ладно бы жил один, а так ещё семья. Могу только завидовать белой завистью).


        1. ibKpoxa
          13.10.2017 11:30

          Но ведь можно кешировать результат его работы :)


          1. castomi Автор
            13.10.2017 12:10

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


  1. idcooldi
    12.10.2017 17:19

    Я пользовался этой документацией года два-три назад, причём там есть как для nginx так и для apache


    1. castomi Автор
      12.10.2017 17:19

      Да, я дал ссылочку на гитхаб. С него есть ссылка которую Вы дали.