Im Gegensatz zum Apache Webserver bietet Nginx keine Möglichkeit den PHP Prozess direkt mit zu starten(siehe: mod_php). Jedoch besteht die Möglichkeit diese Funktion über die FastCGI-Schnittstelle nachzurüsten. Dieser Prozess kann jedoch nicht wie bei lighttpd direkt über den Webserver sondern nur von extern gestartet werden. Was auf den ersten Blick sehr umständlich erscheint hat auf den zweiten Blick durchaus Vorteile, die die Nachteile durchaus wettmachen können.
Konfiguration
Die folgende Beschreibung bezieht sich auf Ubuntu 10.04, sollte sich aber leicht auf andere Versionen bzw. Distributionen übertragen lassen. Es wird davon ausgegangen, dass nginx schon installiert und konfiguriert ist.
In einem ersten Schritt werden die benötigten Pakete installiert.
$ sudo apt-cache show php5-cgi spawn-fcgi
Anschließend wird ein init-Skript mit dem Namen php-fcgi.conf im Ordner /etc/init angelegt. Es dient anschließend zum Starten und zum Stopen des FastCGI Prozesses.
description "php-fcgi"
author "DinoTools.de"
start on filesystem
stop on runlevel [!2345]
# Use the given user and the group to span the cgi process
env FASTCGI_USER=www-data
env FASTCGI_GROUP=www-data
# Use the dir, user and group for the unix socket
# The socket has to be accessible by the www-server process
env SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
env SOCKET_DIR=/var/run/php-fastcgi
env SOCKET_USER=www-data
env SOCKET_GROUP=www-data
# PHP process
env PHP5=/usr/bin/php5-cgi
env CHILDREN=6
respawn
pre-start script
mkdir -p $SOCKET_DIR
chown $SOCKET_USER:$SOCKET_GROUP $SOCKET_DIR
chmod 0755 $SOCKET_DIR
end script
script
exec /usr/bin/spawn-fcgi -s $SOCKET -n -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -U $SOCKET_USER -G $SOCKET_GROUP -f $PHP5
end script
Ist dies geschafft kann der FastCGI Prozess wie folgt verwaltet werden.
$ sudo service php-fcgi start
$ sudo service php-fcgi restart
$ sudo service php-fcgi stop
An dieser Stelle solle der Unix-Socket /var/run/php-fastcgi/php-fastcgi.socket existieren und nginx kann Konfiguriert werden.
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
location / {
root /var/www;
index index.html index.htm;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Anschließend muss die Konfiguration neu eingelesen werden.
$ sudo service nginx reload
Vorteile
Ein großer Vorteil dieser Technik ist es, dass bei einer Anpassung der Konfiguration oder nach einem Update nur die betroffenen Teile neu gestartet werden müssen. Wird zum Beispiel PHP aktualisiert, so kann der PHP-FastCGI Prozess neu gestartet werden und alle Python Anwendungen können ohne Unterbrechung weiter laufen. Der nächste Vorteil ist, dass so einfach mehrere FastCGI Prozesse, die mit unterschiedlichen Nutzern/Gruppen und Konfigurationen laufen, betrieben werden können. So kann in vielen Situationen die Sicherheit erhöht werden.