Jak nakonfigurovat Apache HTTP s MPM Event a PHP-FPM v Ubuntu 18.04

Autor vybral v rámci programu Write for DOnations nadační fond COVID-19.

Úvod

Webový server Apache HTTP se v průběhu let vyvíjel tak, aby fungoval v různých prostředích a řešil různé potřeby. Jedním z důležitých problémů, které musí Apache HTTP řešit, stejně jako každý webový server, je, jak zpracovat různé procesy pro obsluhu požadavku protokolu http. To zahrnuje otevření socketu, zpracování požadavku, udržování spojení otevřeného po určitou dobu, zpracování nových událostí, které se vyskytnou prostřednictvím tohoto spojení, a vrácení obsahu vytvořeného programem vytvořeným v určitém jazyce (například PHP, Perl nebo Python). Tyto úlohy provádí a řídí modul MPM (Multi-Processing Module).

Apache HTTP se dodává se třemi různými MPM:

  • Pre-fork: Pro každé příchozí spojení, které dorazí na server, je vytvořen nový proces. Každý proces je izolován od ostatních, takže mezi nimi není sdílena žádná paměť, i když v určitém okamžiku svého provádění provádějí totožná volání. Jedná se o bezpečný způsob spouštění aplikací propojených s knihovnami, které nepodporují vlákna – typicky starší aplikace nebo knihovny.
  • Worker: Nadřazený proces je zodpovědný za spuštění skupiny podřízených procesů, z nichž některé naslouchají novým příchozím spojením a jiné obsluhují požadovaný obsah. Každý proces je vláknový (jedno vlákno může zpracovávat jedno spojení), takže jeden proces může zpracovávat několik požadavků současně. Tento způsob zacházení s připojeními podporuje lepší využití prostředků při zachování stability. Je to důsledek fondu dostupných procesů, který má často volná dostupná vlákna připravená okamžitě obsloužit nová připojení.
  • Událost: Na základě workeru jde tento MPM ještě o krok dále tím, že optimalizuje způsob, jakým nadřazený proces plánuje úlohy podřízeným procesům a s nimi spojeným vláknům. Spojení zůstává ve výchozím nastavení otevřené po dobu 5 sekund a uzavře se, pokud nenastane žádná nová událost; to je výchozí hodnota směrnice keep-alive, která zachovává přidružené vlákno. MPM událostí umožňuje procesu spravovat vlákna tak, že některá vlákna jsou volná pro zpracování nových příchozích spojení, zatímco jiná zůstávají vázána na živá spojení. Umožnění přerozdělování přidělených úloh vláknům umožní lepší využití prostředků a výkon.

Modul Event MPM je rychlý víceprocesorový modul dostupný na webovém serveru Apache HTTP.

PHP-FPM je správce procesů FastCGI pro PHP. Protokol FastCGI je založen na Common Gateway Interface (CGI), protokolu, který se nachází mezi aplikacemi a webovými servery, jako je Apache HTTP. To umožňuje vývojářům psát aplikace odděleně od chování webových serverů. Programy spouštějí své procesy nezávisle a prostřednictvím tohoto protokolu předávají svůj produkt webovému serveru. Každé nové spojení, které aplikace potřebuje zpracovat, vytvoří nový proces.

Kombinací události MPM v Apache HTTP se správcem procesů PHP FastCGI (PHP-FPM) se webové stránky mohou načítat rychleji a zvládnout více souběžných spojení při použití menšího množství prostředků.

V tomto kurzu zlepšíte výkon zásobníku LAMP změnou výchozího modulu více zpracování z pre-fork na event a použitím správce procesů PHP-FPM pro zpracování kódu PHP místo klasického mod_php v Apache HTTP.

Předpoklady

Před zahájením této příručky budete potřebovat následující:

  • Jeden server Ubuntu 18.04 nastavený podle příručky Počáteční nastavení serveru Ubuntu 18.04, včetně uživatele sudo bez roota a firewallu.
  • Soubor LAMP nainstalovaný na serveru podle návodu Jak nainstalovat Linux, Apache, MySQL, PHP (soubor LAMP) v Ubuntu 18.04.

Krok 1 – Změna modulu Multi-Processing

Ubuntu zdědilo skripty pro povolení nebo zakázání modulů Apache HTTP od své mateřské distribuce Debian. V tomto kroku použijete tuto sadu nástrojů k zakázání modulu Pre-fork a povolení modulu Event.

V tomto kroku zastavíte Apache HTTP, zakážete modul PHP 7.2 propojený s modulem Pre-fork a poté zakážete Pre-fork, abyste okamžitě povolili modul Event.

Nejprve zastavíte službu Apache HTTP:

  • sudo systemctl stop apache2

Teď můžete zakázat modul PHP 7.2, který souvisí s modulem Pre-fork:

  • sudo a2dismod php7.2

Poté zakážete modul Pre-fork MPM:

  • sudo a2dismod mpm_prefork

Nyní povolte modul MPM pro události:

  • sudo a2enmod mpm_event

Přepnuli jste modul MPM z prefork na event a odstranili spojení modulu PHP 7.2 mezi PHP a Apache HTTP. V dalším kroku nainstalujete modul php-fpm a také související knihovny a moduly proxy. Nakonfigurujete Apache HTTP tak, aby mohl komunikovat i s PHP.

Krok 2 – Konfigurace Apache HTTP pro použití správce procesů FastCGI

V této fázi jste změnili způsob zpracování spojení Apache HTTP přechodem z MPM Pre-fork na Event. Cestou jste však zakázali modul PHP, který propojoval Apache HTTP s jakýmkoli programem běžícím na PHP.

V tomto kroku nainstalujete procesor PHP-FPM, takže Apache HTTP bude opět schopen zpracovávat programy PHP. A také nainstalujete knihovny závislostí a povolíte moduly, aby oba mohly spolupracovat hladce a rychleji než dříve.

Nejprve nainstalujte php-fpm. Následující příkaz nainstaluje balíček PHP-FPM a automaticky povolí službu php7.2-fpm integrovanou se systemd, takže se služba spustí při startu systému:

  • sudo apt install php-fpm

Pro komunikaci potřebují Apache HTTP a PHP knihovnu umožňující tuto schopnost. Nyní nainstalujete knihovnu libapache2-mod-fcgid, která je schopna sloužit jako rozhraní mezi programy s webovými servery a je specifická pro Apache HTTP. Tato komunikace bude probíhat prostřednictvím socketu UNIX.

Instalace této knihovny:

  • sudo apt install libapache2-mod-fcgid

Nainstalovali jste knihovny php-fpm a libapache2-mod-fcgid, ale ani jedna z nich ještě není povolena.

Nejprve povolte modul php-fpm následujícím příkazem:

  • sudo a2enconf php7.2-fpm

Druhé povolte modul Apache HTTP proxy:

  • sudo a2enmod proxy

Třetí povolte modul FastCGI proxy v Apache HTTP:

  • sudo a2enmod proxy_fcgi

Pozn: Konfiguraci této interakce mezi programy PHP a Apache HTTP přes UNIXový socket si můžete přečíst pomocí následujícího:

  • cat /etc/apache2/conf-enabled/php7.2-fpm.conf

Vše je nyní připraveno, takže můžete spustit Apache HTTP. Nejprve provedete kontrolu konfigurace:

  • sudo apachectl configtest
Output
Syntax OK

Poté můžete přistoupit k restartování protokolu Apache HTTP, protože byl automaticky spuštěn při instalaci knihovny FastCGI libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Nainstalovali jste modul php-fpm, nakonfigurovali Apache HTTP pro práci s ním, povolili moduly potřebné pro fungování protokolu FastCGI a spustili příslušné služby.

Teď, když má Apache povolen modul Event MPM a PHP-FPM je přítomen a spuštěn, je čas zkontrolovat, zda vše funguje, jak má.

Krok 3 – Kontrola konfigurace

Pro kontrolu, zda byly změny konfigurace použity, provedete několik testů. První z nich zkontroluje, jaký víceprocesorový modul Apache HTTP používá. Druhý ověří, zda PHP používá správce FPM.

Server Apache HTTP zkontrolujete spuštěním následujícího příkazu:

  • sudo apachectl -M | grep 'mpm'

Výstup bude následující:

Output
mpm_event_module (shared)

Též můžete zopakovat pro modul proxy a FastCGI:

  • sudo apachectl -M | grep 'proxy'

Výstup bude vypadat takto:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Pokud chcete vidět celý seznam modulů, můžete odstranit druhou část příkazu za -M.

Nyní je čas zkontrolovat, zda PHP používá správce procesů FastCGI. K tomu si napíšete malý skript PHP, který vám zobrazí všechny informace týkající se PHP.

Spusťte následující příkaz, který zapíše soubor s následujícím názvem:

  • sudo nano /var/www/your_domain/info.php

Do souboru info.php přidejte následující obsah:

info.php
<?php phpinfo(); ?>

Nyní navštivte adresu URL svého serveru a na konec připojte info.php takto: http://your_domain/info.php.

Zápis API serveru bude FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Po této kontrole odstraňte soubor info.php, aby nebyly zveřejněny žádné informace o serveru:

  • sudo rm /var/www/yourdomain.com/info.php

Zkontrolovali jste funkčnost modulu MPM, modulů obsluhujících FastCGI a zpracování kódu PHP.

Závěr

.