it-swarm.com.de

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

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

Sudo apachectl -V

und waren alarmiert, als sie feststellten, dass Server MPM Prefork ist. Sie sagten nachdrücklich VERWENDEN SIE KEINE PREFORK AUF EINEM PRODUKTIONSSERVER. Wie sich herausstellt, bestehen die Ubuntu-Pakete (vermutlich von Debian geerbt?) Darauf, Apache auszuführen Prefork-Modus trotz der Tatsache, dass die empfohlene Methode zum Ausführen von PHP mit Apache eindeutig proxy_fcgi und php-fpm empfiehlt, dann fcgid und letztendlich sagt, dass Sie prefork nicht verwenden sollten:

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 auf Ereignismodus umzuschalten, und als ich versuchte, Apache wieder zu starten, wurde folgende Fehlermeldung angezeigt:

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

Auf jeden Fall habe ich mich gefragt, ob jemand einige minimale, schrittweise Anweisungen hatte, um den fastCGI-Modus unter Ubuntu 16 mit PHP 7.0 unter Verwendung der Paketinstallationsprogramme als auszuführen) so viel wie möglich. Ich schaue mir gerade 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 Jungs empfohlen).

11
S. Imp

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. [~ # ~] note [~ # ~] : 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 die Apache2-Pakete von Ubuntu 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 weiterhin mit Apache in Ereignis) zum Laufen zu bringen Modus mit PHP-FPM als empfohlen vom Apache-Wiki und ausführlicher beschrieben in Hochleistung PHP auf Apache httpd 2.4.x mit mod_proxy_fcgi und php-fpm . Die Grundidee ist, dass Apache2 und PHP-FPM über einen Socket kommunizieren und nicht PHP als Apache-Modul.

1) Entfernen oder deaktivieren Sie das Apache-Modul PHP

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 bereits PHP 7 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 und dem Pfad in dieser Direktive (/run/php/php7.0-fpm.sock ) muss mit dem Pfad übereinstimmen, der durch die Anweisung listen in der Datei /etc/php/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/FastCGI In der Ausgabe sehen.

14
S. Imp

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

Während der performanteste Weg Apache mit 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 nur 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.

6
ezra-s