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:
...# 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:
...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
:
<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:
...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:
...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:
Outputmpm_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ę:
Outputproxy_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:
<?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.
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