Get Social

Лучший способ сборки и установки Nginx incubator pagespeed на Ubuntu Vesta CP

Для скромности, надо сказать, что это по моему мнению лучший способ на данный момент.

Шаг 1. Подготовка: управление пакетами – зависимости для сборки nginx pagespeed

Для начала нужно проверить, чтобы в источниках пакетов была строка с “deb-src” для nginx.

Открываем (или создаём) нужный файл из sources.list.d/

nano /etc/apt/sources.list.d/nginx.list

Вы увидите что-то подобное:

deb http://nginx.org/packages/mainline/ubuntu/ yakkety nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ yakkety nginx

если второй строки нет, тогда нужно её добавить (просто скопировать первую строку и дописать “-src”)

Затем нужно обновить кэш:

aptitude update

После этого поставить все последние обновления:

aptitude safe-upgrade

Дальше, скачаем всё необходимое (зависимости) для сборки nginx из исходных кодов:

apt-get build-dep nginx

Шаг 2. Загрузка и распаковка – исходный код nginx, модуль pagespeed incubator, библиотека PSOL

Создадим рабочую папку и перейдём в неё:

mkdir ~/nginx-with-pagespeed
cd ~/nginx-with-pagespeed

Шаг 2.1. Загрузка исходного кода nginx

Скачаем исходный код последней версии nginx

apt-get source nginx

Если посмотреть, что в папке, увидим нечто похожее:

# ls -lh
total 1.1M
drwxr-xr-x 10 root root 4.0K Jan 9 12:03 nginx-1.13.4
-rw-r--r-- 1 root root 106K Aug 8 20:52 nginx_1.13.4-1~yakkety.debian.tar.xz
-rw-r--r-- 1 root root 1.5K Aug 8 20:52 nginx_1.13.4-1~yakkety.dsc
-rw-r--r-- 1 root root 966K Aug 8 20:52 nginx_1.13.4.orig.tar.gz

Шаг 2.2. Загрузка и распаковка исходного кода модуля pagespeed incubator

Пройдите по ссылке: https://www.modpagespeed.com/doc/release_notes
и найдите последний стабильный релиз:
(в моём случае это был: 1.12.34.3-stable)

Теперь выполните следующие команды:

NPS_VERSION=1.12.34.3-stable
NGINX_VERSION=nginx-1.13.4
wget https://github.com/pagespeed/ngx_pagespeed/archive/v${NPS_VERSION}.zip
cd ${NGINX_VERSION}/src/http/ && unzip ~/nginx-with-pagespeed/v${NPS_VERSION}.zip

Возможно, вы получите ошибку и придётся поставить unzip:
apt install unzip

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

Шаг 2.3. Загрузка библиотеки PSOL

Для этого лучше всего снова вернуться в нашу рабочую папку:
cd ~/nginx-with-pagespeed

Раньше библиотека PSOL скачивалась такой простой командой:
wget https://dl.google.com/dl/page-speed/psol/1.12.34.3.tar.gz

Однако, всё чаще встречается такая ошибка:

The file doesn't exist on the server:
https://dl.google.com/dl/page-speed/psol/1.12.34.3.tar.gz
and you can get also:
ERROR 404: Not Found.

В этом случае, попробуйте добавить префикс “-x64” к названию.
Также, если ошибка повторяется – попробуйте уменьшить последнюю цифру на 1.
В моём случае сработала такая команда:

wget https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz

переходим в папку с распакованным pagespeed:

cd ~/nginx-with-pagespeed/${NGINX_VERSION}/src/http/incubator-pagespeed-ngx-1.12.34.3-stable

и здесь распаковываем библиотеку psol
tar -xzvf ~/nginx-with-pagespeed/1.12.34.2-x64.tar.gz

Шаг 3. Модификация исходного кода Nginx для pagespeed

Теперь нужно внести правки в 2 файла, перед тем, как собрать deb пакет:

Шаг 3.1. Изменения в файле debian/rules

Открываем правила для сборки:

nano ~/nginx-with-pagespeed/${NGINX_VERSION}/debian/rules

Вставляем путь к модулю nginx pagespeed, который выглядит примерно так:
–add-module=$(CURDIR)/src/http/incubator-pagespeed-ngx-1.12.34.3-stable

В этой секции:
config.status.nginx: config.env.nginx
cd $(BUILDDIR_nginx) && \

В самом конце следующей строки (в моём случае это была 41 строка):
CFLAGS="" ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.......

Шаг 3.2 Изменения в файле debian/changelog

Открываем в редакторе:

nano ~/nginx-with-pagespeed/${NGINX_VERSION}/debian/changelog

и меняем первую строку, которая выглядит примерно так:
nginx (1.13.4-1~yakkety) yakkety; urgency=low
на:
nginx (1.13.4-1~yakkety-pagespeed) yakkety; urgency=low
(то есть дописываем что-то, что указывает на наличие pagespeed в этой версии nginx)

Шаг 4. Сборка и установка deb-пакета nginx с модулем nginx pagespeed incubator

Шаг 4.1. Сборка deb-пакета nginx с модулем nginx pagespeed incubator

Переходим в папку с исходным кодом nginx

cd ~/nginx-with-pagespeed/${NGINX_VERSION}

и начинаем сборку:

dpkg-buildpackage -b

Возможные ошибки при сборке nginx с модулем nginx pagespeed

В основном, ошибки могут быть вызваны нехваткой подходящих -dev пакетов в системе. Например, в одном из случаем я получил такую ошибку:

Ошибка “checking for psol … not found”

configuring additional modules
adding module in /root/nginx-with-pagespeed/nginx-1.13.9/src/http/incubator-pagespeed-ngx-1.13.35.2-stable
mod_pagespeed_dir=/root/nginx-with-pagespeed/nginx-1.13.9/src/http/incubator-pagespeed-ngx-1.13.35.2-stable/psol/include
build_from_source=false
checking for psol ... not found
./configure: error: module ngx_pagespeed requires the pagespeed optimization library.
Look in /root/nginx-with-pagespeed/nginx-1.13.9/debian/build-nginx/objs/autoconf.err for more details.
debian/rules:40: recipe for target 'config.status.nginx' failed
make: *** [config.status.nginx] Error 1
dpkg-buildpackage: error: debian/rules build gave error exit status 2

Чтобы её исправить, смотрим autoconf.err
nano /root/nginx-with-pagespeed/nginx-1.13.9/debian/build-nginx/objs/autoconf.err

по слову “psol” находим подробное описание ошибки:
checking for psol
/usr/bin/ld: cannot find -luuid
collect2: error: ld returned 1 exit status

Решение такое:
aptitude install uuid-dev

Шаг 4.2. Установка deb-пакета nginx с модулем nginx pagespeed incubator

После сборки проверяем, что у нас получилось в нашей рабочей папке:
cd ~/nginx-with-pagespeed && ls -lh
total 17M
drwxr-xr-x 10 root root 4.0K Jan 9 20:25 nginx-1.13.4
-rw-r--r-- 1 root root 106K Aug 8 20:52 nginx_1.13.4-1~yakkety.debian.tar.xz
-rw-r--r-- 1 root root 1.5K Aug 8 20:52 nginx_1.13.4-1~yakkety.dsc
-rw-r--r-- 1 root root 1.1K Jan 9 20:25 nginx_1.13.4-1~yakkety-pagespeed_amd64.changes
-rw-r--r-- 1 root root 4.2M Jan 9 20:25 nginx_1.13.4-1~yakkety-pagespeed_amd64.deb
-rw-r--r-- 1 root root 966K Aug 8 20:52 nginx_1.13.4.orig.tar.gz
-rw-r--r-- 1 root root 11M Jan 9 20:25 nginx-dbg_1.13.4-1~yakkety-pagespeed_amd64.deb
-rw-r--r-- 1 root root 146K Jan 9 12:14 v1.12.34.3-stable.zip

Чтобы установить собранный нами nginx с модулем pagespeed, выполните команду:
dpkg -i nginx_1.13.4-1~yakkety-pagespeed_amd64.deb

Теперь можем проверить версию Nginx:
nginx -V
nginx version: nginx/1.13.4
built by gcc 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/root/nginx-with-pagespeed/${NGINX_VERSION}=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --add-module=/root/nginx-with-pagespeed/${NGINX_VERSION}/src/http/incubator-pagespeed-ngx-1.12.34.3-stable

Шаг 5. Защита пакета Nginx с модулем pagespeed incubator от обновлений

Чтобы предотвратить обновление Nginx при будущих обновлениях, лучше всего запретить автоматическое обновление пакета Nginx. Это можно сделать 2-мя способами:

Шаг 5.1. Зафиксировать пакет Nginx с модулем pagespeed incubator в Aptitude (“Hold”)

В терминале запустите aptitude, затем найдите “nginx” and нажмите “=” на нём (или ctrl+T, затем “Hold” в выпадающем меню).

Шаг 5.2. Зафиксировать пакет Nginx с модулем pagespeed incubator в Apt (“Pin”)

Если вы не пользуетесь aptitude, тогда можно сделать так:

Создайте новый файл для nginx в папке /etc/apt/preferences.d:
nano /etc/apt/preferences.d/nginx

Затем вставьте следующие строки в него:

Package: nginx
Pin: version 1.13.4-1~yakkety-pagespeed
Pin-Priority: 1001

Обязательно проверьте, что название вашего пакета и версий Nginx подходящие.

Шаг 6. Настройка Nginx с модулем nginx pagespeed incubator

В общем случае, вы можете создать папку ngx_pagespeed_cache, где будет храниться кэш, например в папке /var:
mkdir -p /var/ngx_pagespeed_cache
chown -R www-data:www-data /var/ngx_pagespeed_cache

и непосредственно настройки модуля внести в файл виртуального хоста
(например, /etc/nginx/conf.d/example.com)

Однако, в случае, когда на сервере установлена панель управления Vesta CP, настройку лучше сделать так:

Откроем файл настроек виртуального хоста, где они обычно располагаются под управлением Vesta CP. Это может быть что-то вроде:
nano /home/admin/conf/web/snginx.conf

или
nano /home/USER/conf/web/example.com.apache2.ssl.conf

Нам нужно найти подобную директиву:
include /home/admin/conf/web/snginx.example.com.conf*;

Теперь, в согласии с ней, создадим новый файл, куда и добавим настройки модуля pagespeed:
nano /home/admin/conf/web/snginx.example.com.conf_pagespeed

Вот образец (помним, что все пути к файлам нужно изменить на свои):

## Pagespeed Settings
pagespeed on;
pagespeed FileCachePath /home/admin/web/example.com/ngx_pagespeed_cache;
pagespeed ImageRecompressionQuality 95;
pagespeed HttpCacheCompressionLevel 0;
pagespeed Disallow "*.svg";
#
# Ensure requests for pagespeed optimized resources go to the pagespeed handler and no extraneous headers get set.
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
location ~ "^/ngx_pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon" { }

Проверим конфиг:
nginx -t

Готово, можно перезапускать Nginx:

service nginx restart

Это всё!