How To Configure Apache HTTP with MPM Event and PHP-FPM on FreeBSD 12.0

Autor wybrał Open Internet/Free Speech 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). Zadania te 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 posiada 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.

Dzięki połączeniu 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 tutorialu poprawisz wydajność stosu FAMP poprzez zmianę domyślnego modułu wieloprocesowego z pre-fork na event oraz poprzez użycie menedżera procesów PHP-FPM do obsługi kodu PHP zamiast klasycznego mod_php w Apache HTTP.

Wymagania wstępne

Przed rozpoczęciem tego przewodnika będziesz potrzebował następujących elementów:

  • Serwer FreeBSD 12.0 skonfigurowany zgodnie z tym przewodnikiem.
  • Stos FAMP zainstalowany na twoim serwerze zgodnie z tym przewodnikiem.
  • Dostęp do użytkownika z uprawnieniami roota (lub dozwolony przez użycie sudo) w celu dokonania zmian w konfiguracji.

Krok 1 – Zmiana modułu wieloprocesorowego

Zaczniemy od znalezienia dyrektywy pre-fork w pliku httpd.conf. Jest to główny plik konfiguracyjny dla Apache HTTP, w którym możesz włączać i wyłączać moduły. Możesz edytować i ustawiać dyrektywy, takie jak port nasłuchiwania, na którym Apache HTTP będzie serwować zawartość, lub lokalizacja zawartości do wyświetlenia w tym pliku.

Aby dokonać tych zmian, użyjesz programu nl, number line, z flagą -ba do liczenia i numerowania linii, aby nic nie było niedopasowane na późniejszym etapie. W połączeniu z grep polecenie to najpierw policzy wszystkie linie w pliku podanym w ścieżce, a po zakończeniu poszuka szukanego ciągu znaków.

Uruchom następujące polecenie, aby program nl przetworzył i ponumerował linie w pliku httpd.conf. Następnie program grep przetworzy dane wyjściowe, wyszukując podany ciąg znaków 'mod_mpm_prefork':

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'

Jako dane wyjściowe zobaczysz coś podobnego do:

Output
67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

Wyedytujmy wiersz 67 za pomocą edytora tekstu. W tym tutorialu użyjesz vi, który jest domyślnym edytorem na FreeBSD:

  • sudo vi +67 /usr/local/etc/apache24/httpd.conf

Dodaj symbol # na początku linii, aby ta linia została wykomentowana, tak jak poniżej:

/usr/local/etc/apache24/httpd.conf
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...

Dopisując symbol # wyłączyłeś moduł pre-fork MPM.

Teraz znajdziesz dyrektywę eventową w tym samym pliku httpd.conf.

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event

Zobaczysz dane wyjściowe podobne do poniższych:

Output
...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Teraz usuniesz symbol # w linii 66, aby włączyć moduł Event MPM:

  • sudo vi +66 /usr/local/etc/apache24/httpd.conf

Dyrektywa będzie teraz wyglądać następująco:

/usr/local/etc/apache24/httpd.conf
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

Teraz, gdy przełączyłeś konfigurację z pre-fork MPM na event, możesz usunąć pakiet mod_php73 łączący procesor PHP z Apache HTTP, ponieważ nie jest on już potrzebny i będzie przeszkadzał, jeśli pozostanie w systemie:

  • sudo pkg remove -y mod_php73

Upewnij się, że konfiguracja jest poprawna, uruchamiając następujące polecenie w celu przetestowania:

  • sudo apachectl configtest

Jeśli na wyjściu widzisz Syntax OK, możesz zrestartować serwer Apache HTTP:

  • sudo apachectl restart

Uwaga: Jeśli na twoim serwerze są inne działające połączenia HTTP, zalecany jest restart z zachowaniem wdzięku zamiast zwykłego restartu. Zapewni to, że użytkownicy nie zostaną wypchnięci, tracąc swoje połączenie:

  • sudo apachectl graceful

Przełączyłeś MPM z pre-fork na event i usunąłeś mod_php73 moduł łączący PHP z Apache HTTP. W następnym kroku zainstalujesz moduł PHP-FPM i skonfigurujesz Apache HTTP tak, aby mógł szybciej komunikować się z PHP.

Krok 2 – Konfiguracja Apache HTTP do użycia menedżera procesów FastCGI

FreeBSD posiada kilka wspieranych wersji PHP, które możesz zainstalować poprzez menedżera pakietów. Na FreeBSD różne binaria różnych dostępnych wersji są kompilowane, zamiast używać tylko jednej, jak większość dystrybucji GNU/Linuksa w swoich domyślnych repozytoriach. W tym kroku dodasz PHP-FPM jako działającą usługę, która będzie uruchamiana przy starcie systemu. Skonfigurujesz także Apache HTTP do współpracy z PHP, dodając dedykowaną konfigurację dla tego modułu, a także włączając kilka innych modułów w httpd.conf.

Najpierw dodasz 'php_fpm_enable=YES' do pliku /etc/rc.conf, aby usługa PHP-FPM mogła się uruchomić. Zrobisz to za pomocą polecenia sysrc:

  • sudo sysrc php_fpm_enable="YES"

Następnie dodasz moduł php-fpm do katalogu modułów Apache, aby był on skonfigurowany do użycia przez Apache HTTP. W tym celu utwórz następujący plik:

  • sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf

Dodaj następujące elementy do 030_php-fpm.conf:

/usr/local/etc/apache24/modules.d/030_php-fpm.conf
<IfModule proxy_fcgi_module> <IfModule dir_module> DirectoryIndex index.php </IfModule> <FilesMatch "\.(php|phtml|inc)$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch></IfModule>

To stwierdza, że jeśli moduł 'proxy_fcgi' jest włączony, jak również 'dir_module', to wszelkie przetwarzane pliki pasujące do rozszerzeń w nawiasach powinny być obsługiwane przez menedżera procesów FastCGI działającego na lokalnej maszynie przez port 9000-jakby lokalna maszyna była serwerem proxy. W tym miejscu moduł PHP-FPM i Apache HTTP łączą się ze sobą. Aby to osiągnąć, w tym kroku aktywujemy kolejne moduły.

Aby włączyć moduł proxy, musisz najpierw wyszukać go w pliku httpd.conf:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so

Zobaczysz wynik podobny do poniższego:

Output
...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...

Odkomentujesz linię, usuwając symbol #:

  • sudo vi +129 /usr/local/etc/apache24/httpd.conf

Po edycji linia będzie wyglądać następująco:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_module libexec/apache24/mod_proxy.so...

Teraz możesz aktywować moduł FastCGI. Znajdź moduł za pomocą następującej komendy:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so

Zobaczysz coś podobnego do poniższego:

Output
...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Następnie odkomentuj linię 133, tak jak to już zrobiłeś z innymi modułami:

  • sudo vi +133 /usr/local/etc/apache24/httpd.conf

Zostawiasz linię w następującym stanie:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

Kiedy to zrobisz, uruchomisz usługę PHP-FPM:

  • sudo service php-fpm start

I zrestartujesz Apache’a, aby załadował najnowsze zmiany w konfiguracji zawierające moduł PHP:

  • sudo apachectl restart

Zainstalowałeś moduł PHP-FPM, skonfigurowałeś Apache HTTP do współpracy z nim, włączyłeś moduły niezbędne 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. W tym celu napiszesz bardzo 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 vi /usr/local/www/apache24/data/info.php

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

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

Teraz odwiedź adres URL twojego serwera i dołącz info.php na końcu w taki sposób: http://your_server_IP_address/info.php.

Wpisem Server API będzie FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Pamiętaj, aby po tym sprawdzeniu usunąć plik info.php, aby żadne informacje o serwerze nie zostały publicznie ujawnione.

  • sudo rm /usr/local/www/apache24/data/info.php

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

Wnioski

.

Leave a Reply