Модуль 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 можно почитать здесь.