Welche Apache / PHP-Konfigurationen kennen Sie und wie gut sind sie?

8

Ich wollte Sie nach den bekannten PHP / Apache-Konfigurationsmethoden und deren Vor- und Nachteilen fragen. Ich werde mich selbst beginnen:

---------------- PHP als Apache-Modul ----------------

Vorteile : Gute Geschwindigkeit, da Sie nicht jedes Mal exe starten müssen, insbesondere im MPM-Worker- Modus. In diesem Modus können Sie auch verschiedene PHP-Beschleuniger wie APC oder eAccelerator verwenden.

Nachteile : Wenn Sie Apache im MPM-Worker-Modus ausführen, können Stabilitätsprobleme auftreten, da jeder Fehler in einem PHP-Skript zu einer Instabilität des gesamten Thread-Pools dieses Apache-Prozesses führt. Auch in diesem Modus werden alle Skripte im Auftrag des Apache-Benutzers ausgeführt. Das ist schlecht für die Sicherheit. Für die Konfiguration von mpm-worker muss PHP im thread-sicheren Modus kompiliert werden. Zumindest die Standard-Repositorys von CentOS und RedHat verfügen nicht über eine thread-sichere PHP-Version. Unter diesen Betriebssystemen müssen Sie mindestens PHP selbst kompilieren (es gibt eine Möglichkeit, Worker-MPM unter Apache zu aktivieren). Die Verwendung von thread-sicheren PHP-Binärdateien wird als experimentell und instabil angesehen. Außerdem unterstützen viele PHP-Erweiterungen den thread-sicheren Modus nicht oder wurden im thread-sicheren Modus nicht gut getestet.

---------------- PHP als CGI ----------------

Dies scheint die langsamste Standardkonfiguration zu sein, die selbst ein "Betrug" zu sein scheint;)

---------------- PHP als CGI über mod_suphp ----------------

Pros : suphp können Sie PHP - Scripte im Namen der Skriptdatei Besitzer auszuführen. Auf diese Weise können Sie verschiedene Standorte auf demselben Computer sicher trennen. Außerdem ermöglicht suphp die Verwendung unterschiedlicher php.ini-Dateien pro virtuellem Host.

Nachteile : PHP im CGI-Modus bedeutet weniger Leistung. In diesem Modus können Sie keine PHP-Beschleuniger wie APC verwenden, da jedes Mal, wenn ein neuer Prozess erzeugt wird, das Skript den Cache des vorherigen Prozesses unbrauchbar macht. Übrigens, kennen Sie die Möglichkeit, einen Beschleuniger in dieser Konfiguration anzuwenden? Ich habe etwas über die Verwendung von shm für den PHP-Bytecode-Cache gehört. In diesem Modus können Sie PHP auch nicht über .htaccess-Dateien konfigurieren. Sie müssen dafür den P ECL htscanner installieren, wenn Sie verschiedene Optionen pro Skript über .htaccess (Direktiven php_value / php_flag) festlegen müssen.

---------------- PHP als CGI über suexec ----------------

Diese Konfiguration sieht genauso aus wie bei suphp, aber ich habe gehört, dass sie langsamer und weniger sicher ist. Es gelten fast die gleichen Vor- und Nachteile.

---------------- PHP als FastCGI ----------------

Vorteile : Der FastCGI-Standard ermöglicht es einem einzelnen PHP-Prozess, mehrere Skripte zu verarbeiten, bevor der PHP-Prozess beendet wird. Auf diese Weise erhalten Sie Leistung, da Sie nicht für jedes Skript einen neuen PHP-Prozess starten müssen. Sie können in dieser Konfiguration auch PHP-Beschleuniger verwenden (Kommentar siehe Abschnitt "Nachteile"). FCGI ermöglicht fast wie suphp auch die Ausführung von PHP-Prozessen für einige Benutzer. mod_fcgid scheint die umfassendste fcgi-Unterstützung und Flexibilität für Apache zu haben.

Nachteile : Die Verwendung des PHP-Beschleunigers im FastCGI-Modus führt zu einem hohen Speicherverbrauch, da jeder PHP-Prozess seinen eigenen Bytecode-Cache hat (es sei denn, es gibt einen Beschleuniger, der gemeinsam genutzten Speicher für den Bytecode-Cache verwenden kann. Gibt es einen solchen?). FastCGI ist auch etwas komplex zu konfigurieren. Sie müssen verschiedene Konfigurationsdateien erstellen und einige Konfigurationsänderungen vornehmen.

Es scheint, dass fastcgi die stabilste, sicherste, schnellste und flexibelste PHP-Konfiguration ist, jedoch etwas schwierig zu konfigurieren ist. Aber vielleicht habe ich etwas verpasst?

Kommentare sind willkommen!

Vladislav Rastrusny
quelle

Antworten:

3

Das Ausführen von PHP über FastCGI bietet Ihnen mit Sicherheit die größte Flexibilität. Sie können nicht nur einen mpm-worker Apache sicher verwenden, sondern auch einen anderen Webserver (z. B. nginx).

Aber selbst wenn Sie bei Apache bleiben, ist "PHP via FastCGI" im Moment nicht eine Option, sondern mindestens zwei: mod_fastcgi, mod_fcgid. Darüber hinaus können Sie entweder dynamische, statische oder externe FastCGI-Prozesse verwenden. mit oder ohne suexec. Und dann gibt es noch den internen FastCGI-Prozessmanager von PHP, der jetzt durch das sehr schöne PHP-FPM in PHP 5.3 ersetzt wird. Alle diese Optionen haben unterschiedliche Vor- und Nachteile und können zu unterschiedlichen Problemen führen.

Wenn ich die Wahl hätte, würde ich im Moment mod_fastcgi mit PHP-FPM auswählen, hauptsächlich weil es äußerst vielseitige und stabile Setups ermöglicht.

Graf
quelle
1
> Ich würde mod_fcgid mit PHP-FPM auswählen. Dies verhindert, dass Sie APC verwenden. Nur mod_fastcgi erlaubt die Verwendung externer FCGI-Server (PHP-FPM). Wenn Sie mod_fcgid verwenden, werden alle Vorteile von php-fpm auf Null gesetzt.
Vladislav Rastrusny
Das war natürlich ein dummer Tippfehler. Entschuldigung für die Verwirrung, ich habe es korrigiert.
Earl
2

Ich beantworte Ihre Frage nicht wirklich, aber ich verstehe nicht, dass FastCGI schwer zu konfigurieren ist. Es unterscheidet sich von den anderen Methoden, die ersetzt werden sollen (mod_php, mod_python, ...), sodass möglicherweise ein Teil des Codes neu geschrieben werden muss. Das kann der schwierige Teil sein, aber für die Konfiguration von Apache finde ich es zumindest ein Kinderspiel. Als Beispiel habe ich eine WSGI-Anwendung in Python getestet und wollte sehen, wie sie mit allen von WSGI unterstützten Protokollen funktioniert. Hier ist die virtuelle Hostdatei mit den Konfigurationen für alle Protokolle (mit mod_fastcgi):

<VirtualHost *:8888>
DocumentRoot "/home/test/"
#FastCGIExternalServer /home/test/wsgi -host 127.0.0.1:3333
#SCGIMount / 127.0.0.1:3333
FastCgiServer /home/test/wsgi/fcgi.py -idle-timeout 60 -processes 1
<Directory "/home/test/wsgi/">
    Options +ExecCGI +FollowSymLinks
    AddHandler fastcgi-script .py
    #AddHandler wsgi-script .py
    #AddHandler cgi-script .py
</Directory>
</VirtualHost>

Es scheint mir nicht komplex zu sein. Sicher, FastCGI unterstützt viele Optionen und kann zu Tode optimiert werden, aber das ist eine andere Sache.

Um als anderer Benutzer ausgeführt zu werden, verwenden Sie suexec und FastCGIWrapperdann wird es:

FastCGIWrapper On
<VirtualHost *:8888>
SuexecUserGroup test test
DocumentRoot "/home/test/"
FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1
<Directory "/var/www/test/">
    Options +ExecCGI +FollowSymLinks
    AddHandler fastcgi-script .py
</Directory>
</VirtualHost>

Unter diesem Link finden Sie eine benutzerdefinierte php.ini, die Sie jedoch mit der -initial-envOption angeben können sollten , z

FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1 -inital-env PHPRC=/blah/
Dan Andreatta
quelle
Ja, das Hinzufügen von config zu Apache ist einfach. Ihre Konfiguration erlaubt es jedoch nicht, Skripte im Namen ihres Besitzers oder zumindest von einem bestimmten Benutzer auszuführen. Außerdem kann die benutzerdefinierte php.ini in Ihrem Fall nicht verwendet werden (ich ziehe es vor, open_basedir für jeden virtuellen Host nur für sein Verzeichnis
einzuschränken
Ich kenne PHP nicht gut, aber das sind die gleichen Probleme, mit denen Sie bei reinem CGI konfrontiert sind. Und Sie können fastcgi ganz einfach als externen Server ausführen, wie Sie möchten.
Dan Andreatta
Zusätzliche Informationen zur Antwort hinzugefügt.
Dan Andreatta
1

Ein guter Kandidat ist: Der Apache 2 ITK MPM

apache2-mpm-itk (kurz mpm-itk) ist ein MPM (Multi-Processing Module) für den Apache-Webserver. Mit mpm-itk können Sie jeden Ihrer vhost unter einer separaten UID und GID ausführen. Kurz gesagt, die Skripte und Konfigurationsdateien für einen vhost müssen nicht mehr für alle anderen vhosts lesbar sein.

Hat für einen unserer Kunden mit Hunderten von VirtualHosts mit ziemlich vielen Besuchern sehr gut gearbeitet.

Sie erhalten alle Vorteile, wenn Sie PHP als Modul ausführen und einige der Nachteile klären.

rkthkr
quelle
Ja, wird aber zuletzt ein Jahr zuvor aktualisiert. Und was noch wichtiger ist, eröffnet ein potenzielles Sicherheits-Ganzes. "Da mpm-itk in der Lage sein muss, setuid () zu verwenden, wird es als root ausgeführt (obwohl dies nach Möglichkeit mit POSIX-Funktionen eingeschränkt ist), bis die Anforderung analysiert und der vhost bestimmt wird. Dies bedeutet, dass eine Sicherheitslücke vor dem Analysieren der Anforderung besteht eine Wurzel Sicherheitslücke. (Der wahrscheinlichste Ort ist wahrscheinlich in mod_ssl.) "
Vladislav Rastrusny
Der Code funktioniert, ist sehr stabil und wahrscheinlich kein Grund, ihn zu aktualisieren. Das Modul hat einen aktiven Debian-Entwickler (weiß nichts über den ursprünglichen Entwickler). Und es ist FOSS und nicht sehr kompliziert.
rkthkr
0

Für mich ist die Frage, was der Zweck des Webservers ist. Wird mehr als ein virtueller Host bedient? Wenn ja, müssen Sie die Leistung für isolierte Sicherheit opfern. Ja, die Leistung leidet, aber mit der heutigen Hardware sollte immer noch einiges an Verkehr erforderlich sein, um größere Leistungsprobleme zu verursachen.

Wenn die Leistung so wichtig ist, führen Sie den einen Standort auf einem VPS- oder dedizierten Server aus und konfigurieren Sie die Leistung.

Justin Higgins
quelle
Ich frage nur nach möglichen Varianten. Es geht nicht darum, den besten auszuwählen. Ich werde mich selbst wählen.
Vladislav Rastrusny