PHP 5.x telepítése Apache 2.x (wsm2) alatt (Squeeze)

Innen: AdminWiki

Ez a vázlatos leírás a PHP 5.x alkalmazásszerver Debian Squeeze és Apache 2.2.x webszerver alatti telepítését mutatja be.

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, Suhosin patch, 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 maintainer kétféle php.ini állományt ad a csomaggal: egy fejlesztői (/usr/share/doc/php5-common/examples/php.ini-development) és egy produkciós környezetre kitaláltat (/usr/share/php5/php.ini-production). Ezek alapján érdemes egy (esetleg több) saját ini file-t csinálni, és a php.ini-t erre mutató symlinkkel helyettesíteni (így a későbbiekben egyszerűen lehet konfigurációt váltani):

# Linkeljük a maintainer állományait
cp -s /usr/share/doc/php5-common/examples/* /etc/php5/apache2/
cp -s /usr/share/php5/php.ini-production /etc/php5/apache2/

# Készítsünk custom php.ini-t (a maintainerét mentsük el) és linkeljük
mv /etc/php5/apache2/php.ini /etc/php5/apache2/php.ini.dpkg
cp /etc/php5/apache2/php.ini-production /etc/php5/apache2/php.ini-custom
ln -s /etc/php5/apache2/php.ini-custom /etc/php5/apache2/php.ini

A php.ini állományokhoz a továbbiakban nem nyúlunk, hanem 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ő);
  • a safe mode-ot bekapcsoljuk (tudom: deprecated) és csoportra redukáljuk;
  • 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 /etc/php5/apache2/conf.d/

A suhosin patch beállításai

A lehetőségeket részletesen a Hardened PHP Project leírása tartalmazza. 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 30
    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
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

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!

Irodalom