Apache2 und CGI/FastCGI

Aus Wikizone
Version vom 9. April 2010, 09:27 Uhr von 193.196.133.66 (Diskussion)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Links[Bearbeiten]

http://blog.zakame.net/tips/apache2-worker-lowmem Apache auf Systemen mit wenig Speicher

Apache - Konfiguration und Performance

Apache2 mit php5 und mod_fcgid auf Debian Lenny (Debian 5)[Bearbeiten]

Quelle (en):http://www.howtoforge.com/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-debian-lenny 19.2.2010

Einleitung[Bearbeiten]

FastCGI[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

mkdir -p /var/www/web1/web
mkdir -p /var/www/web2/web

Benutzerrechte anpassen[Bearbeiten]

chown web1:web1 /var/www/web1/web
chown web2:web2 /var/www/web2/web

Zugriff auf PHP Konfigurieren[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

Da jede Site ihr eigenes php-fcgi-starter Wrapper Skript hat, ist es möglich eigene php.ini Dateien zu konfigurieren

Beispiel 1[Bearbeiten]

Am Anfang bietet es sich an eine Kopie der Standard php.ini Datei zu nehmen und diese anzupassen:

php.ini Kopieren und Rechte anpassen[Bearbeiten]
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[Bearbeiten]
vim /var/www/php-fcgi-scripts/web2/php-fcgi-starter

Die Konstante PHPRC bekommt einen neuen Wert: /var/www/web2/

  1. !/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[Bearbeiten]

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[Bearbeiten]