box.matto.nl

home/

Installing a light weight webserver with PHP on Debian Squeeze

Last edited
PHP does not allways have to run with Apache. There are several lightweight httpd daemons that can support PHP.

Multiple light-weight httpd server

In search for a lightweight solution to run some php pages on my Debian diskless shellserver it appears there are several lightweight httpd daemons in Debian that can do php.

I created some virtual machines on KVM to do some testing. Here follows a short howto to get the different httpd servers running :)

Howto install lightweigt httpd daemons with PHP support

Debian comes with several httpd daemons. On this page we look at the following httpd servers:

  • Lighthttpd
  • Cherokee
  • Nginx

Nginx requires the most work.

Lighthttpd with PHP

  • apt-get install mysql-server mysql-client
  • apt-get install lighttpd
  • comment this line out in /etc/lighttpd/lighttpd.conf include_shell "/usr/share/lighttpd/use-ipv6.pl"
  • check that lighthttpd is running.
    Point your browser to http://<ip-number>

screenshot of lighttpd
Screenshot of lighttpd just after installing

  • apt-get install php5-cgi
  • ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/
  • /etc/init.d/lighttpd restart

PHP ready to use

Your server should be ready to use PHP now. To test it, create a file info.php in /var/www. The contents of the file should be something like this:

<?
    phpinfo();
?>

screenshot of lighttpd running php info
Screenshot of lighttpd running phpinfo

Cherokee with PHP

  • apt-get install mysql-server mysql-client
  • apt-get install cherokee
  • apt-get install php5-cgi
  • test that cherokee runs, point your browser to http://<ip-number>

screenshot of cherokee
Screenshot of cherokee just after installing

  • Run cherokee-admin -b
    The -b option makes it possible to reach cherokee-admin from other machines than localhost.

screenshot of cherokee admin
Screenshot of cherokee admin

  • Click on Virtual servers
  • Click on "default"
  • Click on "Wizzards"
  • Click on "Languages"
  • Click on "Run Wizzard" next to the PHP logo
    (See screenshot below)

screenshot of cherokee admin ready to invoke php wizzard
Screenshot of cherokee admin ready to invoke the PHP-wizzard

PHP ready to use

Your server should be ready to use PHP now. To test it, create a file info.php in /var/www. The contents of the file should be something like this:

<?
    phpinfo();
?>

screenshot of cherokee running php info
Screenshot of cherokee running phpinfo

nginx with php

  • apt-get install mysql-server mysql-client
  • apt-get install nginx
  • apt-get install php5-cgi
  • test that nginx runs, point your browser to http://<ip-number>

screenshot of nginx
Screenshot of nginx just after installing

As can be seen from this screenshot, the nginx package does not come with a startpage. In fact, the directory which is configured as documentroot for the default site does not exists. So we have to make that first.

  • mkdir -p /var/www/nginx-default

Let php-fastcgi start

Create /etc/default/php-fastcgi

#
# Settings for php-cgi in external FASTCGI Mode
#

# Should php-fastcgi run automatically on startup? (default: no)

START=yes

# Which user runs PHP? (default: www-data)

EXEC_AS_USER=www-data

# Host and TCP port for FASTCGI-Listener (default: localhost:9000)

FCGI_HOST=127.0.0.1
FCGI_PORT=9000

# Environment variables, which are processed by PHP

PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=1000

Create /etc/init.d/php-fastcgi

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

# Author: Kurt Zankl 

# Do NOT "set -e"

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="php-cgi in external FASTCGI mode"
NAME=php-fastcgi
DAEMON=/usr/bin/php-cgi
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

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

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

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

# If the daemon is not enabled, give the user a warning and then exit,
# unless we are stopping the daemon
if [ "$START" != "yes" -a "$1" != "stop" ]; then
        log_warning_msg "To enable $NAME, edit /etc/default/$NAME and set START=yes"
        exit 0
fi

# Process configuration
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS
DAEMON_ARGS="-q -b $FCGI_HOST:$FCGI_PORT"


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 $PIDFILE --exec $DAEMON --test > /dev/null || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile --chuid $EXEC_AS_USER --startas $DAEMON -- $DAEMON_ARGS || return 2
}

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=TERM/30/KILL/5 --pidfile $PIDFILE > /dev/null # --name $DAEMON
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        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" "$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|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        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

Make symlink to /etc/rc2.d

cd /etc/rc2.d
ln -s ../init.d/php-fastcgi S02php-fastcgi

Edit /etc/php5/cgi/php.ini
and add this line:

cgi.fix_pathinfo=1

Start and test the servers

/etc/init.d/php-fastcgi start
/etc/init.d/nginx restart

Your server should be ready to use PHP now. To test it, create a file info.php in /var/www/nginx-default. The contents of the file should be something like this:

<?
    phpinfo();
?>

screenshot of nginx running php info
Screenshot of nginx running phpinfo

Which lightweight httpd daemon to choose?

Open source software is all about freedom. And all about free choice. Many times there are multiple choices to provide the same solution. Here this too is the case. So we are challenged to make our choice.

Filesize

  • Lighthttpd
    /usr/sbin/lighttpd is 172k
  • Cherokee
    /usr/sbin/cherokee-worker is 10k
    /usr/sbin/cherokee is 13k
    This totals to about 23k
  • Nginx
    /usr/sbin/nginx is 565k
Based on filesize, cherokee is the smallest of the three.

There are many more facts to consider when picking your choice. I wanted a solution to have some PHP files for personal use. So facts like performance, being able to serve a zillion pages etc. are not important to me. I wanted the lightest solution. Pure based on filesize, cherokee has become my choice.

Resources

Tools

With netstat -ntulp it is easy to check that the webserver is willing to connect.

Screenshots

The screenshots on this page are made of the vimprobable webbrowser running on an Acer Aspire One running Debian testing