V tomto článku vám řeknu, jak jsem migroval své servery se systémem Apache+PHP na Nginx+PHP-fpm, aniž bych tento proces musel zvládnout.
Scénář
[Přeskočit úvod]
V roce 2020, během prvních dnů pandemie, jsme měli setkání v rámci přípravy na nadcházející karanténu. Plán byl pokračovat v přesunu všech našich současných studentů do úplného dálkového vzdělávání. Zeptal jsem se, kolik studentů navíc bych měl očekávat, a řekli o dvojnásobku. Dále jsem navrhl pouze duplikovat hardwarové prostředky (jádra RAM a procesoru), protože:
- naštěstí mám dostatek místa – pokud jde o hardwarové zdroje – pro tento druh růstu.
- karanténa skončí za pouhé dva týdny, maximálně měsíc. Potom se naši studenti vrátí k prezentaci a já dostanu zpět tyto dodatečné zdroje.
Během prvních dvou týdnů původní karantény jsem musel stále více navyšovat hardwarové zdroje (ale ne je duplikovat) a toto řešení se ukázalo jako nedostatečné. Po prvním měsíci, kdy se zkoušky každým dnem přibližovaly a krize covid19 hrozila rozšířit až do léta, jsem musel myslet na skutečný řešení. Také toto řešení musí být provedeno s co nejmenšími prostoji … už jsme měli dost náladových pádů.
Opět mám štěstí, že mám stále k dispozici několik GB RAM a CPU jader. Nastavil jsem malý nový VM (1 jádro a 1 GB RAM) s kopií jednoho z mých produkčních nálad, abych věci testoval, dokud to nebude fungovat. Jakmile získám nastavení, která to dělají, mohl jsem provést změnu bez prostojů. Poslední změna spočívá v vypnutí apache a spuštění nginx
Instalace
Nginx
Pokud jste četli některé z mých předchozích příspěvků ve FreeBSD, preferuji porty před binárními balíčky, takže pro instalaci nginx spusťte:
# cd /usr/ports/www/nginx
# make install clean
Php-fpm
Výchozí způsob, jak spustit php kód uvnitř Apache, je povolení modulu mod_php. Neexistuje (alespoň to vím) modul pro načítání nginx pro PHP, takže musíte povolit fastCGI Process Manager. Pokud jste nainstalovali PHP s výchozími možnostmi, pravděpodobně je již máte, ale ještě jednou zkontrolujte:
[/usr/ports/www/nginx]# cd ../../lang/php74
[/usr/ports/lang/php74]# make config
Pokud FPM není vybráno, vyberte jej a spusťte:
[/usr/ports/lang/php74]# make install clean
Konfigurace
PHP-Fpm
Vytvořte, pokud neexistuje, soubor /usr/local/etc/php-fpm.d/www.conf zkopíruji www.conf.default a poté upravte:
[/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
Přejděte dolů na příslušné možnosti:
user/group
:by měl být stejný uživatel a skupina jako apache, pro mě www.listen
:protože php poskytuji pouze lokálně, používám unixový soket:/var/run/php-fpm.sock
;pm
:dynamic
je v pořádku, ale možná budete muset tento parametr upravit a vyladit. Podívejte se na komentáře v souboru.
Nakonec povolme a spusťte php-fpm:
[/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
Soubor nginx.conf může být stejně velký (nebo může být rozdělen na tolik částí) jako httpd.conf z Apache. Zvláště pokud máte několik VirtualHostů, relevantní možnosti jsou (alespoň pro mě kde):
user
:stejný uživatel jako proces Apache, například www.worker_process
:toto by mělo odpovídat počtu jader CPUclient_max_body_size
:měl by odpovídat hodnotámpost_max_size
aupload_max_size
v php.ini.root
:rovná seDocumentRoot
z vašeho VirtualHost v Apache httpd.conf, tj. /usr/local/www/- Přidejte další sekci a sdělte nginxu, jak odeslat váš php kód do služby php-fpm:
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;
}
Ostatní možnosti v příkladu souboru nginx.conf jsou do značné míry samozřejmé. Samozřejmě existuje spousta dalších věcí, které můžete vyladit, ale tohle by udělalo kouzlo.
Nakonec můžeme povolit nginx, zastavit apache a spustit nginx (v tomto pořadí by nginx mohl naslouchat na portech http/https):
# /usr/local/etc/rc.d/nginx enable
# /usr/local/etc/rc.d/apache24 stop
# /usr/local/etc/rc.d/nginx start
Pokud se něco pokazí
Všimněte si, že jsme ještě nezakázali apache. Pokud se něco pokazí, zastavte nginx a spusťte apache24, o kterém víte, že již fungoval dobře:
# /usr/local/etc/rc.d/apache24 stop ; /usr/local/etc/rc.d/nginx start
Když jste si jisti, že vše funguje podle očekávání, můžete apache deaktivovat.