1. Einleitung
Anmerkung: Das ganze Howto richtet sich an erfahrene Anwender.
Die wohl am häufigsten genutze Methode PHP in den Apache zu integrieren ist mod_php, allerdings hat es 2 gravierende Nachteile:
- Es führt sämtliche Scripte als User unter dem der Apache läuft aus und
- es entsteht eine Sicherheitslücke da jeder User PHP Scripte eines anderen einsehen kann.
Man kann also jedem Vhost einen User zuteilen unter dem dann auch die Scripte laufen.
Zudem muss das php-cgi binary nicht wie bei mod_suphp bei jedem Request neu gestartet werden (was bei großen Websites ne menge ServerLoad verursacht) sondern bleibt eine weile im Speicher, das über das mod_fcgid Modul sehr gut konfigurierbar ist (besseres Prozessmanagement), also viel besser als bei mod_fastcgi.
Daher wähle ich für meine Konfiguration das mod_fcgid Modul aus. Am Ende des Howtos stehen ein paar Links dazu.
2. Benötigte Progs installieren
Folgende Programme werden benötigt:
Code: Select all
dev-lang/php
net-www/mod_fcgid
net-www/apacheCode: Select all
cgi force-cgi-redirectNachdem die USE Flags gesetzt worden sind können wir unsere Progs emergen:
Code: Select all
emerge apache mod_fcgid dev-lang/phpWenn nicht USE Flags überprüfen!
Und zwar so:
Code: Select all
PHP 5.1.2-gentoo (cgi-fcgi) (built: Apr 18 2006 20:15:14)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
3. Suexec2 verifizieren und eventuell ebuild anpassen
Nachdem unsere Programme installiert sind testen wir als erstes unsere Suexec2 Installation.
suexec2 -V sollte nun folgendes ausgeben:
Code: Select all
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/apache2/suexec_log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_SUEXEC_UMASK=077
-D AP_UID_MIN=1000
-D AP_USERDIR_SUFFIX="public_html"Beispiel:
Suexec2 wird nur funktionieren wenn alle eure späteren Vhosts nach /var/www liegen, sonst bekommt man so eine Fehlermeldung:
Code: Select all
command not in docroot (/home/gabelhonz/public_html/cgi-bin/printenv)oder aus den apache sources Suexec2 mit den entsprechenden Optionen neu kompilieren. Da ich ja schon vorher weiß wo mein DOC_ROOT liegen wird
trag ich es einfach in mein ebuild und und merge es dann.
Hinweis: Hat man sein ebuild wunschgemäß geändert muss man folgendes ausführen:
Code: Select all
ebuild /usr/portage/net-www/apache/apache-2.0.xx.ebuild digest4.FCGID Modul konfigurieren
Als nächstes ist unser fcgid Modul drann. Dazu öffnen wir:
/etc/apache2/modules.d/20_mod_fcgid.conf
und tragen ein:
Code: Select all
<IfDefine FCGID>
<IfModule !mod_fcgid.c>
LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so
</IfModule>
<IfModule mod_fcgid.c>
AddHandler php-fcgid .php
<Location /fcgi/fcgi-starter>
SetHandler fcgid-script
Options +ExecCGI
allow from all
</Location>
AddType application/x-httpd-php .php
Action php-fcgid /fcgi/fcgi-starter
IdleTimeout 120
##hier dann noch weitere prozessspezifischen Konfigurationen###
</IfModule>
</IfDefine>5.Pfade anlegen und Berechtigungen setzen
Um unseren Vhost später zu konfigurieren legen wir als erstes einmal das neuen Directory für unseren vhost an.
Zudem brauchen wir noch ein fcgi dir für das fcgi starter script.
Bei mir sieht die Verzeichnissstruktur eines Vhosts so aus:
Code: Select all
/var/www/vhost/meine-domain.de/
/var/www/vhost/meine-domain.de/fcgi
/var/www/vhost/meine-domain.de/cgi-bin
/var/www/vhost/meine-domain.de/logs
/var/www/vhost/meine-domain.de/public_htmlCode: Select all
#!/bin/sh
PHPRC="/etc/php/cgi-php5/" <== Pfad zur php.ini, kann man natürlich ändern
export PHPRC
PHP_FCGI_CHILDREN=4 <== Eventuell anpassen
export PHP_FCGI_CHILDREN
exec /usr/bin/php-cgi <== Pfad zur php-cgi binary, kann man na klar auch ändern.Das ganze ausführbar machen und natürlich nicht vergessen die Berechtigungen richtig zu setzen !
Zudem sollte man das Script für jeden unzugänglich machen mit:
Code: Select all
chattr +i -V fcgi-starter6. httpd.conf anpassen
Damit unsere Vhost Konfig am ende nicht allzu groß wird tragen wir folgendes in die httpd.conf ein:
Code: Select all
<Directory /var/www/vhost/*/public_html>
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews -Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
<Directory /var/www/vhost/*/fcgi>
AllowOverride None
Options +ExecCGI -MultiViews -Indexes
Order allow,deny
Allow from all
</Directory>
<Directory /var/www/vhost/*/cgi-bin>
AllowOverride None
Options +ExecCGI -MultiViews -Indexes
Order allow,deny
Allow from all
</Directory>
7.Vhost anlegen
Als vorletzten Schritt legen wir nun unseren Vhost folgendermaßen an:
Code: Select all
<VirtualHost *:80>
ServerAdmin me@domain.de
ServerName www.meine-domain.de
ServerAlias meine-domain.de
DocumentRoot /var/www/vhost/meine-domain.de/public_html
Alias /fcgi /var/www/vhost/meine-domain.de/fcgi
ScriptAlias /cgi-bin /var/www/meine-domain.de/cgi-bin
DirectoryIndex index.php index.html index.htm
SuexecUserGroup user group (hier natürlich richtige Daten eintragen)
ErrorLog /var/www/vhost/meine-domain.de/logs/error.log
LogLevel warn
CustomLog /var/www/vhost/meine-domain.de/logs/acces.log combined
</VirtualHost>
Als letztes nun die Apache Startoptionen in /etc/conf.d/apache2 auf :
Code: Select all
APACHE2_OPTS="-D FCGID"Das wars. Apache starten und fertig das ganze.
Jetzt sollte man sobald ein php script über den vhost aufgerufen wird mittels pstree -Au sehen können was unter welchem User läuft.
bei mir heißt der User test.
Code: Select all
|-apache2-+-7*[apache2(apache)]
| `-apache2(apache)---php-cgi(test)---4*[php-cgi]
Viel Spaß
gruß
http://fastcgi.coremail.cn/doc.htm
http://de.php.net/security.cgi-bin
