I wanted to have a quick play with Googles Pagespeed module, as I use NGINX and not Apache I needed to compile NGINX from source to enable the ngx_pagespeed module. The following assumes you are have a clean CentOS 7 installation.

First off you need to install the packages which enable you to compile NGINX with ngx_pagespeed from source.

yum install -y gcc-c++ pcre-dev pcre-devel zlib-devel make unzip openssl-devel

Now create a NGINX user and make so the user doesn’t have a shell.

useradd nginx
usermod -s /sbin/nologin nginx

Once the required packages have been installed and have created the NGINX user it’s time to grab a copy of the ngx_pagespeed and psol source code. See https://github.com/pagespeed/ngx_pagespeed/releasesexternal link for latest release details.

cd /usr/local/src/
NPS_VERSION=1.9.32.3
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${NPS_VERSION}-beta.zip
unzip release-${NPS_VERSION}-beta.zip
cd ngx_pagespeed-release-${NPS_VERSION}-beta/
wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz
tar -xzvf ${NPS_VERSION}.tar.gz

Now grab the latest version of NGINX. See http://nginx.org/en/download.htmlexternal link for details on the latest release.

cd /usr/local/src/
NGINX_VERSION=1.7.10
wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
tar -xvzf nginx-${NGINX_VERSION}.tar.gz
cd nginx-${NGINX_VERSION}/

Now you have the source its time to configure NGIX and compile

./configure  add-module=/usr/local/src/ngx_pagespeed-release-${NPS_VERSION}-beta  with-http_ssl_module  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
make && make install

Now you have NGINX compiled and installed on your server. While you could manage the process manually it’s best to create an init script. As CentOS 7 uses systemd you need to create a service file in /usr/lib/systemd/system/.

cat >> /usr/lib/systemd/system/nginx.service << NGINX_SERVICE
[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
NGINX_SERVICE
Finally you need to enable and start the service.

systemctl enable nginx
systemctl start nginx

If everything has gone as expected you should have NGINX running your server with the ngx_pagespeed module also loaded. Now you will to do playing with ngx_pagespeed, first of all create a cache directory and make sure that NGINX can read and write to it;

mkdir /var/ngx_pagespeed_cache
chown -R nginx: /var/ngx_pagespeed_cache

then add some directives to your NGINX virtual host block. I used to the following for my tests;

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;

location ~ ^/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_admin { allow 127.0.0.1; deny all; }

# 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 “” “”;
}

pagespeed EnableFilters canonicalize_javascript_libraries,extend_cache,extend_cache_pdfs,combine_css,combine_javascript,move_css_above_scripts,insert_dns_prefetch,rewrite_javascript,rewrite_images,prioritize_critical_css,rewrite_css,rewrite_style_attributes,convert_meta_tags,lazyload_images,collapse_whitespace,move_css_to_head,remove_comments,remove_quotes,inline_css,inline_javascript;
pagespeed UseExperimentalJsMinifier on;