Normally you will install Nginx using apt-get install nginx, but in some scenarios we may need to install Nginx from source on Ubuntu. The reason could be we want to either install nginx with new custom nginx module which is not there in base nginx version or we don’t want to use all the modules available by default in nginx. In this article we are going to delve into it. Please remember if we go this route of installing from source, going forward you need to do compile only if you need to add one more package or upgrade nginx.
Follow the given below steps to install Nginx from source code on Ubuntu 14.04 LTS server.
Step-1
login as SUDO User
login as super user on system.
#sudo -i
Step-2
Download the Nginx source code from NGINX official site.
Always use latest available stable version. You can download the nginx source code from Nginx.org download page.
Here we are using curl command to download the current available latest package.
curl -O http://nginx.org/download/nginx-1.6.2.tar.gz
Step-3
Add nginx user to run NGINX demon in server.
Command to add nginx user with nologin shell.
#useradd -s /sbin/nologin nginx
Step-4
Install dependency packages
Installing all the dependency packages and NGINX modules.
apt-get install build-essential libc6 libpcre3 libpcre3-dev libpcrecpp0 libssl0.9.8 libssl-dev zlib1g zlib1g-dev lsb-base openssl libssl-dev libgeoip1 libgeoip-dev google-perftools libgoogle-perftools-dev libperl-dev libgd2-xpm-dev libatomic-ops-dev libxml2-dev libxslt1-dev python-dev
Step-5
Extract NGINX source code
User tar command to extract the downloaded nginx source code.
#tar -xvzf nginx-1.6.2.tar.gz
It will extract out the Nginx directory.
Compiling NGINX source code
First change to directory extracted out from nginx tar ball.
#cd nginx-1.6.2/
Step-6
Now compile the Nginx source code.
#./configure –user=nginx –group=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 –with-rtsig_module –with-select_module –with-poll_module –with-file-aio –with-ipv6 –with-http_ssl_module –with-http_spdy_module –with-http_realip_module –with-http_addition_module –with-http_xslt_module –with-http_image_filter_module –with-http_geoip_module –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_mp4_module –with-http_gunzip_module –with-http_gzip_static_module –with-http_auth_request_module –with-http_random_index_module –with-http_secure_link_module –with-http_degradation_module –with-http_stub_status_module –with-http_perl_module –with-mail –with-mail_ssl_module –with-cpp_test_module –with-cpu-opt=CPU –with-pcre –with-pcre-jit –with-md5-asm –with-sha1-asm –with-zlib-asm=CPU –with-libatomic –with-debug –with-ld-opt=”-Wl,-E”
Install NGINX with below command
#make && make install
The nginx installation is successfully competed.
Now we have to create nginx daemon file which will be used for nginx service start,stop,status,reload,restart .
Step-7
Create Nginx Daemon file
Create a new file called nginx inside /etc/init.d
#vi /etc/init.d/nginx
And paste the below given code
#! /bin/bash
. /lib/lsb/init-functions
#——————————————————————————
#Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Consts
#——————————————————————————
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/
DAEMON=/usr/sbin/nginx
PS="nginx"
PIDNAME="nginx"Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #lets you do $PS-slave
PIDFILE=$PIDNAME.pid                   #pid file
PIDSPATH=/var/run
DESCRIPTION="Nginx Server version 1.6.2"
RUNAS=root                             #user to run as
SCRIPT_OK=0Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ala error codes
SCRIPT_ERROR=1Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #ala error codes
TRUE=1Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #boolean
FALSE=0Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #boolean
lockfile=/var/lock/subsys/nginx
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
#——————————————————————————
#Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Simple Tests
#——————————————————————————
#test if nginx is a file and executable
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
       . /etc/default/nginx
fi
#set exit condition
#set -e
#——————————————————————————
#Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Functions
#——————————————————————————
setFilePerms(){
    if [ -f $PIDSPATH/$PIDFILE ]; then
               chmod 400 $PIDSPATH/$PIDFILE
       fi
}
configtest() {
       $DAEMON -t -c $NGINX_CONF_FILE
}
getPSCount() {
       return `pgrep -f $PS | wc -l`
}
isRunning() {
       if [ $1 ]; then
               pidof_daemon $1
               PID=$?
               if [ $PID -gt 0 ]; then
                       return 1
               else
                       return 0
               fi
       else
               pidof_daemon
               PID=$?
               if [ $PID -gt 0 ]; then
                       return 1
               else
                       return 0
               fi
       fi
}
#courtesy of php-fpm
wait_for_pid () {
       try=0
    while test $try -lt 35 ; do
               case "$1" in
                       ‘created’)
                       if [ -f "$2" ] ; then
                               try=”
                               break
                       fi
                       ;;
                       ‘removed’)
                       if [ ! -f "$2" ] ; then
                               try=”
                               break
                       fi
                       ;;
               esac
               #echo -n .
               try=`expr $try + 1`
               sleep 1
       done
}
status(){
       isRunning
       isAlive=$?
       if [ "${isAlive}" -eq $TRUE ]; then
               echo "$PIDNAME found running with processes: `pidof $PS`"
       else
               echo "$PIDNAME is NOT running."
       fi
}
removePIDFile(){
       if [ $1 ]; then
               if [ -f $1 ]; then
                       rm -f $1
               fi
       else
               #Do default removal
               if [ -f $PIDSPATH/$PIDFILE ]; then
                       rm -f $PIDSPATH/$PIDFILE
               fi
       fi
}
start() {
       log_daemon_msg "Starting $DESCRIPTION"
       isRunning
       isAlive=$?
       if [ "${isAlive}" -eq $TRUE ]; then
               log_end_msg $SCRIPT_ERROR
       else
               start-stop-daemon –start –quiet –chuid $RUNAS –pidfile $PIDSPATH/$PIDFILE –exec $DAEMON \
               — -c $NGINX_CONF_FILE
               setFilePerms
               log_end_msg $SCRIPT_OK
       fi
}
stop() {
       log_daemon_msg "Stopping $DESCRIPTION"
       isRunning
       isAlive=$?
       if [ "${isAlive}" -eq $TRUE ]; then
               start-stop-daemon –stop –quiet –pidfile $PIDSPATH/$PIDFILE
               wait_for_pid ‘removed’ $PIDSPATH/$PIDFILE
               if [ -n "$try" ] ; then
                       log_end_msg $SCRIPT_ERROR
               else
                       removePIDFile
                       log_end_msg $SCRIPT_OK
               fi
       else
               log_end_msg $SCRIPT_ERROR
       fi
}
reload() {
       configtest || return $?
       log_daemon_msg "Reloading (via HUP) $DESCRIPTION"
       isRunning
       if [ $? -eq $TRUE ]; then
               `killall -HUP $PS` #to be safe
               log_end_msg $SCRIPT_OK
       else
               log_end_msg $SCRIPT_ERROR
       fi
}
quietupgrade() {
       log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION"
       isRunning
       isAlive=$?
       if [ "${isAlive}" -eq $TRUE ]; then
               kill -USR2 `cat $PIDSPATH/$PIDFILE`
               kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin`
        isRunning
               isAlive=$?
               if [ "${isAlive}" -eq $TRUE ]; then
                       kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
                       wait_for_pid ‘removed’ $PIDSPATH/$PIDFILE.oldbin
                       removePIDFile $PIDSPATH/$PIDFILE.oldbin
                       log_end_msg $SCRIPT_OK
               else
                       log_end_msg $SCRIPT_ERROR
                       log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION"
                       kill -HUP `cat $PIDSPATH/$PIDFILE`
                       kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin`
                       kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
                       wait_for_pid ‘removed’ $PIDSPATH/$PIDFILE.oldbin
                       removePIDFile $PIDSPATH/$PIDFILE.oldbin
                       log_end_msg $SCRIPT_ok
               fi
       else
               log_end_msg $SCRIPT_ERROR
       fi
}
terminate() {
       log_daemon_msg "Force terminating (via KILL) $DESCRIPTION"
       PIDS=`pidof $PS` || true
       [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
       for i in $PIDS; do
               if [ "$i" = "$PIDS2" ]; then
                       kill $i
                       wait_for_pid ‘removed’ $PIDSPATH/$PIDFILE
                       removePIDFile
               fi
       done
       log_end_msg $SCRIPT_OK
}
destroy() {
       log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION"
       killall $PS -q >> /dev/null 2>&1
       log_end_msg $SCRIPT_OK
}
pidof_daemon() {
   PIDS=`pidof $PS` || true
   [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
   for i in $PIDS; do
       if [ "$i" = "$PIDS2" ]; then
           return 1
       fi
   done
   return 0
}
case "$1" in
 start)
       start
       ;;
 stop)
       stop
       ;;
 restart|force-reload)
       stop
       sleep 1
       start
       ;;
 reload)
       $1
       ;;
 status)
       status
       ;;
 configtest)
       $1
       ;;
 quietupgrade)
       $1
       ;;
 terminate)
       $1
       ;;
 destroy)
       $1
       ;;
 *)
       FULLPATH=/etc/init.d/$PS
       echo "Usage: $FULLPATH {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}"
       echo "      The ‘destroy’ command should only be used as a last resort."Â
       exit 1
       ;;
esac
exit 0
Save and exit from file.
To make it executable, give the executable permission to nginx daemon file.
#chmod +x /etc/init.d/nginx
Step-8
How to start/stop/status of Nginx service
To start the nginx service, use the command –
#/etc/init.d/nginx start
To stop the nginx service, use the command –
#/etc/init.d/nginx stop
To check status the nginx service, use the command –
#/etc/init.d/nginx status
Use –help argument , to know about more usage of nginx daemon script . Given below is reference from our system.
# /etc/init.d/nginx –help
Usage: /etc/init.d/nginx {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}
Step-9
Check Web Server
To check web server accessible on port 80, open the web browser and type the ip address or hostname of web server in URL field.
http://IPADDRESS_OF_NGINX_SERVER
It will display the default WELCOME page.
That’s it, we are done with NGINX source code installation with custom modules.