Wechseln Sie Apache von Prefork zu Event in Ubuntu 16 und bringen Sie PHP 7 zum Laufen

11

Apache lief langsam in der Produktion. Nachdem ich einige Zeit nach Antworten gesucht hatte, ging ich schließlich zum # apache IRC-Kanal und die Profis ließen mich den Apache-Modus mit diesem Befehl überprüfen:

sudo apachectl -V

und wurden alarmiert zu finden , dass Server MPM ist Prefork . Sie sagten nachdrücklich, VERWENDEN SIE KEINE PREFORK AUF EINEM PRODUKTIONS-SERVER. Wie sich herausstellt, bestehen die Ubuntu-Pakete (vermutlich von Debian geerbt?) Darauf, Apache im Prefork-Modus auszuführen, obwohl die empfohlene Methode zum Ausführen von PHP mit Apache eindeutig proxy_fcgi und php-fpm empfiehlt, dann fcgid und letztendlich sagt, dass Sie dies nicht tun sollten Vorgabel verwenden:

Warum sollten Sie mod_php nicht mehr mit der Prefork mpm verwenden?

  • mod_php wird ständig in jeden httpd-Prozess geladen. Selbst wenn httpd statischen / nicht-PHP-Inhalt bereitstellt, wird dieser Speicher verwendet.
  • mod_php ist nicht threadsicher und zwingt Sie, sich an die Prefork-MPM (Multi-Prozess, keine Threads) zu halten, die die langsamstmögliche Konfiguration darstellt

Diese Seite enthält auch einige Details zu PHP-FPM, aber dies scheint etwas aufwendig und unklar zu sein und erfordert viel manuelle Konfiguration. Ich bin enttäuscht und überrascht, dass Ubuntu 16 keine Paketoption für den fastCGI-Modus oder so hat.

Ich habe versucht, Apache mit a2enmod in den Ereignismodus zu schalten , und als ich versuchte, Apache wieder zu starten, wurde folgende Fehlermeldung angezeigt:

Apache führt ein MPM mit Thread aus, aber Ihr PHP-Modul ist nicht threadsicher kompiliert. Sie müssen PHP neu kompilieren

Auf jeden Fall habe ich mich gefragt, ob jemand eine minimale, schrittweise Anleitung hat, um den fastCGI-Modus unter Ubuntu 16 mit PHP 7.0 zum Laufen zu bringen, indem er sich so weit wie möglich auf die Paketinstallationsprogramme verlässt. Ich sehe mir derzeit viele schlecht erklärte, vage Anweisungen an und mache mir Sorgen, meine Produktionsumgebung mit schlechten Entscheidungen durcheinander zu bringen.

Außerdem sollte jemand mpm-event als Tag-Option hinzufügen. Das haben die # apache IRC-Leute empfohlen.

S. Imp
quelle
Dieser letzte Fehler ist darauf zurückzuführen, dass Sie zu event gewechselt sind, aber weiterhin mod_php verwenden. Deaktiviere mod_php und wechsle zu php-fpm und es wird verschwinden. Und darf ich Nginx empfehlen?
Michael Hampton
@ MichaelHampton Der Titel sollte PHP erwähnen. Es ist nicht schwierig, Apache auf Ereignis umzustellen. Es ist schwierig, Apache auf Event umzustellen UND PHP 7 zum Laufen zu bringen.
S. Imp
1
@MichaelHampton Sie erkennen sicherlich, dass ich verwirrt bin, wie man "mod_php deaktiviert und zu php-fpm wechselt". Ist das nicht genau die Frage, die ich in meinem Beitrag stelle? Die Frage bezieht sich auch nicht auf Nginx, das einen weiteren Bereich des Lernens darstellt. Der Wechsel zu Nginx ist für dieses Projekt nicht praktikabel, da ich mit einem Team zusammenarbeite.
S. Imp
Ich habe nicht erwähnt, wie Apache-Module deaktiviert werden, da Sie gezeigt haben, dass Sie bereits wissen, wie das geht. Informationen zum Aktivieren von php-fpm finden Sie in den Antworten auf diese Frage, in Online-Tutorials usw.
Michael Hampton,

Antworten:

14

ezra-s schlägt einen guten Ansatz vor, enthält jedoch keine Details, die für Leute, die sich auf Paketmanager verlassen, verwirrend sein könnten. HINWEIS : Ich bin nicht sicher, ob diese Schritte genau sind. Wenn jemand auf Probleme stößt oder Probleme sieht, lass es mich wissen und ich werde diesen Beitrag aktualisieren.

Erstens bestehen Ubuntus Apache2-Pakete zum jetzigen Zeitpunkt auf Prefork, wenn Sie PHP installieren möchten. Verzweifeln Sie jedoch nicht, denn Sie können weiterhin Paketinstallationsprogramme verwenden, um PHP und Apache2 zu installieren und zu aktualisieren und Ihre Konfiguration mit Apache im Ereignismodus mithilfe von PHP-FPM zum Laufen zu bringen, wie vom Apache-Wiki empfohlen und ausführlicher in High- beschrieben. Leistung PHP auf Apache httpd 2.4.x mit mod_proxy_fcgi und php-fpm . Die Grundidee ist, dass Apache2 und PHP-FPM über Socket kommunizieren und nicht über PHP, das als Apache-Modul ausgeführt wird.

1) Entfernen oder deaktivieren Sie das Apache PHP-Modul

Da die Ubuntu-Pakete bei der Installation von PHP auf Prefork Apache bestehen, müssen wir sie trennen. Ich habe dazu apt verwendet, um libapache2-mod-php7.0 zu deinstallieren, da ich das Paket nicht mehr benötige:

sudo apt-get remove libapache2-mod-php7.0

Alternativ können Sie stattdessen das Apache-Modul php7.0 deaktivieren. Dadurch wird jedoch das apt-Paket nicht von Ihrem System entfernt, was zu lästigen Systemproblemen führt.

sudo a2dismod php7.0

2) Schalten Sie Apache in den Ereignismodus und aktivieren Sie fcgid

Ich glaube, diese Befehle sollten den Trick machen:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Installieren Sie PHP-FPM

Ich habe PHP 7 bereits mit seinen verschiedenen Modulen installiert, daher installiere ich PHP-FPM einfach mit diesem Befehl:

sudo apt-get install php7.0-fpm

4) Bearbeiten Sie Ihre VirtualHost-Konfiguration, um PHP-Dateien mit PHP-FPM zu verarbeiten:

In meinem Fall habe ich den Standard-SSL-Host /etc/apache2/sites-available/default-ssl.conf bearbeitet und diese Zeile ganz oben hinzugefügt:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

WICHTIG Dies weist Apache an, PHP-Dateianforderungen mit PHP-FPRM zu verarbeiten, und der Pfad in dieser Direktive ( /run/php/php7.0-fpm.sock ) muss mit dem Pfad übereinstimmen, der in der Listen- Direktive in der Datei / etc / php angegeben ist /7.0/fpm/pool.d/www.conf

5) Starten Sie Apache neu

sudo service apache2 restart

Verwenden Sie diesen Befehl, um zu überprüfen, ob der Ereignismodus aktiviert ist:

sudo apachectl -V

In der Ausgabe sollten Sie Folgendes sehen:

Server MPM:     event

Versuchen Sie, eine phpinfo-Seite zu erstellen und in Ihrem Browser darauf zuzugreifen. Sie sollten Server API: FPM/FastCGIin der Ausgabe sehen.

S. Imp
quelle
5
Ich schlage vor, ProxyPassMatch nicht zu verwenden, da es nicht erlaubt, .htaccess im Verzeichnis zu verwenden. Verwenden Sie stattdessen Folgendes: <FilesMatch \ .php $> SetHandler "Proxy: Unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </ FileMatch>
waza123
Was passiert, wenn ich diese Datei nicht berühre, anders als Sie es befohlen haben: /etc/apache2/sites-available/default-ssl.conf ,? Mein https & http beide funktionieren gut
user5858
Ich folgte der Antwort mit Ausnahme von ProxyPassMatch, fügte die Filesmatch-Zeile aus dem Kommentar von @ waza123 oben in 000-default.conf hinzu und startete apache2 neu, und alles funktioniert einwandfrei. Dank euch beiden spart mein kleiner VPS eine TONNE Speicher und CPU über mpm_prefork d
dw1
6

Distros bieten der Einfachheit halber die Methode "mod_php" an.

Während der performanteste Weg Apache w / event + mod_proxy_fcgi -> php-fpm ist.

Vielleicht sollten sie mit der Zeit upgraden, aber es ist schwierig für sie, wenn so viele Frameworks mit .htaccess mod_php-Konfigurationen in einer Art "Plug & Play" -Mode geliefert werden. Am Ende ist nur der Administrator dafür verantwortlich, die Site korrekt zu verwalten und zu konfigurieren.

Wenn Sie in der Produktion sind, würde ich vorschlagen, dass Sie einen Testserver verwenden, um das Upgrade und die Änderungen zu üben.

Über das Wiki bevorzuge ich oder würde Ihnen die "Handler" -Methode vorschlagen. https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

Das heißt, konfigurieren Sie php-fpm so, dass ein Socket bereitsteht und über genügend Berechtigungen verfügt, damit der Apache-Benutzer Anforderungen an ihn senden und Apache für die Verwendung konfigurieren kann.

Ein kurzes Beispiel:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Bearbeiten:

Auf diese Weise spielt es keine Rolle, welche PHP-Version Sie verwenden, da es Apache egal ist. Es werden lediglich die entsprechenden Anforderungen an php-fpm umgekehrt.

Vergessen Sie auch nicht, mod_php zu entladen, um mpm_event verwenden zu können.

Bearbeiten 2:

Laut Anfrage müssen Sie keine mod_php-Pakete von debian / ubuntu deinstallieren. Apache kümmert sich nur um die Konfiguration, sodass das Entladen des Moduls ausreicht.

Ezra-s
quelle
Vielen Dank für Ihre Antwort. Ich habe viel ausprobiert und dies ist der Ansatz, der derzeit zu funktionieren scheint. Der eigentliche Prozess ist etwas komplizierter, da Sie Apache von Prefork zu Event bringen, libapache2-mod-php7.0 deinstallieren usw. Ich hoffe, hier in Kürze eine vollständigere Antwort zu formulieren.
S. Imp
Sie müssen nicht vom Apache-httpd-Standpunkt aus "deinstallieren". Entladen Sie einfach das Modul. Wie bei event / prefork sind mpm auch Module in 2.4, sodass man prefork entlädt und event lädt.
Ezra-s
ok, vielleicht müssen Sie das Paket nicht deinstallieren, aber Sie müssen zumindest das PHP-Modul für Apache deaktivieren - und ich mache mir Sorgen, dass ein apt-get-Upgrade das Setup beschädigt. Diese Angaben fehlen in Ihrer Antwort. Ich würde mich freuen, wenn Sie sie hinzufügen würden, da ich nicht besonders sicher bin, ob ich die Details darüber klarstellen kann, was genau ich getan habe.
S. Imp
Vielleicht habe ich sie angenommen, Apache kümmert sich auch nicht um Debian-Pakete, sondern nur um die funktionale Konfiguration.
Ezra-s
Apache wird es interessieren, wenn ein passendes Paket-Update seine Konfiguration ändert, was ein Problem ist, auf das ich an einem Punkt gestoßen bin. Im Geiste meines ursprünglichen Beitrags möchte ich anderen, die sich wie ich auf die Paketinstallationsprogramme (und -updates) verlassen, detaillierte Anweisungen geben.
S. Imp