Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[HowTo]Apache2 + Suexec2 + php-cgi + mod_fcgid
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation
View previous topic :: View next topic  
Author Message
gabelhonz
Apprentice
Apprentice


Joined: 30 Aug 2004
Posts: 222
Location: 10010100111110011

PostPosted: Wed May 24, 2006 11:31 am    Post subject: [HowTo]Apache2 + Suexec2 + php-cgi + mod_fcgid Reply with quote

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.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum