How to Install Nginx from source in Debian Jessie

By | May 23, 2015

In this post we will see how to Install Nginx from source in Debian jessie.

Nginx (pronounced engine-x) is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server. Igor Sysoev started development of Nginx in 2002, with the first public release in 2004. Nginx is known for its high performance, stability, rich feature set, simple configuration, and low resource consumption. Nginx has many modules, and what modules need to be enabled depends largely on how it will be used in a particular environment. Here we will make a standard nginx installation on Debian jessie. This should be sufficient to run a good LEMP stack.

1) Install the prerequisites:

apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev libssl-dev libxslt-dev libgd-dev libgeoip-dev

2) Download the latest nginx source tarball, extract it and install:

Please note that as of this writing, the latest nginx stable branch version is 1.8.0 and the mainline branch version 1.9.0. We will install the latest stable version.

mkdir /nginx_install

cd /nginx_install

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

tar -xf nginx-1.8.0.tar.gz

cd nginx-1.8.0

./configure --prefix=/usr/share/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 --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_geoip_module --with-http_xslt_module --with-pcre --with-http_addition_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_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-file-aio --with-ipv6 --with-http_image_filter_module --with-http_spdy_module --with-mail --with-mail_ssl_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

make

make install

make clean

mkdir /var/cache/nginx

3) Create the Nginx init Script:

touch /etc/init.d.nginx
chmod u+x /etc/init.d.nginx
vi /etc/nginx

Now paste the code block below:

#!/bin/sh
 ### BEGIN INIT INFO
 # Provides: nginx
 # Required-Start: $local_fs $remote_fs $network $syslog $named
 # Required-Stop: $local_fs $remote_fs $network $syslog $named
 # Default-Start: 2 3 4 5
 # Default-Stop: 0 1 6
 # Short-Description: starts the nginx web server
 # Description: starts nginx using start-stop-daemon
 ### END INIT INFO
 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 DAEMON=/usr/sbin/nginx
 NAME=nginx
 DESC=nginx
 # Include nginx defaults if available
 if [ -r /etc/default/nginx ]; then
 . /etc/default/nginx
 fi
 STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"
 test -x $DAEMON || exit 0
 . /lib/init/vars.sh
 . /lib/lsb/init-functions
 # Try to extract nginx pidfile
 PID=$(cat /etc/nginx/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
 if [ -z "$PID" ]
 then
 PID=/run/nginx.pid
 fi
 # Check if the ULIMIT is set in /etc/default/nginx
 if [ -n "$ULIMIT" ]; then
 # Set the ulimits
 ulimit $ULIMIT
 fi
 #
 # Function that starts the daemon/service
 #
 do_start()
 {
 # Return
 # 0 if daemon has been started
 # 1 if daemon was already running
 # 2 if daemon could not be started
 start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \
 || return 1
 start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \
 $DAEMON_OPTS 2>/dev/null \
 || return 2
 }
 test_nginx_config() {
 $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1
 }
 #
 # Function that stops the daemon/service
 #
 do_stop()
 {
 # Return
 # 0 if daemon has been stopped
 # 1 if daemon was already stopped
 # 2 if daemon could not be stopped
 # other if a failure occurred
 start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME
 RETVAL="$?"
 sleep 1
 return "$RETVAL"
 }
 #
 # Function that sends a SIGHUP to the daemon/service
 #
 do_reload() {
 start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME
 return 0
 }
 #
 # Rotate log files
 #
 do_rotate() {
 start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME
 return 0
 }
 #
 # Online upgrade nginx executable
 #
 # "Upgrading Executable on the Fly"
 # http://nginx.org/en/docs/control.html
 #
 do_upgrade() {
 # Return
 # 0 if nginx has been successfully upgraded
 # 1 if nginx is not running
 # 2 if the pid files were not created on time
 # 3 if the old master could not be killed
 if start-stop-daemon --stop --signal USR2 --quiet --pidfile $PID --name $NAME; then
 # Wait for both old and new master to write their pid file
 while [ ! -s "${PID}.oldbin" ] || [ ! -s "${PID}" ]; do
 cnt=`expr $cnt + 1`
 if [ $cnt -gt 10 ]; then
 return 2
 fi
 sleep 1
 done
 # Everything is ready, gracefully stop the old master
 if start-stop-daemon --stop --signal QUIT --quiet --pidfile "${PID}.oldbin" --name $NAME; then
 return 0
 else
 return 3
 fi
 else
 return 1
 fi
 }
 case "$1" in
 start)
 [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
 do_start
 case "$?" in
 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
 stop)
 [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
 do_stop
 case "$?" in
 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
 esac
 ;;
 restart)
 log_daemon_msg "Restarting $DESC" "$NAME"
 # Check configuration before stopping nginx
 if ! test_nginx_config; then
 log_end_msg 1 # Configuration error
 exit 0
 fi
 do_stop
 case "$?" in
 0|1)
 do_start
 case "$?" in
 0) log_end_msg 0 ;;
 1) log_end_msg 1 ;; # Old process is still running
 *) log_end_msg 1 ;; # Failed to start
 esac
 ;;
 *)
 # Failed to stop
 log_end_msg 1
 ;;
 esac
 ;;
 reload|force-reload)
 log_daemon_msg "Reloading $DESC configuration" "$NAME"
 # Check configuration before reload nginx
 #
 # This is not entirely correct since the on-disk nginx binary
 # may differ from the in-memory one, but that's not common.
 # We prefer to check the configuration and return an error
 # to the administrator.
 if ! test_nginx_config; then
 log_end_msg 1 # Configuration error
 exit 0
 fi
 do_reload
 log_end_msg $?
 ;;
 configtest|testconfig)
 log_daemon_msg "Testing $DESC configuration"
 test_nginx_config
 log_end_msg $?
 ;;
 status)
 status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
 ;;
 upgrade)
 log_daemon_msg "Upgrading binary" "$NAME"
 do_upgrade
 log_end_msg 0
 ;;
 rotate)
 log_daemon_msg "Re-opening $DESC log files" "$NAME"
 do_rotate
 log_end_msg $?
 ;;
 *)
 echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2
 exit 3
 ;;
 esac

4) Enable the nginx service using systemctl:

systemctl enable nginx.service

5) Start the nginx service just execute the command nginx

nginx

Henceforth, the service can be stopped, started, restarted and reloaded using the nginx init script like:

/etc/init.d/nginx stop
/etc/init.d.nginx start
/etc/init.d/nginx restart
/etc/init.d/nginx reload

 

Leave a Reply

Your email address will not be published. Required fields are marked *