Php-fpm
Kas tai ?
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
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
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
Unable to fork()
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ų
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