Apache HTTP:n konfigurointi MPM-tapahtuman ja PHP-FPM:n avulla Ubuntu 18.04:ssä

Tekijä valitsi COVID-19-avustusrahaston saamaan lahjoituksen osana Write for DOnations -ohjelmaa.

Esittely

Apache HTTP -verkkopalvelin on kehittynyt vuosien varrella toimimaan erilaisissa ympäristöissä ja ratkaisemaan erilaisia tarpeita. Yksi tärkeä ongelma, joka Apache HTTP:n on ratkaistava, kuten minkä tahansa web-palvelimen, on se, miten käsitellä eri prosesseja palvelemaan http-protokollan pyyntöä. Tähän kuuluu socketin avaaminen, pyynnön käsittely, yhteyden pitäminen auki tietyn ajan, yhteyden kautta tapahtuvien uusien tapahtumien käsittely ja tietyllä kielellä (kuten PHP, Perl tai Python) tehdyn ohjelman tuottaman sisällön palauttaminen. Näitä tehtäviä suorittaa ja ohjaa moniprosessointimoduuli (Multi-Processing Module, MPM).

Apache HTTP:ssä on kolme erilaista MPM:ää:

  • Pre-fork: Jokaiselle palvelimelle saapuvalle yhteydelle luodaan uusi prosessi. Jokainen prosessi on eristetty muista, joten niiden välillä ei jaeta muistia, vaikka ne suorittaisivat identtisiä kutsuja jossain vaiheessa suoritustaan. Tämä on turvallinen tapa suorittaa sovelluksia, jotka on linkitetty kirjastoihin, jotka eivät tue säikeistystä – tyypillisesti vanhempiin sovelluksiin tai kirjastoihin.
  • Työntekijä: Vanhempiprosessi vastaa siitä, että se käynnistää joukon lapsiprosesseja, joista osa kuuntelee uusia saapuvia yhteyksiä ja osa palvelee pyydettyä sisältöä. Jokainen prosessi on säikeistetty (yksi säie voi käsitellä yhtä yhteyttä), joten yksi prosessi voi käsitellä useita pyyntöjä samanaikaisesti. Tämä yhteyksien käsittelytapa edistää resurssien parempaa käyttöä ja säilyttää samalla vakauden. Tämä on seurausta käytettävissä olevien prosessien poolista, jossa on usein vapaita käytettävissä olevia säikeitä valmiina palvelemaan välittömästi uusia yhteyksiä.
  • Tapahtuma: Workeriin perustuva tämä MPM menee askeleen pidemmälle optimoimalla, miten emoprosessi aikatauluttaa tehtäviä lapsiprosesseille ja niihin liittyville säikeille. Yhteys pysyy oletusarvoisesti auki 5 sekuntia ja sulkeutuu, jos uutta tapahtumaa ei tapahdu; tämä on keep-alive-direktiivin oletusarvo, joka säilyttää siihen liittyvän säikeen. Event MPM:n avulla prosessi voi hallita säikeitä siten, että jotkin säikeet ovat vapaita käsittelemään uusia saapuvia yhteyksiä, kun taas toiset säikeet pidetään sidottuina eläviin yhteyksiin. Kun sallitaan osoitettujen tehtävien uudelleenjako säikeille, resurssien käyttö ja suorituskyky paranevat.

Tapahtuma-MPM-moduuli on nopea moniprosessointimoduuli, joka on käytettävissä Apache HTTP -verkkopalvelimella.

PHP-FPM on FastCGI-prosessinhallinta PHP:lle. FastCGI-protokolla perustuu Common Gateway Interface (CGI) -protokollaan, joka on sovellusten ja verkkopalvelimien, kuten Apache HTTP:n, välissä. Tämä antaa kehittäjille mahdollisuuden kirjoittaa sovelluksia erillään web-palvelimien käyttäytymisestä. Ohjelmat suorittavat prosessinsa itsenäisesti ja välittävät tuotteensa web-palvelimelle tämän protokollan kautta. Jokainen uusi yhteys, jonka sovellus tarvitsee käsittelyä, luo uuden prosessin.

Yhdistämällä Apache HTTP:n MPM-tapahtuma ja PHP FastCGI-prosessinhallinta (PHP-FPM) verkkosivusto voi latautua nopeammin ja käsitellä useampia samanaikaisia yhteyksiä samalla, kun se käyttää vähemmän resursseja.

Tässä opetusohjelmassa parannetaan LAMP-pinon suorituskykyä muuttamalla oletusarvoinen moniprosessointimoduuli esihaarukasta tapahtumaprosessiksi (engl. prefork) ja käyttämällä Apache HTTP:ssä käytetyn klassisen prosessinhallintaohjelman (engl. mod_php) sijasta prosessinhallintaohjelmaa (engl. process manager), joka on tarkoitettu PHP:n PHP:n prosessinhallintaohjelmaksi.

Edellytykset

Ennen kuin aloitat tämän oppaan, tarvitset seuraavat:

  • Yksi Ubuntu 18.04 -palvelin, joka on asennettu noudattamalla Ubuntu 18.04 -palvelimen alkuasennusoppaan ohjeita, mukaan lukien sudo-käyttäjä, joka ei ole root-käyttäjä, ja palomuuri.
  • Palvelimelle asennettu LAMP-pino ohjeen How To Install Linux, Apache, MySQL, PHP (LAMP stack) on Ubuntu 18.04 mukaisesti.

Vaihe 1 – Moniprosessointimoduulin muuttaminen

Ubuntu perii skriptit Apache HTTP -moduulien ottamiseksi käyttöön tai poistamiseksi käytöstä emojakelustaan Debianista. Käytät tätä työkalupakkia tässä vaiheessa Pre-fork-moduulin poistamiseksi käytöstä ja Event-moduulin ottamiseksi käyttöön.

Tässä vaiheessa pysäytät Apache HTTP:n, poistat Pre-fork-moduuliin linkitetyn PHP 7.2-moduulin käytöstä ja poistat sitten Pre-forkin käytöstä ottaaksesi Event-moduulin välittömästi käyttöön.

Ensin pysäytät Apache HTTP -palvelun:

  • sudo systemctl stop apache2

Sitten voit poistaa käytöstä PHP 7.2-moduulin, joka liittyy Pre-fork-moduuliin:

  • sudo a2dismod php7.2

Sitten poistat käytöstä Pre-fork MPM-moduulin:

  • sudo a2dismod mpm_prefork

Nyt otat käyttöön Tapahtuma-MPM-moduulin:

  • sudo a2enmod mpm_event

Olet vaihtanut MPM:n pre-forkista tapahtumaan ja poistanut PHP 7.2-moduulin yhteyden PHP:n ja Apache HTTP:n välillä. Seuraavassa vaiheessa asennat php-fpm-moduulin sekä siihen liittyvät kirjastot ja välitysmoduulit. Määrität Apache HTTP:n niin, että se voi kommunikoida myös PHP:n kanssa.

Vaihe 2 – Apache HTTP:n määrittäminen käyttämään FastCGI-prosessinhallintaa

Tässä vaiheessa olet vaihtanut tapaa, jolla Apache HTTP käsittelee yhteyksiä siirtymällä Pre-fork MPM:stä Eventiin. Olet kuitenkin matkan varrella poistanut käytöstä PHP-moduulin, joka yhdisti Apache HTTP:n mihin tahansa PHP:llä suoritettavaan ohjelmaan.

Tässä vaiheessa asennat PHP-FPM-prosessorin, jotta Apache HTTP pystyy jälleen käsittelemään PHP-ohjelmia. Lisäksi asennat riippuvuuskirjastot ja otat moduulit käyttöön, jotta molemmat voivat tehdä yhteistyötä sujuvasti ja nopeammin kuin ennen.

Asenna ensin php-fpm. Seuraava komento asentaa PHP-FPM-paketin ja se ottaa automaattisesti käyttöön systemd:hen integroidun php7.2-fpm-palvelun, joten palvelu käynnistyy käynnistyksen yhteydessä:

  • sudo apt install php-fpm

Voidakseen kommunikoida Apache HTTP ja PHP tarvitsevat kirjaston, joka mahdollistaa tämän kapasiteetin. Asennat nyt libapache2-mod-fcgid, joka pystyy toimimaan rajapintana ohjelmien ja verkkopalvelimien välillä, ja se on spesifinen Apache HTTP:lle. Tämä kommunikointi tapahtuu UNIX socketin kautta.

Asenna tämä kirjasto:

  • sudo apt install libapache2-mod-fcgid

Olet asentanut php-fpm ja libapache2-mod-fcgid, mutta kumpikaan ei ole vielä käytössä.

Ensin ota käyttöön php-fpm-moduuli seuraavalla komennolla:

  • sudo a2enconf php7.2-fpm

Toiseksi ota käyttöön Apache HTTP:n proxy-moduuli:

  • sudo a2enmod proxy

Kolmanneksi ota käyttöön Apache HTTP:n FastCGI proxy-moduuli:

  • sudo a2enmod proxy_fcgi

Huom: Voit lukea tämän PHP-ohjelmien ja Apache HTTP:n välisen vuorovaikutuksen konfiguraation UNIX-soketin kautta seuraavasti:

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

Kaikki on nyt kunnossa, joten voit käynnistää Apache HTTP:n. Teet ensin konfiguraatiotarkastuksen:

  • sudo apachectl configtest
Output
Syntax OK

Sen jälkeen voit jatkaa Apache HTTP:n uudelleenkäynnistämistä, koska se käynnistettiin automaattisesti FastCGI-kirjaston libapache2-mod-fcgid asentamisen yhteydessä:

  • sudo systemctl restart apache2

Olet asentanut php-fpm-moduulin, konfiguroinut Apache HTTP:n toimimaan sen kanssa, ottanut käyttöön tarvittavat moduulit FastCGI-protokollan toimimiseksi ja käynnistänyt vastaavat palvelut.

Nyt kun Apache on ottanut käyttöön Event MPM -moduulin ja PHP-FPM on läsnä ja toiminnassa, on aika tarkistaa, että kaikki toimii tarkoituksenmukaisesti.

Vaihe 3 – Konfiguraation tarkistaminen

Tarkistaaksesi, että konfiguraatiomuutokset on otettu käyttöön, suoritat muutamia testejä. Ensimmäisessä tarkistetaan, mitä moniprosessointimoduulia Apache HTTP käyttää. Toisessa tarkistetaan, että PHP käyttää FPM-hallintaa.

Tarkista Apache HTTP -palvelin suorittamalla seuraava komento:

  • sudo apachectl -M | grep 'mpm'

Tulosteesi on seuraava:

Output
mpm_event_module (shared)

Voit toistaa saman proxy-moduulille ja FastCGI:lle:

  • sudo apachectl -M | grep 'proxy'

Tuloste näyttää:

Output
proxy_module (shared)proxy_fcgi_module (shared)

Jos haluat nähdä koko moduulien luettelon, voit poistaa komennon toisen osan -M jälkeen.

On nyt aika tarkistaa, käyttääkö PHP FastCGI-prosessinhallintaa. Tätä varten kirjoitat pienen PHP-skriptin, joka näyttää sinulle kaikki PHP:hen liittyvät tiedot.

Käynnistä seuraava komento kirjoittaaksesi tiedoston, jonka nimi on seuraava:

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

Lisää tiedostoon info.php seuraava sisältö:

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

Käy nyt palvelimesi URL-osoitteessa ja liitä sen loppuun info.php näin: http://your_domain/info.php.

Palvelimen API-merkintä on FPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

Poista info.php-tiedosto tämän tarkistuksen jälkeen, jotta mitään tietoja palvelimesta ei paljastu julkisuuteen:

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

Olet tarkistanut MPM-moduulin, FastCGI:tä käsittelevien moduulien ja PHP-koodin käsittelyn toimintatilan.

Loppupäätelmä

.