Ülevaade
ZFPM (Zone FastCGI Process Manager) on Zone Media poolt väljatöötatud tarkvaraprodukt, mille missiooniks on pakkuda virtuaalserveri keskkondades automatiseeritud, skaleeruvat ja turvalist võimalust jooksutada FastCGI protokollil põhinevaid rakendusi.
ZFPM on eeskätt PHP rakendustele mõeldud protsessihaldur, kuid ta saab vajadusel kenasti hakkama ka teiste FastCGI rakendustega (nt. Ruby On Rails, Django).
Kuna jagatud keskkonnas on meie esimeseks prioriteediks turvalisus, siis ei ole mõeldav käitada rakendusi veebiserveri õigustes nagu mod_php (DSO) puhul tavaks. PHP FastCGI režiimis võimaldab iga virtuaalserveri rakendusi käitada just tema kasutaja õigustes.
ZFPM-il põhinevas süsteemis on kaks põhikomponenti:
- ZFPM – FastCGI protsessihaldur
- mod_zfpm – Apache2 moodul FastCGI päringute edastamiseks – optimiseeritud spetsiaalselt ZFPM-i jaoks
mod_zfpm-i ülesanne on saata saabunud HTTP päring ZFPM-ile, kes vajadusel käivitab ja edastab korrektsele PHP-FCGI rakendusele. PHP-FCGI genereerib vastuse (veebilehe) ning saadab selle tagasi ZFPM-ile, see omakorda mod_zfpm-ile ja sealt lõpuks päringu algatanud kliendile. Andmeedastus kõigi kolme komponendi (mod_zfpm <—> ZFPM <—> PHP-FCGI) vahel toimub FastCGI protokolli abil.
Alternatiiviks ZFPM-ile on võimalik kasutada mod_fcgid ja mod_fastcgi Apache mooduleid, mille protsessihaldurid on jäigalt integreeritud Apache veebiserveri protsessi. Sellest ka oluline erinevus ZFPM-iga, mis haldab kõiki FCGI protsesse täiesti eraldiseisvalt Apache veebiserverist. See tähendab, et veebiserveri tarkvara alglaadimine ei katkesta ega mõjuta otseselt käimasolevate PHP skriptide toimimist. Skriptidel on võimalik oma töö katkestamatult lõpuni teha hoolimata sellest, et töö käigus on näiteks veebiserveri konfiguratsioon muutunud ning tarkvarale alglaadimine tehtud. Samuti ei lõpetata/alustata veebiserveri alglaadimisel kõiki PHP-FCGI protsesse.
Koormuse all olevas serveris võib PHP-FCGI protsesside arv ulatuda tuhandetesse ning sellise hulga protsesside alglaadimine pelgalt pisikese veebiserveri konfiguratsiooni muudatuse tõttu oleks äärmiselt ebaratsionaalne ja ebamugav.
Kuna ZFPM on universaalne vahend kõigele, mis räägib FastCGI keeles, siis ei teki probleemi käitada virtuaalserverites samaaegselt erinevatel PHP versioonidel põhinevaid rakendusi. Siinkohal võib nimetada veel ühte ZFPM-ile alternatiivset lahendust – PHP-FPM, mis on ainult PHP spetsiifiline FastCGI süsteem. Selle põhiliseks miinuseks aga on PHP-FCGI protsesside turvalise haldamise keerukus just jagatud keskkonnas, kus ühes füüsilises serveris võib erinevaid virtuaalservereid olla tuhandeid ning neil peab olema vastavalt soovile võimalik kasutada erinevaid PHP versioone.
Levinumate vigade kirjeldused
Kuigi FastCGI on üks kiiremaid ja turvalisemaid viise jagatud keskkonnas PHP jooksutamiseks, siis (erinevalt lihtsast mod_php-st) on tegu üpris komplitseeritud päringu töötlemise ahelaga, kus erinevate komponentide tõrgete puhul võib Apache error_log-isse mitmekesiseid ja kohati krüptilisi sõnumeid tekkida.
Alljärgnevalt on ära toodud mõned levinumad ZFPM-i veateated ning vihjed, kuidas veapõhjust hakata otsima.
Connection to FastCGI was reset by peer during reading response. Check your FastCGI application log. Increase LogLevel verbosity to 'info' for additional protocol info.
Esimese asjana tuleks vaadata oma rakenduse logifaili, sest tõenäoliselt on rakendus ootamatult töö lõpetanud ning sellega FastCGI ühenduse sulgenud. Klient saab HTTP 500 veateate. Kui põhjuse väljaselgitamine iseseisvalt ebaõnnestub, siis tuleks pöörduda tehnilise toe poole ning täpsustada, kuidas viga reprodutseerida saab.
stderr: Timeout (30s) exceeded while waiting for FCGI process to become available
Paralleelselt päringuid töötlevate PHP-FCGI protsesside limiit käesolevas virtuaalhostis on saavutatud ning päring on vähemalt 30 sekundit tulemusteta oodanud mõne protsessi vabanemise taga. Klient saab HTTP 500 veateate. Tõenäoliselt on tegu märkimisväärse koormuse all oleva veebilehega, seega kui probleem esineb tihti, siis on soovitav lahendust otsida tehnilise toe kaudu.
stderr: Timeout (900s) exceeded while reading from socket (application)
Rakendus on ilma vastust saatmata päringut töödelnud vähemalt 15 minutit. Skript peaks midagi aegajalt väljastama, muidu eeldab protsessihaldur, et skript on kuskile “kinnijooksnud” ning katkestab jõuga selle töö. Tasub ka arvestada, et maksimaalne tööaeg veebipäringu töötlemiseks on 86400 sekundit ning selle saavutamisel katkestatakse skripti töö hoolimata sellest, kas ta aegajalt väljastab midagi või ei. Kui HTTP päised juba saadetud, siis katkestatakse vastuse saatmine poole pealt. Kui ei ole saadetud, siis saab klient HTTP 500 veateate.
stderr: Timeout (150s) exceeded while reading from socket (server)
Viga selles, et HTTP klient saadab päringut liiga aeglaselt. Antud näites pole ta suutnud 150 sekundi jooksul saata ühtegi uut baiti. Protsessihaldur katkestab ootamise ja klient saab HTTP 500 veateate.
stderr: <PHP skripti poolt öeldud viga>
Skriptide veateated, mis jäävad skripti enda poolt kinnipüüdmata, edastab PHP-FCGI veebiserverile. Sellised veateated kuvatakse otse vealogisse.