Apache2 mit PHP5 als fcgi und suexec

Die einfachste Methode unter Debian den Apache2 mit PHP auszurüsten ist wohl mod_php, einfach installiert und die Konfiguration erfolgt durch apt automatisch. Doch hat diese Variante mindestens einen großen Nachteil: in shared Hosting Umgebungen kann man dadurch über PHP die Dateien der anderen Nutzer einsehen. Dies ist dem Umstand geschuldet, das der Apache für alle Benutzer mit den gleichen Rechten läuft.

Wenn man PHP aber als CGI Modul einbindet, kann man dies ändern – jeder PHP Thread wird mit den Rechten des jeweiligen Nutzers ausgeführt. Installiert ist dieses Modul per apt genauso schnell wie mod_php installiert und aktiviert:

apt-get install apache2 libapache2-mod-fcgid apache2-suexec php5-cgi
a2enmod fcgid
a2enmod suexec

Als Nächstes kommt die Konfiguration der Domains. Dabei ist zu beachten, das im CGI Modus kein Symbolischer Link als Pfad genutzt werden kann. Ich lege meine Domains alle unter /var/www mit folgender Struktur an:

/var/www/DOMAIN
         DOMAIN/conf
         DOMAIN/html
         DOMAIN/logs
         DOMAIN/tmp

Die Konfiguration der Domain selber liegt dann unter /etc/apache2/sites-available/domain und hat folgenden Inhalt:

<VirtualHost *:80>
   ServerName DOMAIN
   ServerAlias www.DOMAIN
   # Bestimmung der Rechte
   SuexecUserGroup USERNAME USERGROUP
   # Handler für PHP Dateien festlegen
   AddHandler fcgid-script .php
   DocumentRoot "/var/www/DOMAIN/html"
   DirectoryIndex index.htm index.html index.php
   <Directory "/">
      Options FollowSymLinks
      AllowOverride None
   </Directory>
   <Directory "/var/www/DOMAIN/html">
      Options Indexes MultiViews FollowSymLinks +ExecCGI
      FCGIWrapper /var/www/DOMAIN/conf/php-starter .php
      Order allow,deny
      Allow from all
   </Directory>
   ErrorLog /var/www/DOMAIN/logs/error.log
   CustomLog /var/www/DOMAIN/logs/access.log combined
   LogLevel warn
</VirtualHost>

Jeder vhost bekommt eine eigene php.ini, das hat auch den Vorteil, dass man jeden vhost einzeln feintunen kann. Da ich selber keine Lust habe bei vielen vhosts die php.ini per Hand anzupassen, anbei ein kleines Script, was uns dies im Batchmodus erledigt:

#!/bin/bash

DOM=$1
USERNAME=$2
DOMPATH="\/var\/www\/$DOM"
TMP_PATH="$DOMPATH\/tmp"
UPLOAD_PATH="$DOMPATH\/tmp"
OPEN_PATH="$DOMPATH\/html:$TMP_PATH:\/usr\/share\/php:.:\/home\/${USERNAME}\/"

cat "/etc/php5/cgi/php.ini" \
        | sed "s/;open_basedir =/open_basedir = $OPEN_PATH/g" \
        | sed "s/;session.save_path = \"\/tmp\"/session.save_path = $TMP_PATH/g" \
        | sed "s/;upload_tmp_dir =/upload_tmp_dir = $UPLOAD_PATH/g" \
                > "/var/www/${DOM}/conf/php.ini"

Der Aufruf dieses Scriptes erfolgt dann einfach per „./script.sh DOMAIN USERNAME“ 😉

Als Letztes fehlt noch der Starter für die PHP Dateien, also legen wir eine Datei /var/www/DOMAIN/conf/php-starter mit folgendem Inhalt an:

#!/bin/sh
PHPRC="/var/www/DOMAIN/conf/"
export PHPRC
export TMPDIR=/var/www/DOMAIN/tmp
exec /usr/bin/php5-cgi

Damit der Zugriff auf die Dateien durch suexec nicht unterbunden wird, übereignen wir den gesamten Domainordner noch dem Benutzer, und ändern die Rechte dafür

chown USERNAME:USERGROUP /var/www/DOMAIN -R
chmod 755 /var/www/DOMAIN

Suexec besteht darauf, das der PHP Starter dem User gehört, ausführbar ist, und von Fremden nicht lesbar bzw. ausführbar ist. Das heißt, wir ändern die Rechte dieser Datei auf 750. Da die Dateien php.ini und php-starter im Userordner liegen, und dieser Vollzugriff darauf hat, setzen wir sicherheitshalber noch das Flag immutable, damit er die Dateien trotzdem nicht ändern kann:

chattr +i -V /var/www/DOMAIN/conf/php-starter
chmod 440 /var/www/DOMAIN/conf/php.ini
chattr +i -V /var/www/DOMAIN/conf/php.ini

So, als letzes noch die Domain im Apache aktivieren und einen Konfigurationstest machen.

a2ensite DOMAIN
apache2ctl configtest

Falls nun nach einem Restart des Apache etwas nicht funktioniert, sollte man in den Dateien

/var/www/DOMAIN/logs/error.log
/var/log/apache2/suexec.log

nach Fehlern Ausschau halten, meistens sind es noch falsche Dateiberechtigungen, oder Tippfehler in der Konfiguration.

Antwort auf Apache2 mit PHP5 als fcgi und suexec

  1. Joe sagt:

    Tolle und nützliche Anleitung, besonders für so einen Neuling im (v)Serverbereich wie ich. Danke! 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.