NGINX is an awesome high-performance HTTP server and reverse proxy server. NGINX is one of the best performing web servers available due to it’s ability of Handling high concurrency with high performance and efficiency in mind. In this tutorial i will show you how to compile it from source so we can add Google’s PageSpeed module which the default Ubuntu NGINX lacks. The PageSpeed Module speeds up your site and reduces page load time by automatically applying web performance best practices to pages and associated assets (CSS, JavaScript, images) without requiring you to modify your existing content or workflow. Some of the features included in PageSpeed are:
- Image optimization: stripping meta-data, dynamic resizing, recompression
- CSS & JavaScript minification, concatenation, inlining, and outlining
- Small resource inlining
- Deferring image and JavaScript loading
- HTML rewriting
- Cache lifetime extension
- and more
Connect to your server via SSH.
ssh [email protected]
Always update your package sources so that you always have the latest versions of the packages that you may need to download or install.
sudo apt-get update
Now we will download and install all of the dependencies that NGINX requires
sudo apt-get build-dep nginx
We will need to create a work directory to download our source files.
mkdir ~/nginx-pagespeed
Now we change to the newly created directory
cd ~/nginx-pagespeed
The following command will download the source files so we can build our NGINX
sudo apt-get source nginx
Next step is to go to the modules directory so we can get the PageSpeed module prior to compiling.
cd nginx-*/debian/modules
This command will download the latest version of the module
sudo wget https://github.com/pagespeed/ngx_pagespeed/archive/master.zip
Now we will unzip the master.zip file to extract the module. If you don’t have the unzip command available you can get it by running the following command.
sudo apt-get install unzip
Extract the files by running the following:
sudo unzip master.zip
Next we go to the PageSpeed module directory and download the dependencies for the PageSpeed module compilation.
cd ngx_pagespeed-master
Get PSOL libraries required by the PageSpeed module to compile.Depending on what version of the pagespeed module the following file may be different. To find out the correct version to download run this command :
cat config | grep 'wget'
You should see something like this, note the command in red:
echo " $ wget https://dl.google.com/dl/page-speed/psol/1.11.33.3.tar.gz"
Get the correct file using wget as sudo.
sudo wget https://dl.google.com/dl/page-speed/psol/1.11.33.3.tar.gz
Extract the files
sudo tar -xzvf 1.11.33.3.tar.gz
Let’s modify de NGINX compilation config file to include our PageSpeed Module
nano ~/nginx-pagespeed/nginx-*/debian/rules
Assuming we are going to install NGINX using the light configuration which installs the basic modules to NGINX, we will change the following from this:
config.status.light: config.env.light cd $(BUILDDIR_light) && ./configure \ $(common_configure_flags) \ --with-http_gzip_static_module \ --without-http_browser_module \ --without-http_geo_module \ --without-http_limit_req_module \ --without-http_limit_zone_module \ --without-http_memcached_module \ --without-http_referer_module \ --without-http_scgi_module \ --without-http_split_clients_module \ --without-http_ssi_module \ --without-http_userid_module \ --without-http_uwsgi_module \ --add-module=$(MODULESDIR)/nginx-echo \ >$@ touch $@
To this:
config.status.light: config.env.light cd $(BUILDDIR_light) && ./configure \ $(common_configure_flags) \ --with-http_gzip_static_module \ --without-http_browser_module \ --without-http_geo_module \ --without-http_limit_req_module \ --without-http_limit_zone_module \ --without-http_memcached_module \ --without-http_referer_module \ --without-http_scgi_module \ --without-http_split_clients_module \ --without-http_ssi_module \ --without-http_userid_module \ --without-http_uwsgi_module \ --add-module=$(MODULESDIR)/nginx-echo \ --add-module=$(MODULESDIR)/ngx_pagespeed-master \ >$@ touch $@
You could add the same line to any of the other build configurations if light is not what you intend to install.
Now we edit the changelog to provide a better name for our package so we can identify it.
sudo nano ~/nginx-pagespeed/nginx-*/debian/changelog
we can add the word pagespeed to distinguish the package. Should look like this afterwards depending on your version of NGINX
nginx (1.4.6-1ubuntu3.5-pagespeed) trusty-security; urgency=medium
Now we will go to the source directory and build the package
cd ~/nginx-pagespeed/nginx-*/
This will compile the package, this step might take some time so feel free to grab a cup of coffee.
sudo dpkg-buildpackage -b
Now that the package is built all we have to do is install it.
We go into the directory containing the deb packages
cd ~/nginx-pagespeed/
To Install we will run the following command
sudo dpkg -i nginx-common_*pagespeed_all.deb nginx-light_*pagespeed_amd64.deb
Now we enable the PageSpeed module
With this command we will create a directory for the NGINX module to cache files.
sudo mkdir -p /var/pagespeed-cache
Now we give it the correct permissions so the webserver can write to the cache directory.
sudo chown -R www-data:www-data /var/pagespeed-cache
Next step is to add the following lines in the NGINX config file
sudo nano /etc/nginx/nginx.conf
Make sure to add the lines inside the http block
pagespeed on; pagespeed FileCachePath /var/pagespeed-cache;
It should look something like this:
... http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # PageSpeed Settings ## pagespeed on; pagespeed FileCachePath /var/pagespeed-cache; ...
Now we need to add rules in the server in your default config.
sudo nano /etc/nginx/sites-available/default
Add the following lines at the end of your server block like this:
server { listen 80; listen [::]:80; root /usr/share/nginx/html; index index.html index.htm; server_name localhost; location / { } location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; } location ~ "^/pagespeed_static/" { } location ~ "^/ngx_pagespeed_beacon__aSyNcId_