1) Entfernen oder deaktivieren Sie das Apache PHP-Modul

1) Entfernen oder deaktivieren Sie das Apache PHP-Modul

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

sudo apachectl -V

und waren alarmiert, als sie feststellten,Server-MPMIstVorgabelSie sagten nachdrücklichVERWENDEN SIE PREFORK NICHT AUF EINEM PRODUKTIONSSERVER.Wie sich herausstellt, bestehen die Ubuntu-Pakete (vermutlich von Debian übernommen?) darauf, Apache im Prefork-Modus auszuführen, obwohl dieempfohlene Methode zum Ausführen von PHP mit Apacheempfiehlt eindeutig proxy_fcgi und php-fpm, dann fcgid und sagt letztendlich, dass Sie prefork nicht verwenden sollten:

Warum Sie mod_php nicht mehr mit dem Prefork-MPM verwenden sollten

  • mod_php wird ständig in jeden httpd-Prozess geladen. Selbst wenn httpd statische/nicht PHP-Inhalte bereitstellt, wird dieser Speicher verwendet.
  • mod_php ist nicht threadsicher und zwingt Sie, beim Prefork-MPM (Multiprozess, keine Threads) zu bleiben, was die langsamste mögliche Konfiguration ist.

Diese Seite enthält auch einigeDetails zu PHP-FPMaber das scheint etwas kompliziert und unklar zu sein und scheint viel manuelle Konfiguration zu erfordern. Ich bin enttäuscht und überrascht, dass Ubuntu 16 keine Paketoption für den FastCGI-Modus oder so etwas hat.

Ich habe versucht, Apache umzustellen aufEreignismodusBeim Versuch, Apache erneut zu starten, habe ich a2enmod verwendet und eine Fehlermeldung erhalten:

Apache führt ein Threaded MPM 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 Schritt-für-Schritt-Anleitung hat, um den FastCGI-Modus unter Ubuntu 16 mit PHP 7.0 zum Laufen zu bringen.indem Sie sich so weit wie möglich auf die Paketinstallationsprogramme verlassen.Ich sehe mir derzeit viele schlecht erklärte und vage Anweisungen an und habe Angst, meine Produktionsumgebung durch schlechte Entscheidungen zu ruinieren.

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

Antwort1

ezra-sschlägt einen guten Ansatz vor, lässt aber einige Details vermissen, die für Leute, die auf Paketmanager angewiesen sind, verwirrend sein könnten.NOTIZ: Ich bin nicht sicher, ob diese Schritte genau sind. Wenn jemand auf Schwierigkeiten stößt oder Probleme sieht, lassen Sie es mich wissen und ich werde diesen Beitrag aktualisieren.

Erstens bestehen Ubuntus Apache2-Pakete zum Zeitpunkt des Schreibens dieses Artikels auf Prefork, wenn Sie PHP installieren möchten. Aber verzweifeln Sie nicht, denn Sie können immer noch Paketinstallationsprogramme verwenden, um PHP zu installieren und zu aktualisierenUndapache2 und trotzdem funktioniert Ihre Konfiguration mit Apache inEreignisModus mit PHP-FPM alsempfohlen vom Apache-Wikiund ausführlicher beschrieben inHochleistungs-PHP auf Apache httpd 2.4.x mit mod_proxy_fcgi und php-fpmDie Grundidee besteht darin, dass Apache2 und PHP-FPM über einen Socket kommunizieren, anstatt dass PHP als Apache-Modul ausgeführt wird.

1) Entfernen oder deaktivieren Sie das Apache PHP-Modul

Da die Ubuntu-Pakete darauf bestehen, Apache bei der Installation von PHP zu preforken, müssen wir sie trennen. Ich habe dies getan, indem ich apt verwendet habe, 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 auch das Apache-Modul php7.0 deaktivieren. Dadurch wird jedoch das Apt-Paket nicht von Ihrem System entfernt, sodass lästiger Systemmüll zurückbleibt.

sudo a2dismod php7.0

2) Apache in den Event-Modus schalten und fcgid aktivieren

Ich glaube, diese Befehle sollten funktionieren:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Installieren Sie PHP-FPM

Ich habe PHP 7 mit seinen verschiedenen Modulen bereits installiert, also 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 bearbeitet,/etc/apache2/sites-available/default-ssl.confund habe diese Zeile ganz oben hinzugefügt:

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

WICHTIGDadurch wird Apache angewiesen, PHP-Dateianforderungen mit PHP-FPRM zu verarbeiten und den Pfad in dieser Anweisung (/run/php/php7.0-fpm.sock) muss mit dem vomHörenDirektive in der Datei/etc/php/7.0/fpm/pool.d/www.conf

5) Starten Sie Apache neu

sudo service apache2 restart

Um zu überprüfen, ob der Ereignismodus aktiviert ist, verwenden Sie diesen Befehl:

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/FastCGIdie Ausgabe sehen.

Antwort2

Distributionen bieten der Einfachheit halber die Methode „mod_php“ an.

Die leistungsstärkste Methode ist Apache mit Event + mod_proxy_fcgi -> php-fpm.

Vielleicht sollten sie mit der Zeit gehen, aber es ist schwierig für sie, wenn so viele Frameworks mit .htaccess mod_php-Konfigurationen in einer Art „Plug & Play“-Modus geliefert werden. Letztendlich ist der Administrator der einzige, der für die korrekte Verwaltung und Konfiguration seiner Site verantwortlich ist.

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

Bezüglich des Wikis 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 Anfragen an ihn senden kann, und konfigurieren Sie Apache für die Verwendung.

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:

Bei diesem Verfahren spielt es keine Rolle, welche PHP-Version Sie verwenden, da Apache dies nicht interessiert und die entsprechenden Anfragen einfach per Reverse-Proxy an php-fpm weiterleitet.

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

Bearbeitung 2:

Gemäß Wunsch müssen Sie mod_php-Pakete nicht von Debian/Ubuntu deinstallieren, Apache kümmert sich nur um dessen Konfiguration, daher reicht das Entladen des Moduls aus.

verwandte Informationen