Apache2 und CGI/FastCGI: Unterschied zwischen den Versionen
| Zeile 243: | Zeile 243: | ||
== Weiterführende Links == | == Weiterführende Links == | ||
| − | http://www.heise.de/security/artikel/Grundsicherung-fuer-PHP-Software-270918.html | + | * http://www.heise.de/security/artikel/Grundsicherung-fuer-PHP-Software-270918.html |
| − | + | * php.ini Optionen Referenz: http://www.tu-chemnitz.de/docs/php/ini.core.html | |
| − | php.ini Optionen Referenz: http://www.tu-chemnitz.de/docs/php/ini.core.html | + | * mod_fcgid: http://fastcgi.coremail.cn/ |
| + | * Apache: http://httpd.apache.org/ | ||
| + | * PHP: http://www.php.net/ | ||
| + | * Debian: http://www.debian.org/ | ||
Version vom 20. Februar 2010, 10:59 Uhr
Apache2 mit php5 und mod_fcgid auf Debian Lenny (Debian 5)
Quelle (en):http://www.howtoforge.com/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-debian-lenny 19.2.2010
Einleitung
FastCGI
Wenn man PHP nicht als Modul von Apache laufen lassen will kann man es über das Common Gateway Interface ansprechen. FastCGI erzeugt im Gegensatz zu CGI nicht für jede Anfreage einen neuen Thread und ist dementsprechend genügsamer was die Performance betrifft.
Das FastCGI Modul mod_fcgid ist eine Alternative zum älteren mod_fastcgi. Durch den klassischen CGI - Ansatz können wir PHP-Skripte mit dem jeweiligen Besitzer und nicht nur mit dem Apache User auszuführen. Das erlaubt eine saubere Trennung von Virutellen Hosts.
Beispiel Konfiguration
Im Beispiel werden zwei vhosts (www.example1.com und www.example2.com) konfiguriert die jeweils ein eigenes Web-Verzeichnis, eigene Benutzer und theoretisch auch eigene php.ini Konfigurationen beinhalten können. Wir nehmen an das Web Rootvezeichnis liegt Debian üblich in /var/www/
Apache2, PHP5 CGI Version und mod_fcgid installieren
Geht auf Debian einfach mit dem aptitude Tool:
aptitude install apache2 apache2-suexec libapache2-mod-fcgid php5-cgi
Falls der Apache schon mit aktiviertem php5 Modul installiert wurde müssen wir dieses abschalten:
a2dismod php5
Folgende Module schalten wir ein:
a2enmod rewrite a2enmod suexec a2enmod include a2enmod fcgid
Folgende PHP Einstellung sorgt für ein intelligenteres Handling der Skriptnamen und Pfade in PHP Skripten. Es funktioniert jedoch nicht auf allen Servern (z.B. nicht auf (OmniHttp oder Microsoft). Dort muß es abgeschalten werden.
Wir editieren das Standard php.ini File z.B. mit vim (Pfad für Debian angegeben)
vim /etc/php5/cgi/php.ini
Am Ende fügen wir die Zeile:
cgi.fix_pathinfo = 1
ein.
Apache neustarten:
/etc/init.d/apache2 restart
VHOSTs einrichten
Wir richten 2 vhosts ein:
- www.example1.com
- Benutzer: web1
- Gruppe: web1
- Document Root: /var/www/web1/web
Analog dazu www.example2.com
Benutzer und Gruppen anlegen
Für www.example1.com erzeugen wir einen Benutzer web1 und eine Gruppe web1. Analog dazu für www.example2.com:
groupadd web1 groupadd web2 useradd -s /bin/false -d /var/www/web1 -m -g web1 web1 useradd -s /bin/false -d /var/www/web2 -m -g web2 web2
Webverzeichnisse der vhosts anlegen
mkdir -p /var/www/web1/web mkdir -p /var/www/web2/web
Benutzerrechte anpassen
chown web1:web1 /var/www/web1/web chown web2:web2 /var/www/web2/web
Zugriff auf PHP Konfigurieren
Auf PHP greift man über das Modul suexec zu.
PHP liegt in
/usr/lib/cgi-bin/php
also außerhalb des Web Verzeichnisses. suexec hat aber nur Zugriff auf das Webverzeichnis (DOC_ROOT):
/usr/lib/apache2/suexec -V
Die Ausgabe sieht ungefähr so aus:
server1:~# /usr/lib/apache2/suexec -V -D AP_DOC_ROOT="/var/www" -D AP_GID_MIN=100 -D AP_HTTPD_USER="www-data" -D AP_LOG_EXEC="/var/log/apache2/suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=100 -D AP_USERDIR_SUFFIX="public_html" server1:~#
Dies lösen wir mit einem sog. Wrapper-Skript,das für jeden VHOST erstellt wird. Das Skript leitet die Anfragen an PHP weiter. Es liegt innerhalb des Webverzeichnisses und bekommt Benutzer und Gruppe des zugehörigen vhosts zugewiesen. Zu beachten ist das das Skript für other nicht beschreibbar ist. Sonst verweigert suexec seinen Dienst aus Sicherheitsgründen. Die Wrapper Skripte bekommen ein eigenes Verzeichnis, damit wir die Übersicht behalten: /var/www/php-fcgi-scripts
So gehts:
WrapperSkript für www.example1.com
mkdir -p /var/www/php-fcgi-scripts/web1 vim /var/www/php-fcgi-scripts/web1/php-fcgi-starter
Code:
#!/bin/sh PHPRC=/etc/php5/cgi/ export PHPRC # max num of requests before fcgid process is stopped and new one is launched. export PHP_FCGI_MAX_REQUESTS=5000 # number of PHP children that will be launched export PHP_FCGI_CHILDREN=8 exec /usr/lib/cgi-bin/php
Analog für www.example2.com. Hier muß nur web1 zu web2 verändert werden.
Die php-fcgi-starter Skripte müssen ausführbar sein und der Gruppe und dem User der entsprechenden Website gehören:
chmod 755 /var/www/php-fcgi-scripts/web1/php-fcgi-starter chmod 755 /var/www/php-fcgi-scripts/web2/php-fcgi-starter chown -R web1:web1 /var/www/php-fcgi-scripts/web1 chown -R web2:web2 /var/www/php-fcgi-scripts/web2
Apache VirtualHosts anlegen
Im Apache Verzeichnis sites-available werden die VirtualHosts angelegt...
vim /etc/apache2/sites-available/web1
Code:
<VirtualHost *:80>
ServerName www.example1.com
ServerAlias example1.com
ServerAdmin webmaster@example1.com
DocumentRoot /var/www/web1/web/
<IfModule mod_fcgid.c>
SuexecUserGroup web1 web1
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/web1/web/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/web1/php-fcgi-starter .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off
</VirtualHost>
... und die neue Site aktiviert
a2ensite web1
Analog dazu für www.example2.com (Pfade und Name des Host anpassen)
Server neu laden:
/etc/init.d/apache2 reload
Test
Zum Test erzeugen wir eine kleine PHP Testdatei in www.example1.com
vim /var/www/web1/web/info.php
Code:
<?php phpinfo(); ?>
und rufen sie im Browser auf. Eventuell muß man dazu die hosts Datei auf seinem Rechner so anpassen, das sie auf die richtige ServerIP zeigt (Suche nach hosts Datei)
Wenn alles stimmt sollte eine Infoseite ausgegeben werden, und der Zeile Server API sollte der Wert CGI/FastCGI stehen.
Wenn es nicht klappt lohnt sich meist ein Blick in die error.log und suexec.log Dateien des Apache (/var/log/apache2/ auf Debian)
Eine individuelle PHP Konfiguration für jeden Host
Da jede Site ihr eigenes php-fcgi-starter Wrapper Skript hat, ist es möglich eigene php.ini Dateien zu konfigurieren
Beispiel 1
Am Anfang bietet es sich an eine Kopie der Standard php.ini Datei zu nehmen und diese anzupassen:
php.ini Kopieren und Rechte anpassen
cp /etc/php5/cgi/php.ini /var/www/web2/ chown web2:web2 /var/www/web2/php.ini
Wrapperskript anpassen damit die neue Konfiguration gelesen wird
vim /var/www/php-fcgi-scripts/web2/php-fcgi-starter
Die Konstante PHPRC bekommt einen neuen Wert: /var/www/web2/
- !/bin/sh
PHPRC=/var/www/web2/ export PHPRC export PHP_FCGI_MAX_REQUESTS=5000 export PHP_FCGI_CHILDREN=8 exec /usr/lib/cgi-bin/php
Apache neu laden:
/etc/init.d/apache2 reload
Beispiel 2
Man kann auch einzelne Werte der geladenen php Konfiguration direkt im Wrapperskript überscheiben oder hinzufügen, indem man den -d Schalter nutzt.
In diesem Beispiel deaktivieren wir die magic_quotes_gpc für die Site www.example2.com
vim /var/www/php-fcgi-scripts/web2/php-fcgi-starter
Code:
#!/bin/sh PHPRC=/etc/php5/cgi/ export PHPRC export PHP_FCGI_MAX_REQUESTS=5000 export PHP_FCGI_CHILDREN=8 exec /usr/lib/cgi-bin/php -d magic_quotes_gpc=off
Neuladen des Apache:
/etc/init.d/apache2 reload
Weiterführende Links
- http://www.heise.de/security/artikel/Grundsicherung-fuer-PHP-Software-270918.html
- php.ini Optionen Referenz: http://www.tu-chemnitz.de/docs/php/ini.core.html
- mod_fcgid: http://fastcgi.coremail.cn/
- Apache: http://httpd.apache.org/
- PHP: http://www.php.net/
- Debian: http://www.debian.org/