Nginx-init-ubuntu

= Ubuntu Nginx Init Script Nginx-init-ubuntu =

Updates:

 * Version 2.0.0-RC2 is up.
 * Google Code Project - Check here for updates.

Installation:

 * 1. Save this file as [ /etc/init.d/nginx].  The script is bundled in the tar as 'nginx', however I like to personally re-name it as 'nginx-init' on my system.  The choice is yours.
 * 2. Run: /usr/sbin/update-rc.d -f nginx defaults

Notes:

 * Version: v2.0.0-RC2
 * Tested to work on Ubuntu Desktop & Server versions 8.04 - 9.10. It may very well work with versions < 8.04.
 * Script is primarily compatible for the Debian Almquist shell (dash).

Source:

 * 1) ! /bin/sh
 * 2) BEGIN INIT INFO
 * 3) Provides:          nginx
 * 4) Required-Start:    $remote_fs $syslog
 * 5) Required-Stop:     $remote_fs $syslog
 * 6) Default-Start:     2 3 4 5
 * 7) Default-Stop:      0 1 6
 * 8) Short-Description: nginx init.d dash script for Ubuntu <=9.10.
 * 9) Description:       nginx init.d dash script for Ubuntu <=9.10.
 * 10) END INIT INFO
 * 11) nginx - this Debian Almquist shell (dash) script, starts and stops the nginx
 * 12)         daemon for ubuntu 9.10 and lesser version numbered releases.
 * 13) description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
 * 14)               proxy and IMAP/POP3 proxy server.  This \
 * 15) 		script will manage the initiation of the \
 * 16) 		server and it's process state.
 * 17) processname: nginx
 * 18) config:      /usr/local/nginx/conf/nginx.conf
 * 19) pidfile:     /acronymlabs/server/nginx.pid
 * 20) Provides:    nginx
 * 21) Author:  Jason Giedymin
 * 22)          .
 * 23) Version: 2.0 02-NOV-2009 jason.giedymin AT gmail.com
 * 24) Notes: nginx init.d dash script for Ubuntu <=9.10.
 * 25) This script's project home is:
 * 26) 	http://code.google.com/p/nginx-init-ubuntu/
 * 27)                               MIT X11 License
 * 28) Copyright (c) 2009 Jason Giedymin, http://Amuxbit.com formerly
 * 29) 				    http://AcronymLabs.com
 * 30) Permission is hereby granted, free of charge, to any person obtaining
 * 31) a copy of this software and associated documentation files (the
 * 32) "Software"), to deal in the Software without restriction, including
 * 33) without limitation the rights to use, copy, modify, merge, publish,
 * 34) distribute, sublicense, and/or sell copies of the Software, and to
 * 35) permit persons to whom the Software is furnished to do so, subject to
 * 36) the following conditions:
 * 37) The above copyright notice and this permission notice shall be
 * 38) included in all copies or substantial portions of the Software.
 * 39) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * 40) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * 41) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * 42) NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * 43) LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * 44) OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * 45) WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 1) permit persons to whom the Software is furnished to do so, subject to
 * 2) the following conditions:
 * 3) The above copyright notice and this permission notice shall be
 * 4) included in all copies or substantial portions of the Software.
 * 5) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * 6) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * 7) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * 8) NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * 9) LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * 10) OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * 11) WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 1) OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * 2) WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

. /lib/lsb/init-functions
 * 1)                               Functions
 * 1)                               Functions

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/sbin/nginx
 * 1)                               Consts
 * 1)                               Consts

PS="nginx" PIDNAME="nginx"				#lets you do $PS-slave PIDFILE=$PIDNAME.pid                   #pid file PIDSPATH=/var/run

DESCRIPTION="Nginx Server..."

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="/usr/local/nginx/conf/nginx.conf"


 * 1)                               Simple Tests
 * 1)                               Simple Tests

test -x $DAEMON || exit 0
 * 1) test if nginx is a file and executable

if [ -f /etc/default/nginx ] ; then . /etc/default/nginx fi
 * 1) Include nginx defaults if available


 * 1) set exit condition
 * 2) set -e


 * 1)                               Functions
 * 1)                               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 }

wait_for_pid { try=0
 * 1) courtesy of php-fpm

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