You are here: Home Howtos & Tutorials Debian Nginx + PHP5 unter Debian GNU/Linux 6.0 "Squeeze" Howto ✓

Nginx + PHP5 unter Debian GNU/Linux 6.0 "Squeeze" Howto ✓

Einleitung

Während Apache 2 noch vor einigen Jahren eine extrem hohe Verbreitung als Webserver und mehr oder weniger Konkurrenzlosigkeit erfahren hat, haben sich immer mehr Projekte der Aufgabe angenommen, performante und leichtgewichtige Webserver zu implementieren.

Insbesondere bei der Wahl eines Frontendservers für eine dynamische Webapplikation (CMS, typische Web 2.0 Webanwendungen etc.) spielt die Performance des Webservers eine wesentliche Rolle. Die Internetnutzer sind oft nicht die geduldigsten und so kann allein durch eine erhöhte Latenz u.U. eine breite Interessentengruppe verloren gehen.

Neben dem Platzhirsch Apache 2 werben insbesondere die beiden Implementierungen Lighttpd und Nginx um die Gunst der Nutzer. Während ich die Installation von Lighttpd bereits in einem anderen Tutorial erörtert habe, möchte ich in diesem Howto die Installation und Konfiguration des Webservers Nginx erläutern.

Da Nginx u.a. als Frontend für viele PHP5-Projekte verwendet wird, möchte ich mich in diesem Tutorial neben der Installation des Webservers Nginx zudem der Einbindung von PHP5 widmen. Zudem erläutere ich an der entsprechenden Stelle die Anbindung an eine PostgreSQL bzw. MySQL Datenbank, da diese sehr oft als Backend in PHP-Projekten verwendet werden. Alle drei Komponenten bilden als Ganzes eine solide Infrastruktur zum Hosting von statischen und dynamischen Webinhalten. In dem vorliegenden Howto verwende ich Nginx in der zur Zeit aktuellen Version 1.0.8 (Stand: November 2011) auf einem Debian GNU/Linux 6.0 “Squeeze” System.

Installation von benötigter Software

Da wir die aktuellste Version von Nginx installieren wollen, werden ich im Folgenden die Sourcen des Webservers kompilieren (das Debian Repository enthält lediglich die veraltete Version 0.7.67). Dazu benötigen wir zunächst eine entsprechende Entwicklungsumgebung, die alle benötigten Werkzeuge, wie die Compiler-Suite GCC und die verwendeten Bibliotheken enthält. Diese installieren wir mittels:

# aptitude install build-essential libpcre3-dev libssl-dev libbz2-dev

Vorbereitungen

Zunächst einmal erstellen wir den Systembenutzer und die gleichnamige Gruppe nginx:

# groupadd nginx
# useradd -g nginx nginx

Installation von Nginx

Nachdem wir eine entsprechende Build-Umgebung installiert haben, laden wir das Quellcode-Archiv des Projekts herunter und entpacken es. Dabei verwenden wir die aktuelle Version 1.0.2 (Stand: Mai 2011):

# wget http://nginx.org/download/nginx-1.0.8.tar.gz -P /usr/local/src
# cd /usr/local/src
# tar xzvf nginx-1.0.8.tar.gz
# rm nginx-1.0.8.tar.gz

Anmerkung: da die Entwicklung des HTTP-Servers Nginx sehr schnell voranschreitet, empfiehlt es sich stets, die zum Zeitpunkt der Installation aktuelle Version zu verwenden!

Nun kompilieren wir Nginx mittels:

# cd nginx-1.0.8
# ./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx \
--with-debug --with-http_ssl_module --with-http_dav_module --with-http_stub_status_module --http-client-body-temp-path=/var/lib/nginx/body/ \
--http-proxy-temp-path=/var/lib/nginx/proxy/ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi/ --http-uwsgi-temp-path=/var/lib/nginx/uwsgi/ \
--http-scgi-temp-path=/var/lib/nginx/scgi/ --with-http_flv_module --with-http_gzip_static_module

Anmerkung: ich bevorzuge an dieser Stelle die einheitliche Integration von Nginx in das Debian Dateisystem-Schema, statt auf lokale Verzeichnisse, wie /usr/local oder /opt auszuweichen. Dem Leser bleibt die Wahl überlassen, diesem Schema zu folgen.

Das System bestätigt den obigen Aufruf des Configure-Skripts mittels:

Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + md5: using OpenSSL library
  + sha1: using OpenSSL library
  + using system zlib library

  nginx path prefix: "/var/www"
  nginx binary file: "/usr/sbin/nginx"
  nginx configuration prefix: "/etc/nginx"
  nginx configuration file: "/etc/nginx/nginx.conf"
  nginx pid file: "/var/run/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "/var/lib/nginx/body/"
  nginx http proxy temporary files: "/var/lib/nginx/proxy/"
  nginx http fastcgi temporary files: "/var/lib/nginx/fastcgi/"
  nginx http uwsgi temporary files: "/var/lib/nginx/uwsgi/"
  nginx http scgi temporary files: "/var/lib/nginx/scgi/"

Anschließend installieren wir Nginx:

# make && make install

Nacharbeiten

Aus Sicherheitsgründen sollte ein Webserver stets unter einer eigenen UID/GID betrieben werden und dessen Prozesse auf keinen Fall Root-Rechte besitzen! Daher haben wir bei der obigen Installation die beiden Konfigurations-Switches --user und --group dementsprechend auf die eindeutige UID/GID nginx gesetzt. Nun setzen wir die Benutzer- und die Gruppenzugehörigkeit des DocumentRoot- und des Logverzeichnisses von Nginx fest:

# chown -R nginx.nginx /var/www /var/log/nginx

Zuletzt erstellen wir ein lokales Arbeitsverzeichnis, das von Nginx benötigt wird:

# mkdir /var/lib/nginx
# chown -R nginx.nginx /var/lib/nginx

Konfiguration von Nginx

Der Webserver Nginx verwendet in unserem Fall die Konfigurationsdatei /etc/nginx/nginx.conf. Nginx kommt soweit vorkonfiguriert aus, dass wir wenig daran ändern müssen. Zum einen starten wir den Nginx Webserver als Benutzer nginx, indem wir diesen in der ersten Zeile der Konfigurationsdatei festlegen:

user nginx;

Durch die Konfigurationsoption --prefix (s.o.) haben wir zudem festgelegt, dass sich das DocumentRoot-Verzeichnis sich in /var/www befindet. Daher ersetzen wir das DocumentRoot-Verzeichnis (ca. Zeile 44):

root html

durch

root /var/www

Bei der Installation von Nginx wurde eine entsprechende Test-Index-Datei /var/www/html/index.html angelegt. Wir verschieben diese in das Verzeichnis /var/www und löschen das ursprüngliche Dokumentenverzeichnis:

# mv /var/www/html/index.html /var/www/
# rm -rf /var/www/html

Starten des Webservers Nginx

Nachdem wir den Webserver installiert haben, können wir diesen zunächst manuell starten mittels:

# /usr/sbin/nginx

Daraufhin sollten wir die obige HTML-Datei als Feedback unter http://127.0.0.1 erhalten.

Im Verlauf dieses Howtos werde ich ein Init-Skript vorstellen, mit dessen Hilfe der Nginx Webserver automatisch gestartet und gestoppt werden kann (s.u.).

Erweiterung der Nginx-Installation um PHP (optional)

In vielen Fällen wird Nginx als Frontend-Server für eine typische PHP5- und MySQL- bzw. PostgreSQL-Anwendung benötigt. Nginx bringt von sich aus jedoch keine entsprechenden Module für PHP-Anwendungen mit (ähnlich wie bei Lighttpd). Von daher werde ich nun einen Weg aufzeigen, wie PHP5 in Form von FastCGI in Nginx eingebunden werden kann.

Zunächst installieren wir die PHP5-Umgebung aus dem Debian-Repository mittels:

# aptitude install php5-cgi php5-cli

Anschließend löschen wir die Standard Index-Seite:

# rm /var/www/index.html

... und erstellen ein einfaches PHP-Skript unter /var/www/index.php, das den folgenden Einzeiler enthält:

<?php phpinfo(); ?>

Da wir PHP-Skripte in Form von FastCGI ausführen wollen, entkommentieren wir den entsprechenden Konfigurationsteil in der Datei /etc/nginx/nginx.conf (ca. Zeile 65) und passen diesen an. Wir leiten hierbei alle PHP-Skripte an einen FastCGI Server weiter:

location ~ \.php$ {
    root           /var/www;
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME /var/www$fastcgi_script_name;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
}

Damit der Webserver die Index-Datei index.php entsprechend interpretieren kann, ersetzen wir in der Hauptkobfigurationsdatei /etc/nginx/nginx.conf die Zeile 45:

index  index.html index.htm;

durch

index  index.html index.htm index.php;

Anschließend starten wir manuell den FastCGI-Daemon:

# /usr/bin/php5-cgi -q -b 127.0.0.1:9000

... und den Webserver Nginx in einem anderen Terminal mittels:

# killall nginx && /usr/sbin/nginx

Nun sollte das obige PHP-Skript beim Aufruf der URL http://localhost/index.php automatisch ausgeführt werden und wir einen entsprechenden Status über unsere PHP5-Umgebung erhalten.

Start und Stop via Init-Skript

Ist der Leser bis hierhin dem Howto gefolgt, kann dieser nun sowohl den Webserver Nginx als auch den FastCGI-Daemon lediglich manuell starten und stoppen. Im Produktivbetrieb benötigen wir entsprechende Init-Skripte, die diese Aufgaben kontrolliert übernehmen. Von daher werde ich im Folgenden jeweils ein solches Skript pro Dienst vorstellen.

Nginx

Zunächst erzeugen wir das Init-Skript /etc/init.d/nginx, mit dessen Hilfe wir den Webserver Nginx kontrollieren können:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# 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: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

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

set -e

case "$1" in
  start)
    echo -n "Starting $DESC: "
    start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
      --exec $DAEMON -- $DAEMON_OPTS || true
    echo "$NAME."
  ;;
  stop)
    echo -n "Stopping $DESC: "
    start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
      --exec $DAEMON || true
    echo "$NAME."
  ;;
  restart|force-reload)
    echo -n "Restarting $DESC: "
    start-stop-daemon --stop --quiet --pidfile \
      /var/run/$NAME.pid --exec $DAEMON || true
    sleep 1
    start-stop-daemon --start --quiet --pidfile \
      /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
    echo "$NAME."
  ;;
  reload)
    echo -n "Reloading $DESC configuration: "
    start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
      --exec $DAEMON || true
    echo "$NAME."
  ;;
  configtest)
    echo -n "Testing $DESC configuration: "
    if nginx -t > /dev/null 2>&1
      then
        echo "$NAME."
      else
        exit $?
    fi
  ;;
  *)
    echo "Usage: $NAME {start|stop|restart|reload|force-reload|configtest}" >&2
    exit 1
  ;;
esac

exit 0

Anschließend machen wir das neue Init-Skript ausführbar:

# chmod +x /etc/init.d/nginx

Damit der Webserver Nginx bei jedem Rechnerstart mitgestartet wird, fügen das obige Skript dem Default-Init-Level hinzu:

# update-rc.d nginx defaults

Anschließend stoppen wir eine eventuell noch laufende Nginx Instanz:

# killall nginx

Von nun an können wir das Init-Skript zum Starten und Stoppen von Nginx nutzen:

Start des Webservers:
# /etc/init.d/nginx start
Stop des Webservers:
# /etc/init.d/nginx stop

Fast-CGI

Damit der Webserver Nginx alle PHP-Anfragen entsprechend an den FastCGI-Daemon delegieren kann, muss auch dieser gestartet sein. In unserem Fall verwenden wir den eigenständigen FastCGI Daemon spawn-fcgi. Während dieser früher ein Teil des alternativen Webservers Lighttpd war, wird dieser nun als eigenständiges Projekt geführt. Daher laden wir zunächst den Quellcode von spawn-fcgi in der aktuellen Version 1.6.3 (Stand: Februar 2011) herunter, entpacken das Archiv und kompilieren und installieren spawn-fcgi mittels:

# wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz -P /usr/local/src
# cd /usr/local/src
# tar xzvf spawn-fcgi-1.6.3.tar.gz
# rm spawn-fcgi-1.6.3.tar.gz
# cd spawn-fcgi-1.6.3
# ./configure
# make && make install

Anschließend erstellen wir ein einfaches Skript /usr/local/bin/php-fastcgi:

#!/bin/sh
/usr/local/bin/spawn-fcgi -F 1 -C 1 -a 127.0.0.1 -p 9000 -u nginx -g nginx -f "/usr/bin/php5-cgi -c /etc/php5/cgi/php.ini" -P /var/run/fastcgi-php.pid

... und machen dieses ausführbar:

# chmod a+x /usr/local/bin/php-fastcgi

Damit spawn-fcgi automatisch nach jedem Rechnerstart mitgestartet wird, erstellen wir ein entsprechendes Init-Skript /etc/init.d/fastcgi:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          fastcgi
# 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: starts the FastCGI server
# Description:       starts spawn-fcgi using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/php-fastcgi

test -x $DAEMON || exit 0

set -e

RETVAL=0
case "$1" in
  start)
    $DAEMON
    RETVAL=$?
  ;;
  stop)
    killall -9 php5-cgi
    RETVAL=$?
  ;;
  restart)
    killall -9 php5-cgi
    $DAEMON
    RETVAL=$?
  ;;
  *)
    echo "Usage: php-fastcgi {start|stop|restart}"
    exit 1
  ;;
esac
exit $RETVAL

Auch dieses Init-Skript machen wir ausführbar:

# chmod a+x /etc/init.d/fastcgi

... und fügen es dem Default-Init-Level hinzu:

# update-rc.d fastcgi defaults

Performance-Tuning des Nginx- und PHP5-Setups

Da wir ein sehr performantes Setup anstreben, möchte ich in diesem Abschnitt einige Tricks und Kniffe zeigen, wie unser Webserver noch weiter beschleunigt werden kann.

Zunächst einmal aktivieren wir die gzip-Kompression, so dass alle statischen HTML- und CSS-Dateien, sowie alle Bilder komprimiert übertragen werden. Dazu fügen wir der Hauptkonfiguration /etc/nginx/nginx.conf die folgenden Definitionen hinzu (ca. Zeile 33):

# Compression
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 9;
gzip_http_version 1.1;
gzip_min_length 10;
gzip_types text/plain text/css image/png image/gif image/jpeg application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon;
gzip_vary on;
gzip_proxied any;
gzip_disable "MSIE [1-6]\.";

Anschließend starten wir den Webserver neu mittels:

# /etc/init.d/nginx restart

Installation eines relationalen Datenbanksystems (optional)

In vielen Fällen wird neben einem Webserver mit PHP5-Unterstützung ein relationales Datenbanksystem benötigt. Da einige Projekte MySQL verwenden, während andere auf PostgreSQL basieren, möchte ich im Folgenden die Installation und Konfiguration von beiden Datenbanksystemen erläutern.

MySQL

In den meisten Fällen verwenden insbesondere PHP5-Projekte MySQL als Datenbankbankend. Daher installieren wir zunächst MySQL auf unserem Debian GNU/Linux 6.0 “Squeeze” System mittels:

# aptitude install mysql-server

Damit eine PHP5-Applikation auf unsere MySQL-Datenbank zugreifen kann, benötigen wir zudem die entsprechende PHP-Bibliothek:

# aptitude install php5-mysql

PostgreSQL

Sollten wir PostgreSQL für eine PHP5-Webanwendung benötigen, gestaltet sich die Installation genauso einfach:

# aptitude install postgresql

Damit eine PHP5-Anwendung auf die Datenbank zugreifen kann, benötigen wir zudem die entsprechende PHP-Bibliothek:

# aptitude install php5-pgsql

Verwendete Quellen

  • http://kovyrin.net/2006/05/30/nginx-php-fastcgi-howto
  • http://www.myatus.co.uk/2009/09/07/compiling-nginx-on-debian-ubuntu
  • http://www.howtoforge.com/nginx_php5_fast_cgi_xcache_ubuntu7.04

(letztes Audit: 12.05.2011)

Document Actions

Comments (0)

comments powered by Disqus
  • Office. Asconix Systems • Große Elbstraße 47 • D-22767 Hamburg • Germany E-Mail. info@asconix.com • Phone. +49 40 609 410 650 • Fax. +49 40 609 410 659


  • Impressum
  • Datenschutz
  • Übersicht