gabelhonz Apprentice
![Apprentice Apprentice](/images/ranks/rank_rect_2.gif)
![](images/avatars/1360712930427087ea9e8bc.gif)
Joined: 30 Aug 2004 Posts: 222 Location: 10010100111110011
|
Posted: Wed May 24, 2006 11:31 am Post subject: [HowTo]Apache2 + Suexec2 + php-cgi + mod_fcgid |
|
|
HowTo Apache2 + Suexec2 + php-cgi + mod_fcgid
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: | dev-lang/php
net-www/mod_fcgid
net-www/apache |
Zudem werden außer den USE Flags die man für php möchte noch zusätzlich folgende Flags verwendet:
Code: | cgi force-cgi-redirect |
Trägt man diese nicht ein läuft am Ende das ganze nicht!
Nachdem die USE Flags gesetzt worden sind können wir unsere Progs emergen:
Code: | emerge apache mod_fcgid dev-lang/php |
Nachdem unser php-cgi installiert worden ist muss ein php-cgi -v unsere cgi-fcgi binary anzeigen !
Wenn nicht USE Flags überprüfen!
Und zwar so:
Code: | 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: | -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" |
Alle Parameter müssen mit unserer gewollten Konfiguration übereinstimmen! Stimmt eines der obengenannten Parameter nicht, läuft später Suexec2 nicht korrekt!
Beispiel:
Suexec2 wird nur funktionieren wenn alle eure späteren Vhosts nach /var/www liegen, sonst bekommt man so eine Fehlermeldung:
Code: | command not in docroot (/home/gabelhonz/public_html/cgi-bin/printenv) |
Möchte man nun allerdings ein anderes DocumentRoot verwenden so ist das natürlich möglich. Dazu kann man einfach das gewünschte ebuild anpassen
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: | ebuild /usr/portage/net-www/apache/apache-2.0.xx.ebuild digest |
4.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: |
<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> |
Somit haben wir unser fcgid modul richtig konfiguriert.
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: |
/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_html |
Im fcgi Verzeichnis legen wir eine Datei namens fcgi-starter mit folgendem Inhalt an:
Code: | #!/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. |
Dieses script wird benötigt um z.B jedem User eine persönliche php Konfiguration zu gewährleisten oder ein eigenes binary.
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: | chattr +i -V fcgi-starter |
6. httpd.conf anpassen
Damit unsere Vhost Konfig am ende nicht allzu groß wird tragen wir folgendes in die httpd.conf ein:
Code: | <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>
|
Die ganzen Option wie gewünscht ändern.
7.Vhost anlegen
Als vorletzten Schritt legen wir nun unseren Vhost folgendermaßen an:
Code: | <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>
|
8.Apache Startoptionen ändern
Als letztes nun die Apache Startoptionen in /etc/conf.d/apache2 auf :
Code: | APACHE2_OPTS="-D FCGID" |
setzen.
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: |
|-apache2-+-7*[apache2(apache)]
| `-apache2(apache)---php-cgi(test)---4*[php-cgi]
|
Ich hoffe mir sind nicht irgendwelche Fehler reingesprungen.
Viel Spaß
gruß
http://fastcgi.coremail.cn/doc.htm
http://de.php.net/security.cgi-bin _________________ Wenn Chuck Norris ins Wasser fällt, wird Chuck Norris nicht nass. Wasser wird Chuck Norris. |
|