Wie kann ich feststellen, ob Apache als Prefork oder Worker ausgeführt wird?

40

Wie kann ich feststellen, ob Apache als Prefork oder Worker ausgeführt wird (oder für die Ausführung konfiguriert ist)?


quelle
2
oder technisch 'kompiliert, um als' auszuführen

Antworten:

37

Das MPM wird zur Kompilierungszeit konfiguriert. Eine Möglichkeit, es später herauszufinden, besteht darin, eine in Modulen kompilierte Liste zu erstellen. Diese Liste enthält das ausgewählte MPM. Die Auflistung kann durch Ausführen der Apache-Binärdatei mit dem Flag -l erfolgen.

andreas@halleck:~$ apache2 -l
Compiled in modules:
 core.c
 mod_log_config.c
 mod_logio.c
 worker.c
 http_core.c
 mod_so.c
andreas@halleck:~$ 

Hier finden wir das Modul worker.c, daher führe ich das worker MPM aus.

andol
quelle
4
Diese Antwort ist falsch. Siehe meine Antwort.
Chris Johnson
1
Hm, auf Ubuntu habe ich weder Worker noch Prefork aufgelistet, wenn ich das mache ...
mlissner
2
Unter Ubuntu können Sie apache2ctl -Maktive Module auflisten.
SteffenNielsen
53

Die Antworten von Series8217 und Andol sind beide falsch.

Die Frage war, wie zu sagen , ob Apache laufen prefork oder Arbeiter. Die Ratschläge der anderen Antworten geben nur Aufschluss über die Standard- MPM (basierend auf kompilierten Modulen), nicht jedoch darüber, ob diese Standardeinstellung oder eine andere Auswahl zurzeit verwendet wird.

Wenn httpd -Vprefork angezeigt wird, bedeutet dies nur, dass prefork das kompilierte Standard-MPM ist. Dies kann durch Ändern der Einstellungen einer Apache-Konfigurationsdatei wie folgt außer Kraft gesetzt werden:

  1. Bearbeiten Sie die Konfigurationsdatei (zB /etc/sysconfig/httpdunter CentOS / RedHat)
  2. Diese Zeile hinzufügen oder auskommentieren: HTTPD=/usr/sbin/httpd.worker
  3. Starten Sie Apache neu

Welches MPM gerade ausgeführt wird, können Sie mit diesem Verfahren anzeigen:

  1. Aktivieren Sie Apache mod_info
  2. Fragen Sie in der Regel die URL "mod_info" ab curl localhost/server-info
  3. Im Abschnitt "Servereinstellungen" wird "MPM-Name: Worker" angezeigt.
  4. Führen Sie es httpd -Verneut aus - es wird weiterhin Prefork angezeigt, nicht Worker

Endeffekt:

  • httpd -V Zeigt die Standardoption an, nicht welche Option aktuell verwendet wird

Es gibt Antworten auf vielen, vielen Websites, httpd -Vdie angeben, ob Apache Prefork oder Worker ausführt. Sie sind alle falsch. Probieren Sie das oben beschriebene Verfahren aus, um sich selbst davon zu überzeugen.

Chris Johnson
quelle
Laut httpd.apache.org/docs/trunk/mpm.html kann MPM ein statisches Modul auf allen Plattformen sein oder als DSO (unter Unix) erstellt werden. Wenn es als statisches Modul erstellt wird, muss "der Server neu erstellt werden, um das MPM zu ändern". Ist die Apache-Dokumentation nicht korrekt, wenn das statische Modul MPM nicht geändert werden kann, es sei denn, der Server wird neu erstellt?
Steven T. Snyder
Das klingt sehr nach etwas Distributionsspezifischem mit einem Wrapper auf einer höheren Ebene?
Andol
2
Unter CentOS 6.6 / usr / sbin / httpd sind /usr/sbin/httpd.event und /usr/sbin/httpd.worker unterschiedliche Binärdateien mit unterschiedlichen MPM, die zur Kompilierungszeit konfiguriert wurden (Prefork, Event bzw. Worker). Durch Ändern der Einstellung von HTTPD in / etc / sysconfig / httpd wird nur gesteuert, welche Binärdatei vom Init-Skript ausgeführt wird.
Paul Haldane
Ich musste Apache2-V anstelle von httpd-V auf Ubuntu 16.04 LTS
cnizzardini
41

In Ubuntu 14.04

a2query -M

Sagt event, prefork,worker

Sie können es ändern, indem Sie symbolische Links für mpm_<chosen>von mods-availablebis mods-enabledin hinzufügen /etc/apache2.

Es ist immer nur einer erlaubt.

JorgeeFG
quelle
2
Dies muss die akzeptierte Antwort sein.
Ja, tolle Antwort! Einfach und gibt zurück, was benötigt wird
Flash Thunder
Hat für mich am besten funktioniert, danke (hat an Apache 2.4 gearbeitet ... sieht so aus, als würde es an Apache 2.2 nicht funktionieren)
dmikam
Das eventMPM ist nach Angaben von Apache "eine Variante des Worker-MPM mit dem Ziel, Threads nur für Verbindungen mit aktiver Verarbeitung zu verbrauchen".
Jonathan Berger
7

Starten Sie auf RedHat und Derivaten einfach topoder ps auxund sehen Sie sich den Namen des httpd-Prozesses an:

  • httpd bedeutet, dass Apache als Prefork ausgeführt wird
  • httpd.worker bedeutet, es läuft als Arbeiter
Corrado Fiore
quelle
4

Auf RHEL / Fedora / etc, führen httpd -V. Sie erhalten eine Ausgabe, die Folgendes umfasst:

Server version: Apache/2.2.21 (Unix)
     ...
Architecture:   64-bit
Server MPM:     Prefork
     ...

Hier ist "Server MPM" "Prefork", daher wird auf meinem Server das Prefork-MPM ausgeführt.

Steven T. Snyder
quelle
Diese Antwort ist falsch. Siehe meine Antwort.
Chris Johnson
@ChrisJohnson, interessante Entdeckung ... Mein Verständnis war, dass der MPM nicht durch Konfiguration, sondern nur durch Kompilierung geändert werden konnte. Es scheint, dass das OP das Gleiche dachte, da er seine Frage mit "oder technisch 'kompiliert als'" kommentierte. Ich werde versuchen, Ihre Antwort zu reproduzieren, und sobald ich sie bestätigt habe, werde ich meine widerrufen.
Steven T. Snyder
Ich habe über die Apache-Dokumentation unter httpd.apache.org/docs/trunk/mpm.html bestätigt, dass MPMs als DSO-Module erstellt und mit der LoadModule-Direktive auf "Unix und ähnlichen Plattformen" dynamisch geladen werden können. Daher kann das MPM in der Tat unter bestimmten Umständen zum Zeitpunkt des Ladens geändert werden (was heutzutage die häufigste Konfiguration sein könnte)
Steven T. Snyder
4

Chris Johnson ist richtig. Gehen Sie zu httpd.conf => fügen Sie diese Zeile hinzu:

<Location /server-info>
SetHandler server-info
</Location>

Starten Sie Apache neu: /etc/init.d/httpd restart. Greifen Sie dann mit Ihrem Browser auf localhost / server-info zu und lesen Sie den Abschnitt MPM-Name .

Songpham
quelle
Umso schöner, setzen Sie das zwischen <IfModule info_module> </ IfModule>
Lexib0y
3

Hier ist eine andere Methode, von der ich erwarte, dass sie zuverlässig ist, um festzustellen, welches MPM verwendet wird. Fügen Sie Folgendes hinzu httpd.conf:

<IfModule prefork.c>
    Header append X-MPM prefork
</IfModule>
<IfModule worker.c>
    Header append X-MPM worker
</IfModule>

Überprüfen Sie dann die Überschriften mit curl -I localhost | grep X-MPM.

Quinn Comendant
quelle
3

Auf Centos (oder Rhel) können Sie diesen Befehl ausführen:

ps -ef | grep httpd

Wenn Sie sehen /usr/sbin/httpd.worker, dass ausgeführt wird, wird das Worker-MPM verwendet. Wenn Sie /usr/sbin/httpdlaufen sehen, wird Prefork verwendet

James Turner
quelle
2

Die Antwort von Chris Johnson ist richtig.

Nach dem Aktivieren des Info-Moduls, wie in der Apache-Dokumentation ( http://httpd.apache.org/docs/2.2/mod/mod_info.html ) dokumentiert , erhalten Sie mit diesem einen Liner den MPM, den Sie verwenden:

links -dump http://localhost/server-info/?server | grep "MPM Name"
Manu
quelle
2

Eine Möglichkeit, wie ich es in Debian in Distributionen herausfinde, besteht darin, Folgendes auszuführen:

apachectl -V | grep -i mpm
Verhexen
quelle