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.