HowtoForge

Install Nginx with ngx_pagespeed on CentOS 7

Ngx-pagespeed is a free and open source Nginx module that can be used to speeds up your site and reduces page load time. It works by automatically applying web performance best practices to pages and associated assets without requiring you to modify your existing content or workflow. You can easily optimize various files such as CSS, HTML, png, and jpg using Ngx-pagespeed module.

Ngx-pagespeed comes with lots of features, some of them are listed below:

In this tutorial, we will discuss how to compile Nginx with ngx_pagespeed module on CentOS 7 server.

Requirements

1 Update the System

Let's start by updating your system to the latest stable version. You can do this by running the following command:

sudo yum update -y

Once your system is updated, restart the system and login with sudo user.

2 Install Required Dependencies

You will need to install some packages in order to compile Nginx. You can install all these dependencies by running the following command:

sudo yum install gcc cmake unzip wget gcc-c++ pcre-devel zlib-devel -y

Once all the required dependencies are installed, you can proceed to the next step.

3 Compile Nginx with Ngx-pagespeed

To install Nginx with ngx-pagespeed module you will need to compile Nginx from source. First, you will need to download the Nginx source. You can download it by running the following command:

wget http://nginx.org/download/nginx-1.12.0.tar.gz

To compile Nginx with ngx_pagespeed module, you will also need to download ngx_pagespeed source package. You can download it with the following command:

wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip

Once both packages are download, Extract them with the following command:

tar -xvzf nginx-1.12.0.tar.gz
tar -xvzf v1.12.34.2-stable.zip

Next, you will also need to download the PageSpeed optimization libraries to compile Nginx. You can download it with the following command:

cd ngx_pagespeed-1.12.34.2-stable
wget https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
tar -xvzf 1.12.34.2-x64.tar.gz
cd ..

Now, let's start to compile Nginx with the pagespeed module.

First, change the directory to the Nginx source directory with the following command:

cd nginx-1.12.0

Next, configure the Nginx source with the following command:

sudo ./configure --add-module=$HOME/ngx_pagespeed-1.12.34.2-stable --user=nobody --group=nobody --pid-path=/var/run/nginx.pid ${PS_NGX_EXTRA_FLAGS}

Once the configuration is completed, compile Nginx by running the following command:

sudo make

The above command will take several minutes. After that you can install nginx by running the following command:

sudo make install

Once Nginx is installed, you will need to create a symlink for the Nginx:

sudo ln -s /usr/local/nginx/conf/ /etc/nginx
sudo ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx

4 Create Nginx Startup Script

You will also need to create a startup script for Nginx to stop and start Nginx. You can do this by creating nginx file inside /etc/init.d directory:

sudo nano /etc/init.d/nginx

Add the following lines:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -n "$user" ]; then
      if [ -z "`grep $user /etc/passwd`" ]; then
         useradd -M -s /bin/nologin $user
      fi
      options=`$nginx -V 2>&1 | grep 'configure arguments:'`
      for opt in $options; do
          if [ `echo $opt | grep '.*-temp-path'` ]; then
              value=`echo $opt | cut -d "=" -f 2`
              if [ ! -d "$value" ]; then
                  # echo "creating" $value
                  mkdir -p $value && chown -R $user $value
              fi
          fi
       done
    fi
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

Save and close the file when you are finished, then give execution permission to it:

sudo chmod +x /etc/init.d/nginx

Now start nginx service and enable it to start on boot time with the following command:

sudo systemctl start nginx
sudo systemctl enable nginx

Once you are done, you can proceed to the next step.

5 Configure Nginx

Now, Nginx is installed with ngx-pagespeed support. By default PageSpeed is disabled. Before enable it, it is recommended to test your website speed. Next, you will need to create a cache directory for ngx-pagespeed and also assign ownership for it to Nginx:

sudo mkdir -p /var/ngx_pagespeed_cache
sudo chown -R nobody:nobody /var/ngx_pagespeed_cache

Next, you will need to make some changes in /etc/nginx/nginx.conf file. You can do this by running the following command:

sudo nano /etc/nginx/nginx.conf

Add the following code between the server block:

# Pagespeed main settings

pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;

# 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 "" ""; }
location ~ "^/ngx_pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon" { }

Note: If you are using virtual hosting then add the above pagespeed directives to each server block config file to enable pagespeed on each website.

Save and close the file when you are finished, then check the Nginx for any configuration error with the following command:

sudo nginx -t

If everything is fine, you should see the following output:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

Finally, restart Nginx for the changes to take effect:

sudo systemctl restart nginx

Once Nginx is configured, you can proceed to test Ngx-pagespeed.

6 Test Ngx-pagespeed

Nginx is now up and running. It's time to check whether the module is working or not. You can check it by running the following command:

curl -I -p http://localhost

You should see the following output:

HTTP/1.1 200 OK
Server: nginx/1.12.0
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
Date: Wed, 21 Jun 2017 17:21:08 GMT
X-Page-Speed: 1.12.34.2-0
Cache-Control: max-age=0, no-cache

You should see X-Page-Speed and it's version number in the above output. This means that you have successfully installed Ngx_pagespeed on your server.

Conclusion

Congratulations! you have successfully installed Nginx with Ngx-pagespeed module support. I hope you can now easily deploy it in a production environment. Feel free to comments me if you have any questions.

Install Nginx with ngx_pagespeed on CentOS 7