3

I'm using the init.d script from this: http://wiki.nginx.org/RedHatNginxInitScript but this script sucks on my CentOS 5.5 nginx 1.0.6 (which installed by passenger). It sucks for 2 reasons:

  1. When I run service nginx start, it start nginx but then do not quit it self.

  2. It run in some different runtime path ($PATH) so that rails won't be able to find executables located inside /usr/local/bin (like node.js)

Is there any init.d script that works for you guys (on CentOS or other Redhat based distribution) that does not have these problems?

Phương Nguyễn
  • 8,747
  • 15
  • 62
  • 96

1 Answers1

6

The one here: http://articles.slicehost.com/2009/2/2/centos-adding-an-nginx-init-script has worked for me in the past.

You will need to change the paths to "/etc/nginx" instead of "/usr/local/nginx" for instance.

Actually both are similar except that your old one has an additional "MakeDirs" function. Not sure why this may this be needed.

My current one is below:

#!/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)

sysconfig="/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/nginx"
pidfile="/var/run/${prog}.pid"

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

[ -f $sysconfig ] && . $sysconfig


start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    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 -p $pidfile $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest_q || return 6
    stop
    start
}

reload() {
    configtest_q || return 6
    echo -n $"Reloading $prog: "
    killproc -p $pidfile $prog -HUP
    echo
}

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

configtest_q() {
    $nginx -t -q -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

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

# Upgrade the binary with no downtime.
upgrade() {
    local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || return 6
    echo -n $"Upgrading $prog: "
    killproc -p $pidfile $prog -USR2
    retval=$?
    sleep 1
    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        killproc -p $oldbin_pidfile $prog -QUIT
        success $"$prog online upgrade"
        echo 
        return 0
    else
        failure $"$prog online upgrade"
        echo
        return 1
    fi
}

# Tell nginx to reopen logs
reopen_logs() {
    configtest_q || return 6
    echo -n $"Reopening $prog logs: "
    killproc -p $pidfile $prog -USR1
    retval=$?
    echo
    return $retval
}

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

This is what is distributed with the Nginx RPM from EPEL.

Dayo
  • 12,413
  • 5
  • 52
  • 67
  • That init.d script solves #1. I'm also replacing `killproc` with `nginx -s stop` (I guess this init.d is for 0.x and `-s stop` is introduced in 1.0). Still, I'm in need of a way to have nginx run with different PATH – Phương Nguyễn Nov 05 '11 at 23:56
  • You are correct. I have been using that init file since when 0.7 was the stable version. I have updated the answer with the current distributed init code. Adds "reopen_logs" but still uses killproc. – Dayo Nov 06 '11 at 08:54
  • Do you have any idea on making the web server (in my case: passenger) pick up the properly PATH (the PATH that include /opt/local/bin and all other directory as a normal shell admin)? – Phương Nguyễn Nov 07 '11 at 14:00
  • Sorry, I can't tell about that. I'll have thought hooking into the PATH environment would be something done without needing any special intervention. Perhaps you might want to consider looking at your rails config. – Dayo Nov 08 '11 at 11:20