Php-fpm

Iš Žinynas.
Jump to navigation Jump to search

Kas tai ?[keisti]

PHP-FPM (FastCGI Procesų valdiklis) yra alternatyva senajam PHP FastCGI metodui su papildomomis funkcijomis, skirtomis faktiškai bet kokio dydžio svetainei ar projektui, ypač labai dideliems.

Privalumai ir funkcijos:

  • Prisitaikantis procesų kūrimas.
  • Bazinės statistikos (aka Apache mod_status).
  • Pažangus procesų valdymas su graceful stop/start.
  • Galimybė įjungti darbinius procesus su skirtingais uid/gid/chroot/aplinka taip pat atskiras php.ini (pakeičia safe_mode).
  • Stdout ir stderr žurnalai.
  • Pagalbinis perkrovimas dėl atsitiktinai pažeisto opcode kešavimo.
  • Pagreitintas unload palaikymas.
  • "Slowlog" palaikymas.
  • Patobulinimai pačiam FastCGI, tokie kaip fastcgi_finish_request() - speciali funkcija kuri leidžia užbaigti kreipimąsi ir išvalyti duomenis, kol daromas tolimesnis procesas (ilgai trunkantis) pvz.: video konvertavimas, statistikų generavimas ir t.t.
  • Daug daugiau kitų....

Produktas nebuvo sukurtas naudoti virtualiam hostingui (su dideliais pool kiekiais), bet gali būti taikytinas bet kokiai naudojimo strategijai.

Istorija[keisti]

Kartu su Apache httpd 2.4 išleidimu dėl netikėto populiarumo, php ir Apache įgavo papildomą fukncionalumą ir galimybę leisti PHP kaip fastCGI serverį. Taip adresuoti fastCGI serverį tiesiogiai iš Apache su tam skirtu moduliu (mod_proxy_fcgi).

Pradedant php versija 5.3.3 iš ankstyvų 2010 metų, php įdėjo php-fpm fastCGI procesų valdiklį į savo kodo bazę. Stabilumas atitinka naudojimą produktyviuose serveriuose. Php-fpm ankščiau randamas kaip http://php-fpm.org/ dabar tapo nepriklausoma PHP dalimi. Su standartiniu Apache ir php.net versijomis, nebereiks daugiau papildomų saugumo sprendimų tokių kaip suexec ar suphp arba pačio mod_php modulio.

Pritaikymas Apache serveryje[keisti]

Aprašymas skirtas Debian/Ubuntu distribucijų pagrindu veikiantiems serveriams.

apt-get install php5-fpm

Sukuriam naują pool standartiniam /var/www katalogui.

nano /etc/php5/fpm/pool.d/www.conf

Failo turinys:

[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /

Išsagome, taip pat atsidarome savo VirtualHost (bent vieną failą) įterpiame šias eilutes po "DocumentRoot"

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/$1
DirectoryIndex index.php

Arba jeigu tai socketas:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://127.0.0.1:9000/var/www/html

Reikalingi moduliai:

a2enmod proxy_fcgi

Reikalingi šie Apache moduliai (tik pavyzdys, kad viskas veiktų):

root@localhost# apache2 -t -D DUMP_MODULES
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
actions_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgi_module (shared)
cgid_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
expires_module (shared)
filter_module (shared)
headers_module (shared)
lbmethod_byrequests_module (shared)
mime_module (shared)
mpm_worker_module (shared)
negotiation_module (shared)
proxy_module (shared)
proxy_balancer_module (shared)
proxy_fcgi_module (shared)
proxy_http_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
security2_module (shared)
setenvif_module (shared)
slotmem_shm_module (shared)
socache_shmcb_module (shared)
ssl_module (shared)
status_module (shared)
suexec_module (shared)
unique_id_module (shared)
xsendfile_module (shared)

Viskas! :-)

Problemos[keisti]

Unable to fork()[keisti]

Reikia padidinti nofile ir nproc limitus sistemoje, įdedame į /etc/security/limits.conf

*         hard    nofile      500000
*         soft    nofile      500000
*         hard    nproc       500000
*         soft    nproc       500000

Į /etc/systemd/system/multi-user.target.wants/php7.0-fpm.service pridedame:

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity
TasksMax=infinity

Pakeičiame /etc/php/7.0/fpm/php-fpm.conf rlimit_files reikšmę į:

rlimit_files = 40000

Reloadiname sistemos php-fpm serviso taisykles:

systemctl daemon-reload  

Perkraname php-fpm servisą

systemctl restart php7.0-fpm      

Nerašo logų[keisti]

Reikia sukurti failą /var/log/fpm-php-useris.log

touch /var/log/fpm-php-useris.log

nustatyti owernį/groupą userio kurį runnina poolas t.y user = useris

chown useris:useris /var/log/fpm-php-useris.log

ir gale pool'o konfigo prirašyti šias eilutes

catch_workers_output = yes
php_flag[display_errors] = on 
php_admin_value[error_log] = /var/log/fpm-php-useris.log
php_admin_flag[log_errors] = on

Nekuriama socketo direktorija /run/php[keisti]

ERROR: unable to bind listening socket for address '/run/php/php7.1-fpm.sock': No such file or directory (2)

dedam i /etc/rc.local

[[ -d /run/php ]] || (mkdir /run/php;chown -R www-data:www-data /run/php)

Šaltiniai[keisti]