Konfiguracja środowiska deweloperskiego PHP z nginx w Ubuntu 10.04

Ten wpis został napisany dawno temu i może być już nieaktualny.

Nginx LogoNginx to lekki serwer http i proxy. Potrafi także działać jako load balancer. Stanowi poważną alternatywę dla przeładowanego apache. W środowisku prodykcyjnym nginx zaskakuje wydajnością oraz małym zużyciem pamięci. W warunkach deweloperskich cenię jego prostą i elastyczną konfigurację. Oto opis jak szybko przygotować środowisko deweloperskie PHP z nginx w Ubuntu 10.04 (Lucid Lynx). Uwaga: Uaktualniona wersja tego artukułu znajduje się tutaj: "Konfiguracja środowiska deweloperskiego PHP z nginx w Ubuntu 11.04".

PHP

Instalujemy pakiety i moduły PHP:

sudo aptitude install php5-cgi php5-cli php5-common php5-curl php5-gd \
  php5-imagick php5-json php5-mcrypt php5-mysql php5-pgsql php5-sqlite \
  php5-xmlrpc php5-xsl php5-xdebug php-apc

Spawn FCGI

Instalujemy skrypt spawn-fcgi:

sudo aptitude install spawn-fcgi

Zapisujemy skrypt startujący instancje php-cgi jako /etc/init.d/php-cgi:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          php-cgi
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: spawns the php-cgi
# Description:       spawns the php-cgi
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=php-cgi
DESC=php-cgi

test -x $DAEMON || exit 0

PIDFILE="/var/run/$NAME.pid"
DAEMON="/usr/bin/php-cgi"
SPAWN_FCGI="/usr/bin/spawn-fcgi"
FCGI_PORT=9000
FCGI_USER="www-data"
FCGI_GROUP="www-data"
FCGI_CHILDREN=0

# Include php-cgi defaults if available
if [ -f /etc/default/php-cgi ] ; then
        . /etc/default/php-cgi
fi

SPAWN_FCGI_OPTS="-f $DAEMON -a 127.0.0.1 -p $FCGI_PORT -u $FCGI_USER -g $FCGI_GROUP -C $FCGI_CHILDREN -P $PIDFILE"

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec "$SPAWN_FCGI" -- $SPAWN_FCGI_OPTS || true
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec "$DAEMON" || true
        echo "$NAME."
        ;;
  restart)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec "$DAEMON" || true
        sleep 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec "$SPAWN_FCGI" -- $SPAWN_FCGI_OPTS || true
        echo "$NAME."
        ;;
  status)
        status_of_proc -p $PIDFILE "$DAEMON" php-cgi && exit 0 || exit $?
        ;;
  *)
        echo "Usage: $NAME {start|stop|restart|status}" >&2
        exit 1
        ;;
esac

exit 0

Nadajemy mu prawa do uruchamiania:

sudo chmod +x /etc/init.d/php-cgi

Umieszczamy konfigurację/etc/default/php-cgi:

PIDFILE="/var/run/php-cgi.pid"
DAEMON="/usr/bin/php-cgi"
SPAWN_FCGI="/usr/bin/spawn-fcgi"
FCGI_PORT=9000
FCGI_USER="www-data"
FCGI_GROUP="www-data"
FCGI_CHILDREN=0

Uwaga: Moje najbardziej aktualne skrypty startowe dostępne są na githubie: http://github.com/jakzal/php-cgi.

Nginx

Instalujemy nginx:

sudo aptitude install nginx

Zapisujemy konfigurację domen *.dev do pliku /etc/nginx/sites-available/dev.conf:

server {
  listen 80;
  server_name *.dev;
  root /var/www/$host/web;

  access_log /var/log/nginx/$host.access.log;
  error_log /var/log/nginx/error.log error;

  location / {
    root   /var/www/$host/web/;
    index  index.php;

    # serve static files directly
    if (-f $request_filename) {
      access_log        off;
      expires           30d;
      break;
    }

    rewrite ^(.*) /index.php last;
  }

  location ~ \.php {
    fastcgi_index  index.php;

    set  $script     $uri;
    set  $path_info  "";
    if ($uri ~ "^(.+\.php)(/.*)") {
      set  $script     $1;
      set  $path_info  $2;
    }
    fastcgi_pass   127.0.0.1:9000;
    include /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  /var/www/$host/web$script;
    fastcgi_param  PATH_INFO        $path_info;
    fastcgi_param  SCRIPT_NAME $script;
  }

  location ~ /\.ht {
    deny  all;
  }
}

Czynimy konfigurację widoczną dla nginx:

sudo ln -s /etc/nginx/sites-available/dev.conf /etc/nginx/sites-enabled/dev.conf

Konfiguracja systemu

Dodajemy siebie do grupy www-data i logujemy ponownie:

sudo usermod -a -G www-data kuba
sudo su kuba

Pozwalamy, aby wszyscy należący do grupy www-data mogli tworzyć strony:

sudo chown -R www-data:www-data /var/www
sudo chmod -R 775 /var/www

Definiujemy fikcyjne poddomeny *.dev w _/etc/hosts _(dużo wygodniej jest użyć dnsmasq, ale na początek plik hosts powinien być wystarczający):

127.0.0.1 localhost info.dev myproject.dev

Tworzymy stronę testową:

mkdir /var/www/info.dev/web -p
echo "<?php echo phpinfo(); ?>" > /var/www/info.dev/web/index.php
chown -R :www-data /var/www/info.dev
chmod -R 775 /var/www/info.dev

Uruchamiamy php-cgi i nginx:

sudo service php-cgi start
sudo service nginx start

W końcu odwiedzamy http://info.dev w przeglądarce internetowej i cieszymy się widokiem skonfigurowanego PHP z nginx.

Jakub Zalas

Jakub Zalas

Architekt, Programista, Trener