PHP 5.x telepítése Apache 2.x (wsm2) alatt (Wheezy)
Ez a vázlatos leírás a PHP 5.x alkalmazásszerver Debian Wheezy és Apache 2.2.x webszerver alatti telepítését mutatja be.
Tartalomjegyzék
Telepítés
Tekintettel arra, hogy a PHP nem biztonságos beállításokkal települ, érdemes lehet a telepítés idejére a webszervert leállítani, ezután telepíthető a PHP (a kiegészítőket később tesszük fel, ha szükséges):
invoke-rc.d apache2 stop apt-get install php5 # magával hozza: libapache2-mod-php5 php5-common php5-cli, függőségek
Beállítások
A php.ini beállítása
Figyelem! - az alábbi leírás csak az Apache-2 modulra vonatkozik, a parancssori client mode PHP-ra nem! - TODO!
A Wheezy csomaggal érkező php.ini állomány produkciós környezetre van kitalálva, így csak a saját szigorításainkat kell hozzátennünk. Ehhez készítünk egy új /etc/php5/apache2/conf.d/wsm2-php5 állományt, 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, de manuálisan kell a helyére másolnunk:
cp -p /usr/local/share/website-manager-2/templates/wsm2-php5.ini.7 /etc/php5/apache2/conf.d/wsm2-php5.ini
A Suhosin patch beállításai
A Suhosin patch leírását részletesen a Hardened PHP Project weboldal tartalmazza. Sajnos a Wheezy-beli PHP-val a Suhosin patch jelenleg nem kompatibilis: "in fact suhosin is not (yet) compatible with php 5.4." illetve "PHP 5.4 is generally regarded to be reasonably safe without Suhosin involved." - TODO!
PHP logolás leválasztása a syslog-ról
A paranoid php.ini a naplózás szintjét "all"-ra állítja, tiltja a hibák webfelületen történő kijelzését, és azokat alapértelmezésben a system logon keresztül naplózza. Tekintettel a nagyszámú PHP notice-ra, a logbejegyzéseket érdemes egy külön állományba átirányítani. Ehhez egyrészt a php.ini-ben kell megadni a logfile helyét (ld. fentebb), másfelől hozzuk is létre a php.ini-ben megadott könyvtárat és logállományt 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 wsm által a virtualhostba linkelt logokat):
mkdir /var/log/php5 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 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 52 compress missingok notifempty create 0640 www-data adm }
A PHP monitorozásának engedélyezése a Muninban
A szokásos módon engedélyezzük a munin-plugins tarballban 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 invoke-rc.d munin-node restart
Gyorsteszt
A fenti beállítások után a webszerver elindítható:
invoke-rc.d apache2 start
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 [...] <VirtualHost *:80 > [...] # PHP policy settings. [...] <IfModule mod_php5.c> php_admin_flag engine on [...] </IfModule> [...]
olvastassuk fel a módosított konfigurációt:
invoke-rc.d apache2 reload
és készítsünk egy egyszerű PHP-t a SYSTEMHOST dokumentum alapkönyvtárában:
-rw-r----- webadmin www-data /var/www/SYSTEMHOST/hello.php <html> <head> <title>PHP Test</title> </head> <body> <? echo '<p>Hello World</p>'; ?> <? 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 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, a MySQL általában "mindenhez" szükséges, a többi a telepítendő PHP alkalmazásoktól függ.
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. Debian csomagból telepíthető. A telepítés után újra kell olvastatni a webszerver konfigurációját:
apt-get install php5-mysql invoke-rc.d apache2 reload
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. Debian csomagból telepíthető (figyelem, elég sok csomagot magával hoz!). A telepítés után újra kell olvastatni a webszerver konfigurációját:
apt-get install php5-gd # Magával hozza: könyvtárak, fontok, x11-common invoke-rc.d apache2 reload
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.). Debian csomagból telepíthető. A telepítés után újra kell olvastatni a webszerver konfigurációját:
apt-get install php5-curl # Magával hozza: főtanúsítványok, ssh és curl library-k invoke-rc.d apache2 reload
XSL modul telepítése
Ez a modul a libxslt parser PHP-ből történő használatához szükséges. Debian csomagból telepíthető. A telepítés után újra kell olvastatni a webszerver konfigurációját:
apt-get install php5-xsl # Magával hozza: libxslt invoke-rc.d apache2 reload
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!
Debian csomagból telepíthető, sok függőséggel (többek között PEAR-t is kér). A telepítés után újra kell olvastatni a webszerver konfigurációját:
apt-get install php-soap # Sok függőség, közte PEAR invoke-rc.d apache2 reload
Per-virtualhost beállításai nincsenek, a globálisakat a /etc/php5/apache2/php.ini (pontosabban az ide linkelt paranoid konfiguráció) már tartalmazza.
Egyéb eszközök
Szintén opcionálisak, csak akkor telepítsük, ha valóban szükséges.
APC cache
Az Alternative PHP Cache egy köztes kód (tárgykód) objektum gyorsítótár (intermediate code cache) a PHP-hoz. Használata opcionális (rutinból nem telepítjük), elsősorban nagy terhelésű PHP kiszolgálóknál van értelme.
Debian csomagból telepíthető:
apt-get install php-apc
Az APC beállítása
TODO! - bekapcsolva, egy darab 30MB-os memóriaszegmens, fél óra objektum életidő a cache-ben.
-rw-r--r-- root root /etc/apache2/conf.d/wsm2-local [...] # 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 30M php_admin_value apc.ttl 1800 php_admin_value apc.user_ttl 1800 </IfModule> [...]
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 APC monitorozásának engedélyezése a Muninban
Az APC monitorozásához szükség van egy, csak a localhostról engedélyezett PHP kód hívására, amely a 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 localhostról a /usr/local/share/munin/plugins-conf.d/php_apc.apache2 tartalmának a /etc/apache2/sites-enabled/000-default állomány 80-as portra vonatkozó részébe (célszerűen a rewrite rule-ok elé) történő bemásolásával! Olvastassuk újra a webszerver konfigurációját és ellenőrizzük, hogy az APC státusa PHP-val lekérdezhető-e:
invoke-rc.d apache2 reload wget --user-agent="none" 'http://localhost/php_apc.php?act=memory' cat 'php_apc.php?act=memory'; rm 'php_apc.php?act=memory' mem_used.value 51712 mem_avail.value 31405512
Ha válaszként hasonló kimenetet kapunk, a lekérdezés helyesen van beállítva. Megjegyzés: 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.
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 invoke-rc.d munin-node restart
és telnettel (vagy a Munin ábrák megtekintésével) ellenőrizzük működésüket.
Irodalom
- APC configuration in PHP Manual
XSendFile
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 headert, 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!