Nginx mit PHP per FastCGI

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.

Verwandte Artikel