Nginx + Google Pagespeed Debian Package

The normal Debian mirrors do not carry the nginx package with the Google Pagespeed Module. These instructions will allow you to create your own package that includes Pagespeed. The nginx package is from wheezy-backports which has a newer copy of nginx than the normal wheezy repo, remove -backports from any commands you run if you do not want that version.

You will need to install the following packages for the build process (you don’t need to build them on your web server, I use a server just for builds):

apt-get install devscripts dpkg-dev build-essential zlib1g-dev libpcre3 libpcre3-dev unzip

Install the dependencies needed for the build:

apt-get -t wheezy-backports build-dep nginx

Create a new directory and download a copy of the source:

mkdir /usr/src/nginx
cd /usr/src/nginx
apt-get -t wheezy-backports source nginx

To make things easier, set $nginx to the version of nginx:

root@apt:/usr/src/nginx# ls | grep nginx
nginx-1.6.0
....
root@apt:/usr/src/nginx# nginx="nginx-1.6.0"

Google Pagespeed

Go to the Google Pagespeed build page. Copy the text from the text box with the heading “Then download ngx_pagespeed” without the “cd ~”.

Go into the nginx modules directory and paste the commands from the Google site:

root@apt:/usr/src/nginx# cd ${nginx}/debian/modules
root@apt:/usr/src/nginx/nginx-1.6.0/debian/modules#   wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.7.30.4-beta.zip
--2014-05-18 10:07:20--  https://github.com/pagespeed/ngx_pagespeed/archive/release-1.7.30.4-beta.zip
....
2014-05-18 10:07:27 (89.2 KB/s) - `release-1.7.30.4-beta.zip' saved [114200]

root@apt:/usr/src/nginx/nginx-1.6.0/debian/modules#   unzip release-1.7.30.4-beta.zip
Archive:  release-1.7.30.4-beta.zip
f8b87ea4360f04039b32e762bf2726aed2e43084
   creating: ngx_pagespeed-release-1.7.30.4-beta/
....
root@apt:/usr/src/nginx/nginx-1.6.0/debian/modules#   cd ngx_pagespeed-release-1.7.30.4-beta/
root@apt:/usr/src/nginx/nginx-1.6.0/debian/modules/ngx_pagespeed-release-1.7.30.4-beta#   wget https://dl.google.com/dl/page-speed/psol/1.7.30.4.tar.gz
--2014-05-18 10:07:32--  https://dl.google.com/dl/page-speed/psol/1.7.30.4.tar.gz
....
root@apt:/usr/src/nginx/nginx-1.6.0/debian/modules/ngx_pagespeed-release-1.7.30.4-beta#   tar -xzvf 1.7.30.4.tar.gz
psol/
psol/include_history.txt
psol/lib/
psol/lib/Debug/
.....

Take note of the folder the ngx_pagespeed release zip file is extracted to (eg. ngx_pagespeed-release-1.7.30.4-beta). Edit the /usr/src/nginx/${nginx}/debian/rules file so that the pagespeed module is compiled in. In the file search for light_configure_flags, full_configure_flags and extras_configure_flags. Each block will have one or more “–add-module” parts, add another pointing to the pagespeed folder:

light_configure_flags := \
      $(common_configure_flags) \
....
      --add-module=$(MODULESDIR)/ngx_pagespeed-release-1.7.30.4-beta \
      --add-module=$(MODULESDIR)/nginx-echo
....

full_configure_flags := \
      $(common_configure_flags) \
....
      --add-module=$(MODULESDIR)/ngx_pagespeed-release-1.7.30.4-beta \
      --add-module=$(MODULESDIR)/nginx-auth-pam \
....

extras_configure_flags := \
      $(common_configure_flags) \
....
      --add-module=$(MODULESDIR)/ngx_pagespeed-release-1.7.30.4-beta \
      --add-module=$(MODULESDIR)/nginx-echo \
....

Make sure the directory name is correct.

Building Package

Make sure you are in the directory where the source code was extracted and then run dch -i to increment the version and add an entry into the change log.

root@apt:/usr/src/nginx/nginx-1.6.0# cd /usr/src/nginx/${nginx}
root@apt:/usr/src/nginx/nginx-1.6.0# dch -i

The packages can then be built with dpkg-buildpackage -b:

root@apt:/usr/src/nginx/nginx-1.6.0# dpkg-buildpackage -b
dpkg-buildpackage: source package nginx
dpkg-buildpackage: source version 1.6.0-1~bpo70+1.1
dpkg-buildpackage: source changed by root 
dpkg-buildpackage: host architecture amd64
 dpkg-source --before-build nginx-1.6.0
 debian/rules clean
dh clean --with systemd
....
dpkg-deb: building package `nginx-naxsi-ui' in `../nginx-naxsi-ui_1.6.0-1~bpo70+1.1_all.deb'.
 dpkg-genchanges -b >../nginx_1.6.0-1~bpo70+1.1_amd64.changes
dpkg-genchanges: binary-only upload - not including any source code
 dpkg-source --after-build nginx-1.6.0
dpkg-buildpackage: binary only upload (no source included)

The /usr/src/nginx will have the .deb files that can be installed on the web servers as normal or uploaded to your own apt repoistory.

root@apt:/usr/src/nginx/nginx-1.6.0# find /usr/src/nginx -name *.deb
/usr/src/nginx/nginx-light-dbg_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-extras-dbg_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-light_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-naxsi_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx_1.6.0-1~bpo70+1.1_all.deb
/usr/src/nginx/nginx-extras_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-full-dbg_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-common_1.6.0-1~bpo70+1.1_all.deb
/usr/src/nginx/nginx-naxsi-dbg_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-full_1.6.0-1~bpo70+1.1_amd64.deb
/usr/src/nginx/nginx-doc_1.6.0-1~bpo70+1.1_all.deb
/usr/src/nginx/nginx-naxsi-ui_1.6.0-1~bpo70+1.1_all.deb
root@apt:/usr/src/nginx/nginx-1.6.0# dpkg -i /usr/src/nginx/nginx-full_1.6.0-1~bpo70+1.1_amd64.deb /usr/src/nginx/nginx-common_1.6.0-1~bpo70+1.1_all.deb /usr/src/nginx/nginx-doc_1.6.0-1~bpo70+1.1_all.deb

Configuration

Edit /etc/nginx/nginx.conf and add the following:

http {
....
  pagespeed on;
  pagespeed FileCachePath /var/lib/nginx/pagspeed_cache;
  pagespeed PreserveUrlRelativity on;
  pagespeed CriticalImagesBeaconEnabled false;
  pagespeed XHeaderValue "Powered By ngx_pagespeed";
....

Edit any of sites (usually in /etc/nginx/sites-available/) and add the following:

server {
....
  location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
  location ~ "^/ngx_pagespeed_static/" { }
  location ~ "^/ngx_pagespeed_beacon$" { }
  location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
  location /ngx_pagespeed_global_statistics { allow 127.0.0.1; deny all; }
  location /ngx_pagespeed_message { allow 127.0.0.1; deny all; }
  location /pagespeed_console { allow 127.0.0.1; deny all; }
  location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
....

Restart nginx and pagespeed will then be enabled.

Filters can be enabled specifically with pagespeed EnableFilters. This can be defined in the main configuration file or the site configuration, eg. in /etc/nginx/sites-available/test.com

server {
....
  pagespeed EnableFilters inline_preview_images,lazyload_images,resize_mobile_images,rewrite_images,sprite_images,fallback_rewrite_css_urls,flatten_css_imports,outline_javascript;
  pagespeed EnableFilters inline_css,move_css_above_scripts,move_css_to_head,outline_css,rewrite_css,combine_css,combine_javascript,defer_javascript,inline_javascript,rewrite_javascript;
....
}

For more complete config options see the docs.

Posted in Linux, Web and tagged , , , .

Leave a Reply

Your email address will not be published. Required fields are marked *