This is guide howto install nginx, PHP 5.3 and FastCGI webserver with MySQL and/or PostgreSQL and Memcache support on Fedora 12 and Fedora 13, CentOS 5.5, Red Hat (RHEL) 5.5/6.

nginx (engine x) is a robust, small and high performance http server, reverse proxy server and also mail proxy server.

1. Add and enable needed repositories:

Updated 19.3.2010

Use following repositories to install nginx 0.8.xx version (currently 0.8.36 version)

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

rpm -Uvh http://yum.chrislea.com/centos/5/i386/chl-release-5-3.noarch.rpm

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CHL

Just Epel repository is now obsolete, since there can be found only nginx 0.6.xx branch (currenlty version 0.6.39) Check this comment for more info.

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm

2. Install following packages:

  • nginx
  • php
  • php-mysql
  • php-pgsql
  • php-pecl-memcache
  • fcgi
  • spawn-fcgi

with following command:

yum --enablerepo=remi install nginx php php-mysql php-pgsql php-pecl-memcache fcgi spawn-fcgi

...

Dependencies Resolved

=================================================================================================
 Package                     Arch           Version                         Repository      Size
=================================================================================================
Installing:
 fcgi                        i386           2.4.0-4.el5                     epel            43 k
 nginx                       i386           0.6.39-2.el5                    epel           318 k
 php                         i386           5.3.1-1.el5.remi                remi           1.3 M
 php-mysql                   i386           5.3.1-1.el5.remi                remi           140 k
 php-pecl-memcache           i386           3.0.4-2.el5.remi.1              remi            64 k
 php-pgsql                   i386           5.3.1-1.el5.remi                remi           119 k
 spawn-fcgi                  i386           1.4.22-2.el5                    epel            17 k

Transaction Summary
=================================================================================================
Install      7 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)

3. Add Fast-CGI init script:

Save following script to /etc/init.d/phpfcgi file.

#!/bin/bash
#
# Startup script for the PHP FastCGI server.
#
# chkconfig: 345 85 15
# description: PHP is an HTML-embedded scripting language
# processname: php
# config: /etc/php.ini
 
# Source function library.
. /etc/rc.d/init.d/functions

SPAWNFCGI="/usr/bin/spawn-fcgi" 
PHPFCGI="/usr/bin/php-cgi"
FCGIPORT="9000"
FCGIADDR="127.0.0.1"
PHP_FCGI_CHILDREN=5
PHP_FCGI_MAX_REQUESTS=1000
ALLOWED_ENV="PATH USER"
USER=nginx
GROUP=nginx
#PHPUSER=php
PIDFILE=/var/run/phpfcgi.pid
 
if [ -z "$PHP_FCGI_CHILDREN" ]; then
  PHP_FCGI_CHILDREN=5
fi
 
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"
 
case "$1" in
  start)
        PHPFCGI_START=$"Starting ${NAME} service: "
        echo -n $PHPFCGI_START
 
        # check for $PHPUSER, create if non-existent
        if [ -z "`id -u $PHPUSER 2> /dev/null`" ]; then
            useradd -s /sbin/nologin $PHPUSER
        fi
 
        # clean environment
        E=
        for i in $ALLOWED_ENV; do E="$E $i=${!i}"; done
        #daemon --user $PHPUSER --pidfile $PIDFILE "env - $E $PHPFCGI -q -b $FCGIADDR:$FCGIPORT &> /dev/null &"
	daemon $SPAWNFCGI -a ${FCGIADDR} -p ${FCGIPORT} -u ${USER} -g ${GROUP} -P ${PIDFILE} -C ${PHP_FCGI_CHILDREN} -f ${PHPFCGI}
    retval=$?
 
        #pid=`pidof php-cgi`
        #if [ -n "$pid" ]; then
        #    echo $pid > $PIDFILE
        #    success $PHPFCGI_START
        #else
        #    failure $PHPFCGI_START
        #fi
        #echo
        ;;
  stop)
        echo -n "Stopping php-fcgi: "
        killproc -p $PIDFILE phpfcgi
        echo
        ;;
  status)
        status phpfcgi
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 1
esac
 
exit 0

Originally from here: http://wiki.nginx.org/RedHatPHPFCGIInitScript, but modified little bit, because original script not worked.

Now normal start, stop, status, restart should work:

/etc/init.d/phpfgci start
/etc/init.d/phpfgci stop
/etc/init.d/phpfgci status
/etc/init.d/phpfgci restart

4. Configure nginx:

Modify /etc/nginx/nginx.conf file following rows:

worker_processes  2;

keepalive_timeout  25;

gzip  on;

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
	root           /usr/share/nginx/html;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
	include        fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
	deny  all;
}

5. Start FastCGI and nginx services:

/etc/init.d/phpfcgi start
/etc/init.d/nginx start

6. Create PHP file and print phpinfo:

echo "<?php echo phpinfo(); ?>" > /usr/share/nginx/html/info.php

7. Test info.php file:

Go to http://127.0.0.1/info.php and check that everything is working.