Модуль ngx_pagespeed уменьшает время загрузки страниц и ускоряет общую работу сайта, автоматически применяя различные фильтры для улучшения производительности. Все действия выполняются на лету не изменяя исходных файлов сайта и его содержимого. Для снижения нагрузки в процессе работы модуля используется собственный механизм кэширования.
В число основных возможностей модуля входят:
- Оптимизация изображений, компрессия, удаление метаданных, динамическое изменение размера изображений.
- Минимизация CSS и JavaScript кода, объединение нескольких файлов в один.
- Оптимизация HTML кода страниц сайта.
- Продление срока кэширования файлов.
- Отложенные загрузка и отображение JS-скриптов.
С полным списком возможностей можно ознакомиться прочитав официальную документацию по модулю.
PageSpeed собирается только из исходников и не входит в состав сборки сервера устанавливаемой из системных репозиториев Ubuntu.
В системе должны присутствовать следующие пакеты.
1 |
apt-get install -y build-essential unzip libpcre++-dev libssl-dev |
Переходим в рабочий каталог /usr/local/src, сюда будем скачивать все исходники.
1 |
cd /usr/local/src |
Скачиваем Nginx.
1 |
wget http://nginx.org/download/nginx-1.13.4.tar.gz |
Распаковываем архив с исходниками.
1 |
tar -zxvf nginx-1.13.4.tar.gz |
Скачиваем последнюю версию PageSpeed. Текущую версию можно посмотреть здесь.
1 |
wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip |
Распаковываем архив с исходниками.
1 |
unzip v1.12.34.2-stable.zip |
Удаляем более не нужные архивы.
1 |
rm nginx-1.13.4.tar.gz v1.12.34.2-stable.zip |
Переходим в распакованный каталог с исходниками Pagespeed.
1 |
cd ngx_pagespeed-1.12.34.2-stable |
Находясь в каталоге с исходниками, cкачиваем PageSpeed Optimization Libraries (PSOL) - набор библиотек для оптимизации.
Ссылка на скачивание PSOL, прописана в файле PSOL_BINARY_URL, данный файл находится в этом же каталоге. Просмотреть его содержимое можно командой cat.
1 2 3 |
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.
1 |
wget https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz |
1 |
tar -zxvf 1.12.34.2-x64.tar.gz |
1 |
rm 1.12.34.2-x64.tar.gz |
Необходимо пропатчить файл ngx_pagespeed.cc, находящийся в каталоге /src. Если этого не сделать, то при компиляции будет следующая ошибка.
1 2 3 4 5 6 7 8 9 |
/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-файл, в котором будут указаны необходимые изменения для патча.
1 |
nano 1453.diff |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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 |
1 2 3 4 5 6 7 8 |
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 |
1 2 3 4 5 6 7 8 |
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.
1 |
cp updated.ngx_pagespeed.cc src/ngx_pagespeed.cc |
1 |
cd /usr/local/src/nginx-1.13.4 |
Чтобы собрать Nginx c pagespeed модулем нужно добавить следующую опцию к своей конфигурации сервера.
1 |
--add-module=/usr/local/src/ngx_pagespeed-1.12.34.2-stable |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
--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…" заново.
1 2 3 4 5 6 7 8 9 10 |
# Ошибки могущие возникнуть в процессе сборки. -------------------------------------------------------------------------------- ./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.
1 |
make && make install |
1 2 3 4 5 6 |
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 |
1 |
useradd -s /usr/sbin/nologin nginx |
1 |
mkdir /var/cache/nginx |
1 |
ln -s /usr/sbin/nginx /bin/nginx |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Создаем конфигурационный файл 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 |
1 2 3 |
# Запуск и добавление в автозагрузку. systemctl enable nginx.service systemctl start nginx.service |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
Подскажите, если nginx установлен, текущую версию надо удалить перед сборкой новой?
А как он (nginx) был установлен? Из репозиториев (через apt) или собирался самостоятельно, как в этой статье? Если из репозиториев, то конечно удалить сначала. Если собирался самостоятельно, то можно просто выполнить make install новой конфигурации, по крайней мере я делал так раньше, пока не перешел на сборку собственных пакетов с nginx.
В любом случае, что бы вы не делали не забывайте про бэкапы системы, статья-то уже старая, больше года как-никак.