How To Configure Apache HTTP with MPM Event and PHP-FPM on Ubuntu 18.04

Autor wybrał COVID-19 Relief Fund, aby otrzymać darowiznę w ramach programu Write for DOnations.

Wprowadzenie

Serwer WWW Apache HTTP ewoluował przez lata, aby pracować w różnych środowiskach i rozwiązywać różne potrzeby. Jednym z ważnych problemów, które Apache HTTP musi rozwiązać, tak jak każdy serwer WWW, jest sposób obsługi różnych procesów w celu obsłużenia żądania protokołu http. Wiąże się to z otwarciem gniazda, przetworzeniem żądania, utrzymaniem połączenia otwartego przez określony czas, obsługą nowych zdarzeń zachodzących przez to połączenie oraz zwróceniem treści wytworzonej przez program napisany w określonym języku (takim jak PHP, Perl czy Python). Te zadania są wykonywane i kontrolowane przez moduł wieloprocesowy (MPM).

Apache HTTP jest wyposażony w trzy różne MPM:

  • Pre-fork: Nowy proces jest tworzony dla każdego przychodzącego połączenia docierającego do serwera. Każdy proces jest odizolowany od pozostałych, więc żadna pamięć nie jest współdzielona między nimi, nawet jeśli wykonują identyczne wywołania w pewnym momencie ich wykonywania. Jest to bezpieczny sposób uruchamiania aplikacji połączonych z bibliotekami, które nie obsługują wątków – zazwyczaj są to starsze aplikacje lub biblioteki.
  • Worker: Proces nadrzędny jest odpowiedzialny za uruchomienie puli procesów-dzieci, z których część nasłuchuje nowych połączeń przychodzących, a część serwuje żądaną zawartość. Każdy proces jest wątkowy (pojedynczy wątek może obsługiwać jedno połączenie), więc jeden proces może obsługiwać kilka żądań jednocześnie. Taka metoda traktowania połączeń sprzyja lepszemu wykorzystaniu zasobów, przy jednoczesnym zachowaniu stabilności. Wynika to z puli dostępnych procesów, która często ma wolne dostępne wątki gotowe do natychmiastowej obsługi nowych połączeń.
  • Zdarzenie: Bazując na worker, ten MPM idzie o krok dalej, optymalizując sposób, w jaki proces nadrzędny rozkłada zadania na procesy dziecięce i związane z nimi wątki. Połączenie pozostaje domyślnie otwarte przez 5 sekund i zamyka się, jeśli nie wystąpi nowe zdarzenie; jest to domyślna wartość dyrektywy keep-alive, która zachowuje wątek z nim związany. Event MPM umożliwia procesowi zarządzanie wątkami w taki sposób, że niektóre wątki są wolne do obsługi nowych połączeń przychodzących, podczas gdy inne są utrzymywane związane z połączeniami na żywo. Umożliwienie redystrybucji przydzielonych zadań do wątków pozwoli na lepsze wykorzystanie zasobów i poprawę wydajności.

Moduł Event MPM jest modułem szybkiego przetwarzania wieloprocesowego dostępnym na serwerze Apache HTTP.

PHP-FPM jest menedżerem procesów FastCGI dla PHP. Protokół FastCGI jest oparty na Common Gateway Interface (CGI), protokole, który znajduje się pomiędzy aplikacjami a serwerami WWW, takimi jak Apache HTTP. Pozwala to programistom na pisanie aplikacji w oderwaniu od zachowania serwerów internetowych. Programy uruchamiają swoje procesy niezależnie i przekazują swój produkt do serwera WWW poprzez ten protokół. Każde nowe połączenie wymagające przetworzenia przez aplikację tworzy nowy proces.

Poprzez połączenie MPM Event w Apache HTTP z PHP FastCGI Process Manager (PHP-FPM) strona internetowa może ładować się szybciej i obsługiwać więcej równoczesnych połączeń przy mniejszym zużyciu zasobów.

W tym poradniku poprawisz wydajność stosu LAMP poprzez zmianę domyślnego modułu wieloprocesowego z pre-fork na event oraz poprzez użycie PHP-FPM Process Manager do obsługi kodu PHP zamiast klasycznego mod_php w Apache HTTP.

Wymagania wstępne

Zanim rozpoczniesz ten przewodnik, będziesz potrzebował następujących elementów:

  • Jeden serwer Ubuntu 18.04 skonfigurowany zgodnie z przewodnikiem wstępnej konfiguracji serwera Ubuntu 18.04, w tym użytkownika sudo non-root i zapory sieciowej.
  • Stos LAMP zainstalowany na serwerze zgodnie z How To Install Linux, Apache, MySQL, PHP (LAMP stack) on Ubuntu 18.04.

Krok 1 – Zmiana modułu wieloprocesorowego

Ubuntu dziedziczy skrypty do włączania i wyłączania modułów HTTP Apache z jego macierzystej dystrybucji, Debiana. Użyjesz tego zestawu narzędzi w tym kroku, aby wyłączyć moduł Pre-fork i włączyć moduł Event.

W tym kroku zatrzymasz Apache HTTP, wyłączysz moduł PHP 7.2 powiązany z modułem Pre-fork, a następnie wyłączysz Pre-fork, aby natychmiast włączyć moduł Event.

Najpierw zatrzymasz usługę Apache HTTP:

  • sudo systemctl stop apache2

Teraz możesz wyłączyć moduł PHP 7.2, który jest powiązany z modułem Pre-fork:

  • sudo a2dismod php7.2

Następnie wyłącz moduł Pre-fork MPM:

  • sudo a2dismod mpm_prefork

Następnie włącz moduł Event MPM:

  • sudo a2enmod mpm_event

Przekształciłeś MPM z pre-fork na event i usunąłeś moduł PHP 7.2 łączący PHP z Apache HTTP. W następnym kroku zainstalujesz moduł php-fpm, jak również powiązane z nim biblioteki i moduły proxy. Skonfigurujesz Apache HTTP tak, aby mógł komunikować się także z PHP.

Krok 2 – Konfigurowanie Apache HTTP do używania FastCGI Process Manager

Na tym etapie zmieniłeś sposób, w jaki Apache HTTP przetwarza połączenia, przechodząc z Pre-fork MPM na Event. Jednak po drodze wyłączyłeś moduł PHP, który łączył Apache HTTP z dowolnym programem działającym w PHP.

W tym kroku zainstalujesz procesor PHP-FPM, aby Apache HTTP mógł znowu przetwarzać programy PHP. Zainstalujesz również biblioteki zależności i włączysz moduły, aby obie strony mogły współpracować płynnie i szybciej niż wcześniej.

Najpierw zainstaluj php-fpm. Poniższe polecenie zainstaluje pakiet PHP-FPM i automatycznie włączy usługę php7.2-fpm zintegrowaną z systemd, dzięki czemu usługa jest uruchamiana podczas startu systemu:

  • sudo apt install php-fpm

Aby Apache HTTP i PHP mogły się komunikować, potrzebują biblioteki umożliwiającej taką możliwość. Zainstalujesz teraz libapache2-mod-fcgid, która może służyć jako interfejs między programami a serwerami WWW i jest specyficzna dla Apache HTTP. Ta komunikacja będzie się odbywać przez gniazdo UNIX.

Zainstaluj tę bibliotekę:

  • sudo apt install libapache2-mod-fcgid

Zainstalowałeś php-fpm i libapache2-mod-fcgid, ale żadna z nich nie jest jeszcze włączona.

Najpierw włącz moduł php-fpm za pomocą następującego polecenia:

  • sudo a2enconf php7.2-fpm

Po drugie włącz moduł Apache HTTP proxy:

  • sudo a2enmod proxy

Po trzecie włącz moduł FastCGI proxy w Apache HTTP:

  • sudo a2enmod proxy_fcgi

Uwaga: Możesz odczytać konfigurację tej interakcji pomiędzy programami PHP i Apache HTTP poprzez gniazdo UNIX za pomocą następującego:

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

Wszystko jest teraz na swoim miejscu, więc możesz uruchomić Apache HTTP. Najpierw wykonasz sprawdzenie konfiguracji:

  • sudo apachectl configtest
Output
Syntax OK

Po tym możesz przystąpić do ponownego uruchomienia Apache HTTP, ponieważ został on automatycznie uruchomiony podczas instalacji biblioteki FastCGI libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Zainstalowałeś moduł php-fpm, skonfigurowałeś Apache HTTP do pracy z nim, włączyłeś niezbędne moduły do działania protokołu FastCGI i uruchomiłeś odpowiednie usługi.

Gdy Apache ma już włączony moduł Event MPM, a PHP-FPM jest obecny i działa, czas sprawdzić, czy wszystko działa zgodnie z przeznaczeniem.

Krok 3 – Sprawdzanie konfiguracji

Aby sprawdzić, czy zmiany w konfiguracji zostały zastosowane, wykonasz kilka testów. Pierwszy z nich sprawdzi, jakiego modułu wieloprocesorowego używa Apache HTTP. Drugi zweryfikuje, czy PHP korzysta z menedżera FPM.

Sprawdź serwer Apache HTTP, wykonując następujące polecenie:

  • sudo apachectl -M | grep 'mpm'

Twoje dane wyjściowe będą następujące:

Output
mpm_event_module (shared)

Możesz powtórzyć to samo dla modułu proxy i FastCGI:

  • sudo apachectl -M | grep 'proxy'

Na wyjściu pojawi się:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Jeśli chcesz zobaczyć całą listę modułów, możesz usunąć drugą część polecenia po -M.

Teraz czas sprawdzić, czy PHP używa menedżera procesów FastCGI. Aby to zrobić, napiszesz mały skrypt PHP, który pokaże ci wszystkie informacje związane z PHP.

Uruchom następujące polecenie, aby napisać plik o następującej nazwie:

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

Dodaj następującą zawartość do pliku info.php:

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

Teraz odwiedź adres URL twojego serwera i dodaj info.php na końcu w taki sposób: http://your_domain/info.php.

Wpis API serwera będzie brzmiał FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Po tym sprawdzeniu usuń plik info.php, aby żadna informacja o serwerze nie została publicznie ujawniona:

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

Sprawdziłeś stan pracy modułu MPM, modułów obsługujących FastCGI oraz obsługę kodu PHP.

Wnioski

.