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.
quelle
Antworten:
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:
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.
2) Schalten Sie Apache in den Ereignismodus und aktivieren Sie fcgid
Ich glaube, diese Befehle sollten den Trick machen:
3) Installieren Sie PHP-FPM
Ich habe PHP 7 bereits mit seinen verschiedenen Modulen installiert, daher installiere ich PHP-FPM einfach mit diesem Befehl:
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:
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
Verwenden Sie diesen Befehl, um zu überprüfen, ob der Ereignismodus aktiviert ist:
In der Ausgabe sollten Sie Folgendes sehen:
Versuchen Sie, eine phpinfo-Seite zu erstellen und in Ihrem Browser darauf zuzugreifen. Sie sollten
Server API: FPM/FastCGI
in der Ausgabe sehen.quelle
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:
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.
quelle