20081106 - How to enable Nginx to serve PHP code/pages in UBUNTU

Mark Alan varia at e-healthexpert.org
Thu Nov 6 15:45:26 MSK 2008


  The php5-cgi (until 5.2.4) package does not include a script to
automatically start it in external FASTCGI Mode (Daemon mode).

  As there is some confusion on the Internet on how to properly set PHP
script execution in the Nginx Web server, I am attaching the script that
we reliably use at our UBUNTU Linux <http://ubuntu.com/> servers.

We use Upstart, the Ubuntu's native event-based replacement for the
sysvinit daemon.

Note:
# 20081106: To use Unix domain sockets substitute, in the exec line:
# from: exec /usr/bin/sudo -u www-data PHP_FCGI_CHILDREN=5 
PHP_FCGI_MAX_REQUESTS=125 /usr/bin/php-cgi -q -b 127.0.0.1:9000
#     to: exec /usr/bin/sudo -u www-data PHP_FCGI_CHILDREN=5 
PHP_FCGI_MAX_REQUESTS=125 /tmp/php-fastcgi.socket
# Take care to also change the relevant line(s) in nginx config file(s):
#  from: fastcgi_pass 127.0.0.1:9000;
#      to: fastcgi_pass unix:/tmp/php-fastcgi.socket;

This how we set it up:

sudo tee /etc/event.d/php-fastcgi <<-\EOA
# /etc/event.d/php-fastcgi
# php-fastcgi - starts php-cgi as an external FASTCGI process
start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
exec /usr/bin/sudo -u www-data PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=125 /usr/bin/php-cgi -q -b 127.0.0.1:9000
respawn
EOA

sudo chmod u+x /etc/event.d/php-fastcgi
sudo initctl start php-fastcgi # start php-fastcgi
sudo /etc/init.d/nginx restart

sudo initctl status php-fastcgi # check if upstart is supervising
ps aux | grep cgi # check the php-cgi running processes

sudo initctl stop php-fastcgi # stop php-fastcgi and all its childs.


Regards,

M.




  This is how we install it in Ubuntu/Debian(sudo enabled):
   sudo nano /etc/init.d/php-fastcgi # copy and paste the text between
the "--- cut here ---" to this file and save it (<CTRL>+x, Y, <ENTER>).
   sudo chmod u+x /etc/init.d/php-fastcgi
   sudo chown 0.0 /etc/init.d/php-fastcgi
   sudo update-rc.d php-fastcgi defaults 21 23


  I hope it may also help you at your setups.

M.



--- cut here ---
#! /bin/sh
#
### BEGIN INIT INFO
# Provides:	  php-fastcgi
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop php-cgi in external FASTCGI mode
# Description:       Start and stop php-cgi in external FASTCGI mode
### END INIT INFO
#
# Do NOT "set -e"
# Default values are enclosed in []

PATH=/usr/sbin:/usr/bin:/sbin:/bin

# Start php-fastcgi? [no]
START=yes

# Read configuration data
NAME=php-fastcgi
DESC="php-cgi runing in external FASTCGI mode"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Daemon pathname and args: IP=[127.0.0.1], port=[9000]
# /usr/bin/php-cgi links to -> /etc/alternatives/php-cgi ->
/usr/bin/php5-cgi
DAEMON=/usr/bin/php-cgi
DAEMON_ARGS="-q -b 127.0.0.1:9000"

  # Which user runs PHP? [www-data]
EXEC_AS_USER=www-data

# php-cgi env. variables: spawned children [5] , concurrent requests [1000]
PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=125
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS

# Exit if php-cgi is not installed
[ -x "$DAEMON" ] || exit 0

# Load rcS variable settings and set (re)start/stop verbosity
[ -f /etc/default/rcS ] && . /etc/default/rcS
VERBOSE=yes

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# If $START not 'yes' AND we are not stopping the $DAEMON
if [ "$START" != "yes" -a "$1" != "stop" ]; then
	log_warning_msg "To enable $NAME, edit /etc/init.d/$NAME and set
START=yes"
	exit 0
fi

do_start()
{
	# Return values: 0=started ok,1=already running,2=unable to start
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON \
		--test > /dev/null || return 1
	start-stop-daemon --start --quiet --background \
		--chuid $EXEC_AS_USER --pidfile $PIDFILE --make-pidfile \
		--exec $DAEMON -- $DAEMON_ARGS \
		|| return 2
}

do_stop()
{
	# Return values: 0=stopped ok,1=already stopped,2=unable to stop,
	#   other if a failure occurred
		start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
			--pidfile $PIDFILE > /dev/null # --name $DAEMON
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too.
	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 \
		--exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE
	return "$RETVAL"
}

case "$1" in
   start)
	[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC"
	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"
	do_stop
	case "$?" in
		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
	esac
	;;
   restart|force-reload)
	log_daemon_msg "Restarting $DESC"
	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
	;;
   *)
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
	exit 3
	;;
esac
#
--- cut here ---










More information about the nginx mailing list