PHP 5.x telepítése Apache 2.x (wsm2) alatt (Jessie)
Ez a vázlatos leírás a PHP 5.x alkalmazásszerver Debian Jessie és Apache 2.4.x webszerver alatti telepítését mutatja be.
Tartalomjegyzék
Telepítés
Az alábbiakban feltételezzük, hogy az Apache webszerver a házirendünk szerint, a wsm2 kiegészítővel már telepítve van.
Megfontolandó, hogy a Debian csomagból történő telepítés után, a beállítások idejére a webszervert leállítsuk (korábban ez kötelező volt, mert az alapértelmezett PHP beállítások fejlesztői, és nem produkciós környezetre voltak meghatározva - a Wheezy óta ez megváltozott):
apt-get install php5 # magával hozza: libapache2-mod-php5 php5-common php5-cli, függőségek, modulok systemctl stop apache2 # nem kötelező, de biztos, ami biztos
A telepítés magával hozza és be is kapcsolja a ZendOpcache, PDO, JSON és readline PHP modulokat. A többi kiegészítőt később, a beállításokat követően tesszük fel, ha szükségesek.
Beállítások
A PHP alapbeállításai
Figyelem! - az alábbi leírás csak az Apache-2 modulra vonatkozik, a parancssori client mode PHP-ra nem! - TODO!
A Debian Jessie-ben a PHP Apache modul szerver szintű beállításait a maintainer által biztosított /etc/php5/apache2/php.ini állomány és a /etc/php5/apache2/conf.d könyvtárban elhelyezett override konfigurációs állományok együttesen határozzák meg (ezek az egyes virtualhostok beállításaiban tovább módosíthatóak). Saját, globális beállításainkat egy új /etc/php5/apache2/conf.d/99-wsm2-php5 nevű állományban fogjuk megadni, amelyben a maintainer beállításait az alábbiak szerint bíráljuk felül illetve egészítjük ki:
- tiltjuk a PHP futtatást (virtualhostonként külön engedélyezendő);
- beállítjuk az open_basedir alapértelmezését úgy, hogy a PHP a web tárterületről ne lásson ki (virtualhostonként külön módosítandó);
- globálisan (minden virtualhostra) tiltjuk a biztonsági szempontból kérdéses függvények használatát;
- alapértelmezésben tiltjuk a fájl feltöltést és a távoli URL-ek megnyitását (virtualhostonként külön engedélyezendő)
- csökkentjük a memórialimitet 128 M-ről 32M-re (virtualhostonként felülbírálható);
- a logolást leválasztjuk a syslogról (a wsm2 virtualhostonként külön logot állít be);
- az alapértelmezett karaktertáblát UTF-8-ra állítjuk (virtualhostonként felülbírálható);
- globálisan (minden virtualhostra) tiltjuk a persistent MySQL kapcsolatokat;
- globálisan (minden virtualhostra) engedélyezzük a cookie-k továbbítását nem SSL kapcsolaton keresztül is(!);
- TODO: meggondolni!
Az állományt megtaláljuk a wsm2 csomagban, és legegyszerűbben a
wsm2 --configure # Configuring PHP...
parancs ismételt lefuttatásával másolhatjuk a helyére. A rekonfiguráció ezen kívül mást nem fog megváltoztatni, viszont elindítja a webszervert - már az új beállításokkal.
A PHP logolás leválasztása a webszerver logokról
Alapértelmezésben a PHP naplóbejegyzések az Apache error logjában jelennek meg. Hasznos lehet ezeket a logbejegyzéseket virtualhostonként egy-egy külön naplóállományba átirányítani. Ehhez egyrészt a PHP beállításaiban meg kell adni a logfile helyét (a wsm2-vel létrehozott virtualhostoknál ez automatikus), másfelől létre is kell hoznunk a PHP naplóállományokat tartalmazó könyvtárat a /var/log alatt, úgy, hogy a webszervert futtató www-data felhasználónak írásjoga, a webadmin felhasználónak pedig olvasási joga legyen (ez lehetővé teszi, hogy a fejlesztők - https-en és authentikáció után - olvassák a wsm2 által a virtualhostba linkelt logokat):
mkdir /var/log/php5 # az összes PHP napló alapkönyvtára chown www-data:adm /var/log/php5 chmod 2751 /var/log/php5 # az o+x kell a linkelhetőséghez! setfacl -m u:webadmin:rx /var/log/php5 # így a webadmin minden logot láthat setfacl -d -m u:webadmin:r /var/log/php5 touch /var/log/php5/php.log # egy alapértelmezett naplóállomány (általában nem használt) chown www-data:adm /var/log/php5/php.log chmod 640 /var/log/php5/php.log
Állítsuk be a fenti könyvtárban lévő naplóállomány rotálását (pl. az Apache naplókkal azonos módon):
-rw-r--r-- root root /etc/logrotate.d/php5 /var/log/php5/*.log { weekly rotate 53 compress missingok notifempty create 0640 www-data adm }
Megjegyzés: tehetnénk a PHP naplókat az Apache naplókkal azonos könyvtárba is, a fenti elhelyezés a korábbi Debian házirendből maradt meg.
A PHP monitorozásának engedélyezése a Muninban
Amennyiben a munin-plugins csomagunk telepítve van, a szokott módon engedélyezhetjük az ebben megtalálható, PHP monitorozó pluginokat:
# PHP session file-ok száma (adatbázisban tárolt session-öket nem számol!) cp /usr/local/share/munin/plugin-conf.d/php_sessions /etc/munin/plugin-conf.d/ ln -s /usr/local/share/munin/plugins/php_sessions /etc/munin/plugins/php_sessions # Érvényesítés systemctl restart munin-node
Gyorsteszt
Gyorstesztként engedélyezzük a PHP értelmezését a webszerver alapértelmezett virtualhostján:
-rw-r--r-- root root /etc/apache2/sites-enabled/000-default.conf [...] <VirtualHost *:80 > [...] # PHP policy settings. [...] <IfModule mod_php5.c> php_admin_flag engine on [...] </IfModule> [...]
Olvastassuk fel a módosított konfigurációt:
systemctl reload apache2
és készítsünk egy egyszerű PHP-t az alapértelmezett virtualhost alapkönyvtárában:
-rw-r----- webadmin www-data /var/www/FQHN/hello.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>PHP Test</title> </head> <body> <?php echo '<p>Hello World</p>'; ?> <?php phpinfo() ?> </body> </html>
Ezután kérjük el a webszervertől a hello.php oldalt (helyben pl. wget-tel, vagy a telepítés alatt álló szervert a webszerver portján elérő munkaállomásról, pl. grafikus böngészővel)! A böngészőben a "Hello, World!" szövegnek kell megjelennie, ugyanakkor a virtualhosthoz tartozó -php.log állományba bekerül egy bejegyzés, amely a phpinfo() hívásának letiltására utal.
A gyorstesztet követően a hello.php törölhető, és a webszerver alapértelmezett virtualhostján a PHP értelmezését célszerű ismét letiltani.
Modulok telepítése
A modulok telepítése opcionális (LAMP szerver esetén a MySQL általában "mindenhez" szükséges, a többi a telepítendő PHP alkalmazásoktól függ). A telepítés be is kapcsolja a modult, amely később később a php5dismod illetve php5enmod parancsokkal kapcsolható ki- illetve vissza (a háttérben ugyanolyan symlinkelés történik, mint az Apache modulok esetében). A módosításokat a webszerver konfiguráció újraolvastatásával kell érvényesíteni.
MySQL PHP modul telepítése
Ez a modul a MySQL adatbázisok PHP-ből történő direkt eléréséhez szükséges. Feltételezzük, hogy a MySQL szerver a házirendünk szerint telepítve van.
apt-get install php5-mysql # Érvényesítés systemctl reload apache2
GD PHP modul telepítése
Ez a modul képállományok (PNG, JPEG, XPM) és true-type fontok PHP-ből történő direkt kezeléséhez szükséges (figyelem, jelentős függőségei lehetnek!).
apt-get install php5-gd # +: függőségek # Érvényesítés systemctl reload apache2
CURL modul telepítése
Ez a modul a Client URL Library használatához szükséges, amellyel a PHP kód más szerverekkel tud kommunikálni (http, https, ftp, gopher, telnet, dict, file, ldap, stb.).
apt-get install php5-curl # +: főtanúsítványok, ssh és curl library-k (ha még nincsenek telepítve) # Érvényesítés systemctl reload apache2
XSL modul telepítése
Ez a modul a libxslt parser PHP-ből történő használatához szükséges.
apt-get install php5-xsl # +: libxslt # Érvényesítés systemctl reload apache2
SOAP modul telepítése
Ez a modul a korábban Simple Object Access Protocol elnevezésű, XML alapú üzenetküldő szabványt valósítja meg PHP alatt. Csak akkor telepítsük, ha szükséges!
Sok függősége lehet (többek között PEAR-t is kér).
apt-get install php-soap # +: sok függőség, közte PEAR # Érvényesítés systemctl reload apache2
Egyéb eszközök telepítése
Szintén opcionálisak, csak akkor telepítsük, ha valóban szükségesek.
OPcache (kód) gyorsítótár
Az OPcache egy köztes kód (tárgykód) objektum gyorsítótár (intermediate code cache) a PHP-hoz. A PHP alkalmazások számára transzparens, használatához azokat nem kell módosítani. Használata opcionális, publikus szolgáltatást nyújtó PHP kiszolgálóknál javasolt.
A Debian PHP terjesztésnek része, de alapértelmezetten nincs bekapcsolva. Engedélyezéséhez és paraméterezéséhez egészítsük ki a wsm2-local.conf állományt az alábbiakkal:
-rw-r--r-- root root /etc/apache2/conf-available/wsm2-local.conf [...] # OPcache settings: # http://php.net/manual/en/opcache.configuration.php <IfModule mod_php5.c> # Bug - see e.g: https://github.com/omega8cc/boa/issues/381 # php_admin_flag opcache.enable on php_admin_value opcache.memory_consumption 128 php_admin_value opcache.interned_strings_buffer 8 php_admin_value opcache.max_accelerated_files 4000 php_admin_value opcache.revalidate_freq 60 php_admin_flag opcache.fast_shutdown on php_admin_flag opcache.enable_cli off </IfModule>
A fenti értékek a kézikönyvből származnak, átgondolni és pontosítani TODO!
Sajnos egy hiba miatt, ha az OPcache-t a fenti módon, és nem a php.ini-ben engedélyezzük, az Apache(?) figyelmeztetésekkel árasztja el az error.log-ot. Ezért (kivételesen) szerkesszük meg a php.ini állományt az alábbiak szerint:
-rw-r--r-- root root /etc/php5/apache2/php.ini [opcache] ; Determines if Zend OPCache is enabled opcache.enable=1
Az OPcache monitorozásának engedélyezése a Muninban
Az OPcache monitorozásához szükség van egy, csak a localhost-ról engedélyezett PHP kód hívására, amely a monitorozott paramétereket lekérdezi és visszaadja. Másoljuk a munin-plugins tarballban szereplő PHP kódot az alapértelmezett virtualhost web gyökérkönyvtárába:
cp /usr/local/share/munin/plugins/php_opcache.php /var/www/[DEFAULT_VIRTUALHOST]/
és engedélyezzük lefuttatását csak a localhost-ról:
-rw-r--r-- root root /etc/apache2/sites-enabled/000-default.conf [...] # PHP OPcache monitoring <Location /php_opcache.php> Require local <IfModule php5_module> php_admin_flag engine on </IfModule> <IfModule security2_module> SecRuleEngine Off </IfModule> </Location> ###################################################################### # Virtualhost's fine tuning and application-specific settings (if any). [...]
Olvastassuk újra a webszerver konfigurációját és ellenőrizzük, hogy az OPcache állapota PHP-val lekérdezhető-e (ehhez az alapértelmezett virtualhoston a PHP-t nem kell engedélyezni, a bemásolt Apache konfiguráció részlet megteszi ezt kizárólag erre az egyetlen állományra):
systemctl reload apache2 wget --user-agent="none" -O result.txt 'http://localhost/php_opcache.php' cat result.txt; rm result.txt mem_used.value 79620224 mem_free.value 54597504 mem_wasted.value 0
Ha válaszként hasonló kimenetet kapunk, a lekérdezés helyesen van beállítva.
Ezután a szokásos módon engedélyezzük a php_opcache Munin plugint:
ln -s /usr/local/share/munin/plugins/php_opcache /etc/munin/plugins/php_opcache systemctl restart munin-node
és telnettel (vagy a Munin ábrák megtekintésével) ellenőrizzük működését.
APCu (adat) gyorsítótár
Az Alternative PHP Cache korábban köztes kód (tárgykód) objektum gyorsítótárként működött, de a PHP (a Debian Jessie kiadásában is szereplő) 5.5 verziójában ezt a funkciót megszüntették, és kizárólag adatobjektum gyorsítótárként, név-érték párok tárolására szolgál. Használata opcionális (rutinból nem telepítjük), elsősorban nagy terhelésű PHP kiszolgálóknál van értelme. A PHP alkalmazás számára nem transzparens, a gyorsítótárazás az alkalmazás részéről együttműködést igényel(?) - az ownCloud pl. jól kihasználja.
Debian csomagból telepíthető:
apt-get install php-apcu
Telepítés után a gyorsítótár még nincs engedélyezve.
Az APCu beállítása
Engedélyezéséhez egészítsük ki a wsm2-local.conf állományt az alábbiakkal:
-rw-r--r-- root root /etc/apache2/conf-available/wsm2-local.conf [...] # APC settings. <IfModule mod_php5.c> php_admin_flag apc.enabled on php_admin_value apc.shm_segments 1 php_admin_value apc.shm_size 32M php_admin_value apc.ttl 1800 php_admin_value apc.user_ttl 1800 </IfModule>
A fentieket átgondolni és pontosítani TODO!
Az APC cache használata egy virtualhostban az alábbi Apache beállítással kapcsolható ki:
[...] <IfModule mod_php5.c> php_admin_flag apc.enabled off </IfModule> [...]
Az APCu monitorozásának engedélyezése a Muninban
Az APC monitorozásához szükség van egy, csak a localhost-ról engedélyezett PHP kód hívására, amely a monitorozott paramétereket visszaadja. Másoljuk a munin-plugins tarballban szereplő PHP kódot az alapértelmezett virtualhost web gyökérkönyvtárába:
cp /usr/local/share/munin/plugins/php_apc.php /var/www/[DEFAULT_VIRTUALHOST]/
és engedélyezzük lefuttatását csak a localhost-ról:
-rw-r--r-- root root /etc/apache2/sites-enabled/000-default.conf [...] # PHP APCu monitoring <Location /php_apc.php> Require local <IfModule php5_module> php_admin_flag engine on </IfModule> <IfModule security2_module> SecRuleEngine Off </IfModule> </Location> ###################################################################### # Virtualhost's fine tuning and application-specific settings (if any). [...]
Olvastassuk újra a webszerver konfigurációját és ellenőrizzük, hogy az APC státusa PHP-val lekérdezhető-e (ehhez az alapértelmezett virtualhoston a PHP-t nem kell engedélyezni, a bemásolt Apache konfiguráció részlet megteszi ezt kizárólag erre az egyetlen állományra):
systemctl reload apache2 wget --user-agent="none" -O result.txt 'http://localhost/php_apc.php?act=memory' cat result.txt; rm result.txt mem_used.value 51712 mem_avail.value 31405512
Ha válaszként hasonló kimenetet kapunk, a lekérdezés helyesen van beállítva.
Ezután a szokásos módon engedélyezzük a php_apc_ Munin pluginokat:
cp /usr/local/share/munin/plugins.d/php_apc /etc/munin/plugins.d/ #ln -s /usr/local/share/munin/plugins/php_apc_ /etc/munin/plugins/php_apc_hits # Kumulált grafikon, nem tűnik igazán hasznosnak ln -s /usr/local/share/munin/plugins/php_apc_ /etc/munin/plugins/php_apc_memory ln -s /usr/local/share/munin/plugins/php_apc_ /etc/munin/plugins/php_apc_percents systemctl restart munin-node
és telnettel (vagy a Munin ábrák megtekintésével) ellenőrizzük működésüket.
XSendFile
Még ne vedd komolyan!
Az XSendFile egy Apache-2 modul, amely lehetővé teszi, hogy egy webalkalmazás outputként egy létező statikus állomány tartalmát adja vissza (pl. download.php funkcionalitás) anélkül, hogy azt a standard outputra kelljen másolnia. Ehelyett beállíthat egy HTTP-response header-t, amelyben megadja az állomány élérési útvonalát és kiléphet; a response feldolgozásakor az Apache-2 az állomány tartalmát adja vissza body-ként.
Figyelem: az XSendFile megkerül minden Apache korlátozást (tehát a deny from all-t is)!
A mod_xsendfile telepítése
A modul nem része a Debian Lenny disztribúciónak, így vagy forrásból kell lefordítani (TODO!), vagy az alábbi, unofficial repository-ból telepíthető:
mount -o remount,exec /tmp; mount -o remount,rw /usr; mount -o remount,exec /var dpkg -i *.deb # csak a telepítendő .deb csomag legyen a könyvtárban :-) mount -o remount /tmp; mount -o remount /usr; mount -o remount /var
Telepítés után engedélyezzük az Apache modult:
a2enmod xsendfile; invoke-rc.d apache2 restart
Gyorsteszt
TODO!