PHP käivitamine kasutaja õigustes
Apache suexec on programm, mis lisati versioonis 1.2 ja mis annab apache kasutajatele võimaluse käivitada cgi ja ssi programme kasutaja id-ga, mis erineb veebiserveri id-st. Normaalselt toimivad kõik skriptid veebiserveri õigustes. Kahjuks võimaldab see nõnda startida ainult cgi skripte.
Käesolev pala kirjeldab, kuidas saada iga serveris asuv php tükk samuti käima antud kasutaja õigustes. Näites kasutatav PHP on 5. versioon, kuid kasutada võib ka neljandat. Trellidega (#) on näidetes tähistatud käsuviip.
Tarkvara installeerimine
Installeerime apache koos suexec-ga:
# cd /usr/ports/www/apache2 # make WITH_SUEXEC_MODULES="YES" install
Seejärel installeerime php:
# cd /usr/ports/lang/php5 # make install clean
PHP installeerimisel küsitakse täiendavaid parameetreid. Valida tuleb CGI ja FastCGI tugi. Apache moodulit pole vaja, kui seda ei plaanita täiendavalt paralleelselt kasutada.
Järgneb fastcgi installeerimine:
# cd /usr/ports/www/mod_fastcgi # make install clean
Peale installeerimist saame kontrollida suexec'i parameetreid selliselt:
# suexec -V -D AP_DOC_ROOT="/usr/local/www/data" -D AP_GID_MIN=1000 -D AP_HTTPD_USER="www" -D AP_LOG_EXEC="/var/log/httpd-suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=1000 -D AP_USERDIR_SUFFIX="public_html"
Teooria
Apache oskab siduda mingit laiendit teatud cgi skripti käivitamisega näiteks saame globlaalselt käivitada php lisades httpd.conf'i
ScriptAlias /php-cgi/ /usr/local/www/data/cgi-bin AddType application/x-httpd-fastphp .php Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
Apache ei oska kohe suunata faile edasi kettal olevale binaryle või skriptile. Küll aga näiteks http://mingiaadress/cgi-bin all olvevale cgi skriptile või binaarfailile.
Reaga ScriptAlias /php-fastcgi/ /usr/local/www/data/cgi-bin tekitame me enda veebiserverile aliase php-cgi url'iga http://nimi/php-cgi
Järgmise reaga AddType application/x-httpd-fastphp .php Tekitame uue application tüübi nimega x-httpd-fastphp mille seome .php laiendiga
Kolmas rida Action application/x-httpd-fastphp /php-cgi/php5-fcgi määrab ,et application x-httpd-fastphp. Seetähendab kõik .php failid suunatakse automaatselt skriptile nimega php5-fcgi ehk siis http://nimi.ee/php-cgi/php5-fcgi
Nii saame näiteks hõlsasti teha kasvõi uue application tüübi näiteks laiendiga .jms
ja siduda selle cgi skriptiga mis loeb talle saadetud .jms laiendiga
failidest käske ja täidab neid luues nii kasvõi endale primitiivse veebiskriptimise keele.
Php cgi wrapperi abil suexeci üle tööle
Nagu näha, soovib suexec, et kõik skriptid, mida tema abil käivitatakse, asuksid kataloogis /usr/local/www/data Ei hakka DOC_ROOT muutma ja loome testi sinna.
Apache konfiguratsioon
Muudame httpd.conf, vajadusel lisame:
LoadModule suexec_module libexec/apache2/mod_suexec.so LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so
Tekitame virtualhostid
<VirtualHost *:80> SuexecUserGroup katse katse ServerAdmin kasutaja@nimi.ee DocumentRoot /usr/local/www/data/katse ServerName www.nimi.ee ScriptAlias /php-fastcgi/ /usr/local/www/data/katse/cgi AddType application/x-httpd-fastphp .php Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi </VirtualHost>
<VirtualHost *:80> SuexecUserGroup katse3 katse3 ServerAdmin kasutaja@nimi.ee DocumentRoot /usr/local/www/data/katse3/cgi-bin ServerName test.nimi.ee ScriptAlias /php-fastcgi/ /usr/local/www/data/katse3/cgi AddType application/x-httpd-fastphp .php Action application/x-httpd-fastphp /php-fastcgi/php5-fcgi
</VirtualHost>
Skript wrapperiks
Varasemalt sidusime virtualhostis iga .php laiendi kindla cgi skriptiga, mida suexeciga käivitame. Viimaks ehitame skripti enda, mis käivitatuna suexeci abil kasutaja õigustes stardib php enda ja sellekaudu ka veebi.
#!/bin/sh PHPRC="/usr/local/etc/php.ini" export PHPRC PHP_FCGI_CHILDREN=4 export PHP_FCGI_CHILDREN exec /usr/local/bin/php-cgi
Kopeerime selle faili kasutajate katse ja katse 3 kataloogidesse)
/usr/local/www/data/katse/cgi/php5-fcgi /usr/local/www/data/katse3/cgi/php5-fcgi
Muudame mõlema faili kasutajaõigusi chown käsuga:
chown katse:katse /usr/local/www/data/katse/cgi-bin/php5-fcgi
chown katse3:katse3 /usr/local/www/data/katse3/cgi-bin/php5-fcgi
Testimine
Testimiseks saab teha skripti
< ?php print "hello world< p >\n"; system("id"); php? >
www.nimi.ee skripti vaadates
hello world uid=1004(katse) gid=1004(katse) groups=1004(katse)
test.nimi.ee
hello world uid=1009(katse3) gid=1009(katse3) groups=1009(katse3)
Alternatiivne kiirem meetod
Toodud näide on samas suhteliselt aeglane.
Starditakse suexecit wrapperina kasutades cgi skript mis stardib omakorda php-cgi abil php skripti.
Kiirem võimalus on otse suunata kõik php failid php-cgi failile.
Käsureal teeme
mkdir /var/www/localhost/htdocs/cgi ln -s /usr/bin/php-cgi /var/www/localhost/htdocs/cgi/php-cgi
ja httpd.conf
ScriptAlias /phpcgi/ /var/www/localhost/htdocs/cgi/ AddType application/x-httpd-fastphp .php Action application/x-httpd-fastphp /phpcgi/php-cgi
Selleks ,et saavutada suexecile sarnane olukord kus kõik skriptid töötavad kasutaja õigustes võib kasutada apache moodulit mpm-itk. lähemalt sellest http://mpm-itk.sesse.net/
EENet 2006