Cum se configurează Apache HTTP cu MPM Event și PHP-FPM pe Ubuntu 18.04

Autorul a selectat Fondul de ajutorare COVID-19 pentru a primi o donație ca parte a programului Write for DOnations.

Introducere

Serverul web Apache HTTP a evoluat de-a lungul anilor pentru a funcționa în diferite medii și pentru a rezolva diferite nevoi. O problemă importantă pe care Apache HTTP trebuie să o rezolve, ca orice server web, este cum să gestioneze diferite procese pentru a servi o cerere de protocol http. Acest lucru implică deschiderea unui socket, procesarea cererii, menținerea conexiunii deschise pentru o anumită perioadă, gestionarea evenimentelor noi care apar prin acea conexiune și returnarea conținutului produs de un program realizat într-un anumit limbaj (cum ar fi PHP, Perl sau Python). Aceste sarcini sunt efectuate și controlate de un modul de procesare multiplă (MPM).

Apache HTTP vine cu trei MPM-uri diferite:

  • Pre-fork: Un nou proces este creat pentru fiecare conexiune de intrare care ajunge pe server. Fiecare proces este izolat de celelalte, astfel încât nicio memorie nu este partajată între ele, chiar dacă ele efectuează apeluri identice la un moment dat în execuția lor. Aceasta este o modalitate sigură de a rula aplicații legate de biblioteci care nu acceptă threading – de obicei aplicații sau biblioteci mai vechi.
  • Worker: Un proces părinte este responsabil pentru lansarea unui grup de procese copil, dintre care unele ascultă pentru noi conexiuni primite, iar altele servesc conținutul solicitat. Fiecare proces este filetat (un singur fir poate gestiona o singură conexiune), astfel încât un proces poate gestiona mai multe cereri simultan. Această metodă de tratare a conexiunilor încurajează o mai bună utilizare a resurselor, menținând în același timp stabilitatea. Acest lucru este un rezultat al fondului de procese disponibile, care are adesea fire libere disponibile, gata să servească imediat noile conexiuni.
  • Eveniment: Bazat pe worker, acest MPM merge cu un pas mai departe prin optimizarea modului în care procesul părinte programează sarcinile către procesele copil și firele asociate acestora. În mod implicit, o conexiune rămâne deschisă timp de 5 secunde și se închide dacă nu apare niciun eveniment nou; aceasta este valoarea implicită a directivei keep-alive, care păstrează firul asociat acesteia. Event MPM permite procesului să gestioneze fire de execuție, astfel încât unele fire de execuție să fie libere pentru a gestiona noile conexiuni primite, în timp ce altele sunt păstrate legate de conexiunile active. Permițând redistribuirea sarcinilor atribuite firelor de execuție va permite o mai bună utilizare a resurselor și o mai bună performanță.

Modul Event MPM este un modul de multiprocesare rapidă disponibil pe serverul web Apache HTTP.

PHP-FPM este FastCGI Process Manager pentru PHP. Protocolul FastCGI se bazează pe Common Gateway Interface (CGI), un protocol care se află între aplicații și serverele web precum Apache HTTP. Acest lucru permite dezvoltatorilor să scrie aplicații separat de comportamentul serverelor web. Programele își execută procesele în mod independent și transmit produsul lor către serverul web prin intermediul acestui protocol. Fiecare nouă conexiune care are nevoie de procesare de către o aplicație va crea un nou proces.

Prin combinarea evenimentului MPM din Apache HTTP cu managerul de proces PHP FastCGI (PHP-FPM) un site web se poate încărca mai repede și poate gestiona mai multe conexiuni concurente, utilizând în același timp mai puține resurse.

În acest tutorial veți îmbunătăți performanța stivei LAMP prin schimbarea modulului implicit de procesare multiplă de la pre-fork la event și prin utilizarea managerului de proces PHP-FPM pentru a gestiona codul PHP în locul clasicului mod_php din Apache HTTP.

Precondiții

Înainte de a începe acest ghid veți avea nevoie de următoarele:

  • Un server Ubuntu 18.04 configurat urmând ghidul de configurare inițială a serverului Ubuntu 18.04, inclusiv un utilizator sudo non-root și un firewall.
  • Stacheta LAMP instalată pe serverul dvs. urmând How To Install Linux, Apache, MySQL, PHP (LAMP stack) pe Ubuntu 18.04.

Pasul 1 – Schimbarea modulului de procesare multiplă

Ubuntu moștenește scripturile de activare sau dezactivare a modulelor Apache HTTP de la distribuția sa mamă, Debian. Veți folosi acest set de instrumente în acest pas pentru a dezactiva modulul Pre-fork și a activa modulul Event.

În acest pas veți opri Apache HTTP, veți dezactiva modulul PHP 7.2 legat de modulul Pre-fork și apoi veți dezactiva Pre-fork pentru a activa imediat modulul Event.

În primul rând veți opri serviciul Apache HTTP:

  • sudo systemctl stop apache2

Acum puteți dezactiva modulul PHP 7.2, care este legat de modulul Pre-fork:

  • sudo a2dismod php7.2

Apoi dezactivați modulul Pre-fork MPM:

  • sudo a2dismod mpm_prefork

Activați acum modulul Event MPM:

  • sudo a2enmod mpm_event

Ați trecut MPM de la pre-fork la event și ați eliminat conexiunea modulului PHP 7.2 dintre PHP și Apache HTTP. În pasul următor veți instala modulul php-fpm, precum și bibliotecile aferente și modulele proxy. Veți configura Apache HTTP astfel încât să poată comunica și cu PHP.

Etapa 2 – Configurarea Apache HTTP pentru a utiliza FastCGI Process Manager

În această etapă ați schimbat modul în care Apache HTTP procesează conexiunile, trecând de la MPM Pre-fork la Event. Totuși, pe parcurs ați dezactivat modulul PHP care conecta Apache HTTP cu orice program care rulează pe PHP.

În această etapă veți instala procesorul PHP-FPM astfel încât Apache HTTP să fie din nou capabil să proceseze programe PHP. Și, de asemenea, veți instala bibliotecile de dependență și veți activa modulele astfel încât ambele să poată coopera fără probleme și mai rapid decât înainte.

Primul lucru pe care îl veți face este să instalați php-fpm. Următoarea comandă va instala pachetul PHP-FPM și va activa automat serviciul php7.2-fpm integrat cu systemd, astfel încât serviciul să fie pornit la pornire:

  • sudo apt install php-fpm

Pentru a comunica, Apache HTTP și PHP au nevoie de o bibliotecă care să permită această capacitate. Veți instala acum libapache2-mod-fcgid, care este capabilă să servească drept interfață între programele cu serverele web, și este specifică Apache HTTP. Această comunicare se va realiza prin intermediul unui socket UNIX.

Instalați această bibliotecă:

  • sudo apt install libapache2-mod-fcgid

Ați instalat php-fpm și libapache2-mod-fcgid, dar niciuna dintre ele nu este încă activată.

În primul rând activați modulul php-fpm cu următoarea comandă:

  • sudo a2enconf php7.2-fpm

În al doilea rând activați modulul Apache HTTP proxy:

  • sudo a2enmod proxy

În al treilea rând activați modulul FastCGI proxy în Apache HTTP:

  • sudo a2enmod proxy_fcgi

Note: Puteți citi configurația acestei interacțiuni între programele PHP și Apache HTTP prin intermediul unui socket UNIX cu următoarele:

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

Toate lucrurile sunt acum la locul lor, astfel încât puteți porni Apache HTTP. Veți face mai întâi o verificare a configurației:

  • sudo apachectl configtest
Output
Syntax OK

După aceasta puteți trece la repornirea Apache HTTP, deoarece acesta a fost pornit automat la instalarea bibliotecii FastCGI libapache2-mod-fcgid:

  • sudo systemctl restart apache2

Ați instalat modulul php-fpm, ați configurat Apache HTTP pentru a lucra cu acesta, ați activat modulele necesare pentru ca protocolul FastCGI să funcționeze și ați pornit serviciile corespunzătoare.

Acum că Apache are modulul Event MPM activat și PHP-FPM este prezent și funcționează, este timpul să verificați dacă totul funcționează așa cum a fost prevăzut.

Etapa 3 – Verificarea configurației

Pentru a verifica dacă modificările de configurare au fost aplicate, veți rula câteva teste. Primul va verifica ce modul de multiprocesare folosește Apache HTTP. Al doilea va verifica dacă PHP folosește managerul FPM.

Verificați serverul Apache HTTP prin rularea următoarei comenzi:

  • sudo apachectl -M | grep 'mpm'

Salitul dvs. va fi următorul:

Output
mpm_event_module (shared)

Puteți repeta același lucru pentru modulul proxy și FastCGI:

  • sudo apachectl -M | grep 'proxy'

Lovitura va arăta:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Dacă doriți să vedeți întreaga listă de module, puteți elimina a doua parte a comenzii după -M.

Acum este timpul să verificăm dacă PHP folosește FastCGI Process Manager. Pentru a face acest lucru veți scrie un mic script PHP care vă va arăta toate informațiile legate de PHP.

Executați următoarea comandă pentru a scrie un fișier numit astfel:

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

Adaugați următorul conținut în fișierul info.php:

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

Acum vizitați URL-ul serverului dvs. și adăugați info.php la sfârșit astfel: info.php: http://your_domain/info.php.

Intrarea API a serverului va fi FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Ștergeți fișierul info.php după această verificare, astfel încât nici o informație despre server să nu fie dezvăluită public:

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

Ați verificat starea de funcționare a modulului MPM, a modulelor care gestionează FastCGI și a gestionării codului PHP.

Concluzie

.