Apache HTTP:n konfigurointi MPM-tapahtuman ja PHP-FPM:n avulla FreeBSD 12.0:ssa
Tekijä valitsi Open Internet/Free Speech Fund -rahaston saamaan lahjoituksen osana Write for DOnations -ohjelmaa.
Esittely
Apache HTTP -verkkopalvelin on kehittynyt vuosien varrella toimimaan erilaisissa käyttö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ä käynnistetään joukko 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 uusia yhteyksiä välittömästi.
- 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 PHP:n FastCGI-prosessinhallinta. 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 Process Manager (PHP-FPM) -prosessinhallinta (PHP FastCGI Process Manager) verkkosivusto voi latautua nopeammin ja käsitellä useampia samanaikaisia yhteyksiä samalla kun se käyttää vähemmän resursseja.
Tässä opetusohjelmassa parannetaan FAMP-pinon suorituskykyä muuttamalla oletusarvoinen moniprosessointimoduuli pre-forkista tapahtumaksi ja käyttämällä PHP-FPM-prosessinhallintaa PHP-koodin käsittelyyn Apache HTTP:n klassisen mod_php
:n sijaan.
Edellytykset
Ennen kuin aloitat tämän oppaan, tarvitset seuraavat:
- FreeBSD 12.0 -palvelimen, joka on asennettu tämän oppaan mukaisesti.
- FAMP-pinon, joka on asennettu palvelimelle tämän oppaan mukaisesti.
- Käyttäjän pääsy root-oikeudet omaavalle käyttäjälle (tai se sallitaan käyttämällä sudo-toimintoa) konfiguraatiomuutosten tekemistä varten.
Vaihe 1 – Moniprosessointimoduulin muuttaminen
Aloitat etsimällä pre-fork-direktiivin httpd.conf
-tiedostosta. Tämä on Apache HTTP:n pääasetustiedosto, jossa voit ottaa moduulit käyttöön ja poistaa ne käytöstä. Voit muokata ja asettaa direktiivejä, kuten kuunteluportin, jossa Apache HTTP palvelee sisältöä, tai näytettävän sisällön sijainnin tässä tiedostossa.
Tehdäksesi nämä muutokset käytät nl
, number line, -ohjelmaa, jossa on -ba
-merkki rivien laskemiseen ja numeroimiseen, jotta mikään ei myöhemmässä vaiheessa sovi väärin. Yhdessä komennon grep
kanssa tämä komento laskee ensin kaikki polussa määritellyn tiedoston rivit, ja kun se on valmis, se etsii etsimäsi merkkijonon.
Ajoita seuraava komento, jotta nl
-ohjelma käsittelee ja numeroi httpd.conf
:n rivit. Sitten grep
käsittelee tulosteen etsimällä annettua merkkijonoa 'mod_mpm_prefork'
:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'
Tulosteena näet jotain vastaavaa kuin:
Output 67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
Muokataan riviä 67 tekstieditorilla. Tässä ohjeessa käytämme vi
, joka on FreeBSD:n oletuseditori:
- sudo vi +67 /usr/local/etc/apache24/httpd.conf
Lisäämme rivin alkuun #
-symbolin, jotta tämä rivi kommentoidaan pois, esimerkiksi näin:
...# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so...
Lisäämällä #
-symbolin poistat käytöstä pre-fork MPM-moduulin.
Nyt löydät tapahtumadirektiivin samasta httpd.conf
-tiedostosta.
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event
Näet seuraavan kaltaisen tulosteen:
Output...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Poistat nyt #
-symbolin riviltä 66 ottaaksesi Event MPM:n käyttöön:
- sudo vi +66 /usr/local/etc/apache24/httpd.conf
Direktiivi kuuluu nyt seuraavasti:
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...
Nyt kun olet vaihtanut konfiguraation MPM:n esihaarukasta tapahtumaan, voit poistaa mod_php73
-paketin, joka yhdistää PHP-prosessorin Apache HTTP:hen, koska se ei ole enää tarpeellinen ja häiritsee, jos se jää järjestelmään:
- sudo pkg remove -y mod_php73
Varmista, että konfiguraatio on oikea ajamalla seuraava komento testiksi:
- sudo apachectl configtest
Jos tulosteessa näkyy Syntax OK
, voit käynnistää Apache HTTP -palvelimen uudelleen:
- sudo apachectl restart
Huomautus: Jos palvelimellasi on muitakin käynnissä olevia HTTP-yhteyksiä, suositellaan armollista uudelleenkäynnistystä tavallisen uudelleenkäynnistyksen sijaan. Näin varmistetaan, että käyttäjiä ei työnnetä ulos, jolloin he menettävät yhteytensä:
- sudo apachectl graceful
Olet vaihtanut MPM:n pre-forkista tapahtumaan ja poistanut mod_php73
-moduulin yhteyden PHP Apache HTTP:hen. Seuraavassa vaiheessa asennat PHP-FPM-moduulin ja konfiguroit Apache HTTP:n niin, että se voi kommunikoida PHP:n kanssa nopeammin.
Vaihe 2 – Apache HTTP:n konfiguroiminen käyttämään FastCGI-prosessinhallintaa
FreeBSD:ssä on useita tuettuja PHP-versioita, jotka voit asentaa paketinhallinnan kautta. FreeBSD:ssä eri käytettävissä olevien versioiden eri binäärit käännetään sen sijaan, että käytettäisiin vain yhtä, kuten useimmat GNU/Linux-jakelut tarjoavat oletusvarastoissaan. Parhaiden käytäntöjen noudattamiseksi käytät tuettua versiota, jonka voit tarkistaa PHP:n tuetut versiot -sivulta.
Tässä vaiheessa lisäät PHP-FPM:n käynnistyksen yhteydessä käynnistyväksi palveluksi. Määrität myös Apache HTTP:n toimimaan PHP:n kanssa lisäämällä moduulille oman konfiguraation sekä ottamalla käyttöön joitakin muita moduuleja kohdassa httpd.conf
.
Aluksi lisäät 'php_fpm_enable=YES'
tiedostoon /etc/rc.conf
, jotta PHP-FPM-palvelu voi käynnistyä. Teet sen komennolla sysrc
:
- sudo sysrc php_fpm_enable="YES"
Sitten lisäät php-fpm
-moduulin Apache-moduulin hakemistoon, jotta se on konfiguroitu Apache HTTP:n käyttöön. Luo tätä varten seuraava tiedosto:
- sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf
Lisää 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>
Tässä sanotaan, että jos moduuli 'proxy_fcgi'
on käytössä sekä 'dir_module'
, niin kaikki käsitellyt tiedostot, jotka vastaavat suluissa olevia laajennuksia, tulisi käsitellä paikallisella koneella toimivan FastCGI-prosessinhallinnan avulla portin 9000
kautta – ikään kuin paikallinen kone olisi välityspalvelin. Tässä kohtaa PHP-FPM-moduuli ja Apache HTTP ovat yhteydessä toisiinsa. Tämän saavuttamiseksi aktivoit lisää moduuleja tämän vaiheen aikana.
Voidaksesi aktivoida välityspalvelinmoduulin, etsit sitä ensin tiedostosta httpd.conf
:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so
Näet seuraavan kaltaisen tulosteen:
Output...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...
Poista rivi kommentoimasta poistamalla #
-symboli:
- sudo vi +129 /usr/local/etc/apache24/httpd.conf
Rivi näyttää muokkauksen jälkeen seuraavalta:
...LoadModule proxy_module libexec/apache24/mod_proxy.so...
Nyt voit aktivoida FastCGI-moduulin. Etsi moduuli seuraavalla komennolla:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so
Näet jotain samankaltaista kuin seuraavassa:
Output...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Poista nyt kommentti riviltä 133, kuten olet jo tehnyt muiden moduulien kohdalla:
- sudo vi +133 /usr/local/etc/apache24/httpd.conf
Jättääksesi rivin seuraavasti:
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...
Kun tämä on tehty, käynnistät PHP-FPM-palvelun:
- sudo service php-fpm start
Ja käynnistät Apachen uudelleen, jotta se lataa viimeisimmät konfiguraatiomuutokset, jotka sisältävät PHP-moduulin:
- sudo apachectl restart
Olet asentanut PHP-FPM-moduulin, konfiguroinut Apache-HTTP:n niin, että se pystyy toimimaan sen kanssa, ottanut käyttöön tarvittavat moduulit FastCGI-protokollan toimimiseen 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:
Outputmpm_event_module (shared)
Voit toistaa saman proxy-moduulille ja FastCGI:lle:
- sudo apachectl -M | grep 'proxy'
Tuloste näyttää:
Outputproxy_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 hyvin pienen PHP-skriptin, joka näyttää sinulle kaikki PHP:hen liittyvät tiedot.
Kirjoita seuraavalla komennolla tiedosto, jonka nimi on seuraava:
- sudo vi /usr/local/www/apache24/data/info.php
Lisää info.php-tiedostoon seuraava sisältö:
<?php phpinfo(); ?>
Käy nyt palvelimesi URL-osoitteessa ja liitä sen loppuun info.php
näin: http://your_server_IP_address/info.php
.
Palvelimen API-merkintä on FPM/FastCGI.
Muista poistaa info.php
-tiedosto tämän tarkistuksen jälkeen, jotta mitään tietoja palvelimesta ei paljasteta julkisesti.
- sudo rm /usr/local/www/apache24/data/info.php
Olet tarkistanut MPM-moduulin, FastCGI:tä käsittelevien moduulien ja PHP-koodin käsittelyn toimintatilan.
Leave a Reply