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

A AdminWiki wikiből

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!

Irodalom