This page: Home » » Run PHP with a light weight webserver
Installing a light-weight httpd with php on Debian Squeeze
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 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 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 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
- 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 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 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 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 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
Last updated: $Date: 2010-02-14 13:48:24 $
| Walk through this site | |
| ← previous page | next page → |
![[tux]](/i/tuxsm.png)






