Project

General

Profile

I hope somebody might also find this useful as a init script for several fcgi php daemons with individual user permissions as described here


#! /bin/sh
### BEGIN INIT INFO
# Provides:          FastCGI servers for PHP
# Required-Start:    networking
# Required-Stop:     networking
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: Start PHP FastCGI servers.
# Description:       PHP can be started with lighttpd's spawn-fcgi binary to
#                    get individual user permisions. This must be done
#                    for each normal user which wants to have PHP support.
### END INIT INFO
#
# Author:  Jannis Leidel
#          <jannis AT leidel.info>.
#
# Version: @(#)php-fcgi 0.1 12-May-2007 jannis AT leidel.info
#

# List of user which need own PHP-Fcgi processes
# e.g. FCGI_USER_LIST="user1 user2 user3" 
FCGI_USER_LIST="" 

# Set the socket and pid directory and make sure it exists 
RUNFILES_PATH=/var/run/php-fcgi
mkdir -p $RUNFILES_PATH

FCGI_PROGRAM="/usr/bin/php-cgi" 
FCGI_WEB_SERVER_ADDRS="127.0.0.1" 
PHP_FCGI_CHILDREN=2
PHP_FCGI_MAX_REQUESTS=1000

ALLOWED_ENV="PATH USER" 
#### DO NOT CHANGE ANYTHING AFTER THIS LINE!

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="PHP FastCGI servers" 

# Function that starts all php daemons.
d_start()
{
    export PHP_FCGI_MAX_REQUESTS
    export FCGI_WEB_SERVER_ADDRS
    ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS" 
    E=
    for i in $ALLOWED_ENV; do
        E="$E $i=${!i}" 
    done

    for FCGI_USER in $FCGI_USER_LIST
    do
        echo -n " $FCGI_USER" 
        if [ -f $RUNFILES_PATH/$FCGI_USER.pid ]; then
            echo -n " already running" 
        else
            start-stop-daemon --start --quiet --pidfile $RUNFILES_PATH/$FCGI_USER.pid \
                --chuid $FCGI_USER --exec /usr/bin/env -- spawn-fcgi \
                -s $RUNFILES_PATH/$FCGI_USER.sock -f $FCGI_PROGRAM \
                -u $FCGI_USER -g $FCGI_USER -C $PHP_FCGI_CHILDREN \
                -P $RUNFILES_PATH/$FCGI_USER.pid 2>/dev/null

            chmod 400 $RUNFILES_PATH/$FCGI_USER.pid
            chmod 777 $RUNFILES_PATH/$FCGI_USER.sock
        fi
    done
}

# Function that stops all php daemons.
d_stop() {
    for FCGI_USER in $FCGI_USER_LIST
    do
        echo -n " $FCGI_USER" 
        start-stop-daemon --stop --quiet --pidfile $RUNFILES_PATH/$FCGI_USER.pid \
                          || echo -n " not running" 
        if [ -f $RUNFILES_PATH/$FCGI_USER.pid ]; then
           rm $RUNFILES_PATH/$FCGI_USER.pid
        fi
    done
}

ACTION="$1" 
case "$ACTION" in
    start)
        echo -n "Starting $DESC: " 
        d_start
        echo "." 
        ;;

    stop)
        echo -n "Stopping $DESC: " 
        d_stop
        echo "." 
        ;;

    restart|force-reload)
        echo -n "Restarting $DESC: " 
        d_stop
        sleep 2
        d_start
        echo "." 
        ;;

    *)
        echo "Usage: $NAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

exit 0