Сборка Nginx с модулем Google PageSpeed на Ubuntu Server 16.04.

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

В число основных возможностей модуля входят:

  • Оптимизация изображений, компрессия, удаление метаданных, динамическое изменение размера изображений.
  • Минимизация CSS и JavaScript кода, объединение нескольких файлов в один.
  • Оптимизация HTML кода страниц сайта.
  • Продление срока кэширования файлов.
  • Отложенные загрузка и отображение JS-скриптов.

С полным списком возможностей можно ознакомиться прочитав официальную документацию по модулю.

PageSpeed собирается только из исходников и не входит в состав сборки сервера устанавливаемой из системных репозиториев Ubuntu.

В системе должны присутствовать следующие пакеты.

apt-get install -y build-essential unzip libpcre++-dev libssl-dev

Переходим в рабочий каталог /usr/local/src, сюда будем скачивать все исходники.

cd /usr/local/src

Скачиваем Nginx.

wget http://nginx.org/download/nginx-1.13.4.tar.gz

Распаковываем архив с исходниками.

tar -zxvf nginx-1.13.4.tar.gz

Скачиваем последнюю версию PageSpeed. Текущую версию можно посмотреть здесь.

wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip

Распаковываем архив с исходниками.

unzip v1.12.34.2-stable.zip

Удаляем более не нужные архивы.

rm nginx-1.13.4.tar.gz v1.12.34.2-stable.zip

Переходим в распакованный каталог с исходниками Pagespeed.

cd ngx_pagespeed-1.12.34.2-stable

Находясь в каталоге с исходниками, cкачиваем PageSpeed Optimization Libraries (PSOL) - набор библиотек для оптимизации.

Ссылка на скачивание PSOL, прописана в файле PSOL_BINARY_URL, данный файл находится в этом же каталоге. Просмотреть его содержимое можно командой cat.

cat PSOL_BINARY_URL

https://dl.google.com/dl/page-speed/psol/1.12.34.2-$BIT_SIZE_NAME.tar.gz

Где $BIT_SIZE_NAME означает разрядность системы. Поскольку система 64-х битная, то добавляем к ссылке - x64.

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

Распаковываем библиотеки.

tar -zxvf 1.12.34.2-x64.tar.gz

Удаляем архив.

rm 1.12.34.2-x64.tar.gz

Необходимо пропатчить файл ngx_pagespeed.cc, находящийся в каталоге /src. Если этого не сделать, то при компиляции будет следующая ошибка.

/usr/local/src/ngx_pagespeed-1.12.34.2-stable/src/ngx_pagespeed.cc:3011:31:
error: ‘ngx_http_core_try_files_phase’ was not declared in this scope
while (ph[i + 1].checker != ngx_http_core_try_files_phase &&
                               ^
objs/Makefile:1434: recipe for target 'objs/addon/src/ngx_pagespeed.o' failed
make[1]: *** [objs/addon/src/ngx_pagespeed.o] Error 1
make[1]: Leaving directory '/usr/local/src/nginx-1.13.4'
Makefile:8: recipe for target 'build' failed
make: *** [build] Error 2

Находясь в каталоге с исходниками PageSpeed, создадим diff-файл, в котором будут указаны необходимые изменения для патча.

nano 1453.diff

Содержимое файла 1453.diff.

diff --git a/src/ngx_pagespeed.cc b/src/ngx_pagespeed.cc
index 8487f8ab6..97f07d98c 100644
--- a/src/ngx_pagespeed.cc
+++ b/src/ngx_pagespeed.cc
@@ -3019,13 +3019,17 @@ ngx_int_t ps_preaccess_handler(ngx_http_request_t* r) {
   ph = cmcf->phase_engine.handlers;
 
   i = r->phase_handler;
+
   // move handlers before try_files && content phase
+  // As of nginx 1.13.4 we will be right before the try_files module
+  #if (nginx_version < 1013004)
   while (ph[i + 1].checker != ngx_http_core_try_files_phase &&
          ph[i + 1].checker != ngx_http_core_content_phase) {
     ph[i] = ph[i + 1];
     ph[i].next--;
     i++;
   }
+  #endif
 
   // insert ps phase handler
   ph[i].checker = ps_phase_handler;
@@ -3081,8 +3085,16 @@ ngx_int_t ps_init(ngx_conf_t* cf) {
     ngx_http_core_main_conf_t* cmcf = static_cast<ngx_http_core_main_conf_t*>(
         ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module));
 
+    int phase = NGX_HTTP_PRECONTENT_PHASE;
+
+    // As of nginx 1.13.4, try_files has changed.
+#if (nginx_version < 1013004)
+    phase = NGX_HTTP_PREACCESS_PHASE;
+#endif
+
     ngx_http_handler_pt* h = static_cast<ngx_http_handler_pt*>(
-        ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers));
+        ngx_array_push(&cmcf->phases[phase].handlers));
+
     if (h == NULL) {
       return NGX_ERROR;
     }
diff --git a/testing-dependencies/nginx b/testing-dependencies/nginx
index 6917d29d4..c556874e1 160000
--- a/testing-dependencies/nginx
+++ b/testing-dependencies/nginx
@@ -1 +1 @@
-Subproject commit 6917d29d409b187d440d8e5012a1353398e3a365
+Subproject commit c556874e174ff5b93a24976ed7032def2e8670c6

Проверим патч, чтобы не было конфликтов.

patch --dry-run src/ngx_pagespeed.cc -i 1453.diff

# Должно быть так
checking file src/ngx_pagespeed.cc
Hunk #1 succeeded at 3007 (offset -12 lines).
Hunk #2 succeeded at 3073 (offset -12 lines).
File src/ngx_pagespeed.cc is not a regular file -- refusing to patch
1 out of 1 hunk ignored

Патчим файл ngx_pagespeed.cc, измененный файл будет называться updated.ngx_pagespeed.cc.

patch src/ngx_pagespeed.cc -i 1453.diff -o updated.ngx_pagespeed.cc

# Должно быть так.
patching file updated.ngx_pagespeed.cc (read from src/ngx_pagespeed.cc)
Hunk #1 succeeded at 3007 (offset -12 lines).
Hunk #2 succeeded at 3073 (offset -12 lines).
File src/ngx_pagespeed.cc is not a regular file -- refusing to patch
1 out of 1 hunk ignored -- saving rejects to file updated.ngx_pagespeed.cc.rej

Заменяем старый файл на новый. Просто копируем новый файл в каталог /src попутно переименовав его в ngx_pagespeed.cc.

cp updated.ngx_pagespeed.cc src/ngx_pagespeed.cc

Теперь можно собирать сервер. Переходим в каталог с исходниками Nginx.

cd /usr/local/src/nginx-1.13.4

Чтобы собрать Nginx c pagespeed модулем нужно добавить следующую опцию к своей конфигурации сервера.

--add-module=/usr/local/src/ngx_pagespeed-1.12.34.2-stable

Например так, ничего лишнего, все ненужное убрано/отключено.

--prefix=/etc/nginx 
--sbin-path=/usr/sbin/nginx 
--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 
--user=nginx 
--group=nginx 
--without-http_autoindex_module 
--without-http_ssi_module 
--without-http_scgi_module 
--without-http_uwsgi_module 
--without-http_split_clients_module 
--without-http_memcached_module 
--without-http_empty_gif_module 
--without-http_browser_module 
--with-http_ssl_module 
--with-http_v2_module 
--with-http_realip_module 
--with-http_mp4_module 
--with-http_auth_request_module 
--with-http_stub_status_module 
--with-http_random_index_module 
--with-http_gunzip_module 
--with-threads 
--add-module=/usr/local/src/ngx_pagespeed-1.12.34.2-stable

# Задаем конфигурацию командой
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --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 --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_split_clients_module --without-http_memcached_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads --add-module=/usr/local/src/ngx_pagespeed-1.12.34.2-stable

Если при конфигурации сервера у вас возникли какие либо ошибки, то это означает, что вы что-то забыли установить из списка необходимых пакетов в начале статьи. Найдите свою ошибку в списке и установите нужные пакеты, после чего выполните ./configure заново.

# Ошибки могущие возникнуть в процессе сборки.
 
--------------------------------------------------------------------------------
./configure: error: the HTTP rewrite module requires the PCRE library.
 
apt-get install -y libpcre++-dev
--------------------------------------------------------------------------------
./configure: error: SSL modules require the OpenSSL library.
 
apt-get install -y libssl-dev

Если по завершению не было никаких ошибок, то компилируем и устанавливаем Nginx.

make && make install

Проверяем что получилось.

nginx -V
nginx version: nginx/1.13.4
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --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 --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_split_clients_module --without-http_memcached_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads --add-module=/usr/local/src/ngx_pagespeed-1.12.34.2-stable

Создадим пользователя nginx.

useradd -s /usr/sbin/nologin nginx

Создадим каталог /var/cache/nginx.

mkdir /var/cache/nginx

Создадим символическую ссылку на исполняемый файл nginx в каталоге /bin.

ln -s /usr/sbin/nginx /bin/nginx

Создаем службу nginx.service.

# Создаем конфигурационный файл nginx.service
nano /lib/systemd/system/nginx.service
 
# Содержание файла nginx.service:
 
[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target
 
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
 
[Install]
WantedBy=multi-user.target

Добавляем службу nginx.service в автозагрузку и запускаем.

# Запуск и добавление в автозагрузку.
systemctl enable nginx.service
systemctl start nginx.service

Проверяем как работает.

systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-08-11 22:53:26 MSK; 2min 25s ago
  Process: 990 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 904 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 994 (nginx)
    Tasks: 2
   Memory: 11.4M
      CPU: 66ms
   CGroup: /system.slice/nginx.service
           ├─994 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
           └─995 nginx: worker process

Про настройку модуля Pagespeed можно почитать здесь.

3 КОММЕНТАРИИ

  1. Подскажите, если nginx установлен, текущую версию надо удалить перед сборкой новой?

    • А как он (nginx) был установлен? Из репозиториев (через apt) или собирался самостоятельно, как в этой статье? Если из репозиториев, то конечно удалить сначала. Если собирался самостоятельно, то можно просто выполнить make install новой конфигурации, по крайней мере я делал так раньше, пока не перешел на сборку собственных пакетов с nginx.

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

Ответить:

Please enter your comment!
Please enter your name here