In diesem Artikel erzähle ich Ihnen, wie ich meine Server mit Apache+PHP auf Nginx+PHP-fpm migriert habe, ohne den Prozess zu beenden.
Szenario
[Einleitung überspringen]
2020 hatten wir in den ersten Tagen der Pandemie ein Treffen zur Vorbereitung auf die bevorstehende Quarantäne. Der Plan war, weiterhin alle unsere gegenwärtigen Schüler in den vollständigen Fernunterricht zu überführen. Ich habe gefragt, mit wie vielen zusätzlichen Schülern ich rechnen soll, und sie sagten über das Doppelte. Als nächstes war mein Vorschlag, nur die Hardware-Ressourcen (RAM &CPU-Kerne) zu duplizieren, weil:
- Glücklicherweise habe ich genug Platz - in Bezug auf Hardware-Ressourcen - für diese Art von Wachstum.
- Die Quarantäne wird in nur zwei Wochen, höchstens einem Monat, vorbei sein. Dann kehren unsere Schüler zur Gegenwart zurück und ich erhalte diese zusätzlichen Ressourcen zurück.
Während der ersten zwei Wochen der ursprünglichen Quarantäne musste ich die Hardwareressourcen immer weiter erhöhen (aber nicht duplizieren), und diese Lösung erwies sich als unzureichend. Nach dem ersten Monat, mit den Prüfungen, die jeden Tag näher rückten, und der Covid-19-Krise, die drohte, sich sogar bis zum Sommer auszudehnen, musste ich an eine echte denken Lösung. Auch diese Lösung muss mit möglichst geringer Ausfallzeit erfolgen … wir hatten schon genug Moodle-Abstürze.
Zum Glück habe ich noch ein paar GB RAM und CPU-Kerne zur Verfügung. Ich habe eine winzige neue VM (1 Kern und 1 GB RAM) mit einer Kopie einer meiner Produktionsstimmungen eingerichtet, um die Dinge zu testen, bis es funktioniert. Sobald ich die entsprechenden Einstellungen habe, kann ich die Änderung ohne Ausfallzeiten vornehmen. Die letzte Änderung besteht darin, Apache herunterzufahren und nginx zu starten
Die Installation
Nginx
Wenn Sie einige meiner vorherigen Posts in FreeBSD gelesen haben, bevorzuge ich die Ports gegenüber den Binärpaketen, also führen Sie zur Installation von nginx Folgendes aus:
# cd /usr/ports/www/nginx
# make install clean

Php-fpm
Die Standardmethode zum Ausführen von PHP-Code in Apache ist die Aktivierung des Moduls mod_php. Es gibt (zumindest soweit ich weiß) kein ladbares Nginx-Modul für PHP, daher müssen Sie den fastCGI Process Manager aktivieren. Wenn Sie PHP mit den Standardoptionen installiert haben, haben Sie es wahrscheinlich bereits, aber überprüfen Sie es noch einmal:
[/usr/ports/www/nginx]# cd ../../lang/php74
[/usr/ports/lang/php74]# make config

Wenn FPM nicht ausgewählt ist, wählen Sie es aus und führen Sie dann Folgendes aus:
[/usr/ports/lang/php74]# make install clean
Die Konfiguration
PHP-Fpm
Erstellen Sie, falls nicht vorhanden, die Datei /usr/local/etc/php-fpm.d/www.conf, indem Sie www.conf.default kopieren, und bearbeiten Sie dann:
[/usr/ports/lang/php74]# cd /usr/local/etc/php-fpm.d/
[/usr/local/etc/php-fpm.d/]# cp www.conf.default www.conf
[/usr/local/etc/php-fpm.d/]# ee www.conf
Scrollen Sie nach unten zu den relevanten Optionen:
user/group
:sollte der gleiche Benutzer und die gleiche Gruppe sein wie Apache, www für mich.listen
:Da ich PHP nur lokal bereitstelle, verwende ich einen Unix-Socket:/var/run/php-fpm.sock
;pm
:dynamic
ist in Ordnung, aber Sie müssen diesen Parameter möglicherweise optimieren und optimieren. Sehen Sie sich die Kommentare in der Datei an.
Lassen Sie uns schließlich php-fpm aktivieren und starten:
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm enable
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm start
Nginx
Die nginx.conf-Datei könnte so groß sein (oder in so viele Teile aufgeteilt worden sein wie) wie die httpd.conf von Apache. Insbesondere wenn Sie mehrere VirtualHosts haben, sind die relevanten Optionen (zumindest für mich wo) :
user
:derselbe Benutzer wie der Apache-Prozess, zum Beispiel www.worker_process
:Dies sollte der Anzahl der CPU-Kerne entsprechenclient_max_body_size
:sollte mit den Werten vonpost_max_size
übereinstimmen undupload_max_size
in php.ini.root
:entsprichtDocumentRoot
von Ihrem VirtualHost in Apache httpd.conf, also /usr/local/www/- Fügen Sie den nächsten Abschnitt hinzu, um nginx mitzuteilen, wie es Ihren PHP-Code an den php-fpm-Dienst senden soll:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 120;
fastcgi_send_timeout 120;
}
Die anderen Optionen in der Beispieldatei nginx.conf sind ziemlich selbsterklärend. Natürlich gibt es viele andere Dinge, die Sie optimieren können, aber das würde den Zauber vollbringen.
Schließlich können wir nginx aktivieren, Apache stoppen und nginx starten (in dieser Reihenfolge oder nginx wäre in der Lage, http/https-Ports abzuhören):
# /usr/local/etc/rc.d/nginx enable
# /usr/local/etc/rc.d/apache24 stop
# /usr/local/etc/rc.d/nginx start
Wenn etwas schief geht
Beachten Sie, dass wir Apache noch nicht deaktiviert haben. Wenn etwas schief geht, stoppen Sie einfach nginx und starten Sie Apache24, damit Sie wissen, dass es bereits gut funktioniert hat:
# /usr/local/etc/rc.d/apache24 stop ; /usr/local/etc/rc.d/nginx start
Wenn Sie sicher sind, dass alles wie erwartet funktioniert, können Sie Apache deaktivieren.