Mi teszi CGI-vé a PHP-t?
Sziasztok!
egy kisebb problémába ütköztem, amit sehogy sem tudok kilogikázni megnyugtató módon. debian linuxom van, és idáig magam fordítottam a PHP-t és az Apache-ot. jelenleg az Apache 2.2 és a PHP 5.1-esem van. Lényegében biztonsági megfontolásokból szeretném a php-t cgi verziósan futtatni, hogy a php szkriptek az adott felhasználó jogaival fusson. Itt került elém az akadály, mert először azt hittem, hogy másként kell fordítanom a php-t a CGI-s verzsönhöz (most ugye a CLI verzsön van). A jól megszokott LoadModule direktívával adtam ezidáig az Apache-hoz a php-t, és azt hittem, hogy ez jól is van. Először szétnéztem a neten, kérdezgettem ismerősőket, egy csomó levlistát átnyálaztam, de sehol nem tudtam megérteni tökéletes mértékben (lehet hogy velem van a hiba), hogy mitől fog futni a php értelmező cgi módban?
A legutóbbi netes boklászásom összefoglalása: a php feldolgozó cgi módú futása tulajdonképpen az Apache httpd.conf-jában megadott direktívákkal érhető el, azaz nem loadModule verzsönnel kell beincludolni.
Ez tényleg így van, vagy nagyon rosszul jött le az egész? Mi kell ahhoz, hogy az Apache a suexec segítségével a php-t, vagy akármelyik értelemzőt cgi módban futtason az adott felhasználó jogaival?
előre is köszönöm a segítséget!
■ egy kisebb problémába ütköztem, amit sehogy sem tudok kilogikázni megnyugtató módon. debian linuxom van, és idáig magam fordítottam a PHP-t és az Apache-ot. jelenleg az Apache 2.2 és a PHP 5.1-esem van. Lényegében biztonsági megfontolásokból szeretném a php-t cgi verziósan futtatni, hogy a php szkriptek az adott felhasználó jogaival fusson. Itt került elém az akadály, mert először azt hittem, hogy másként kell fordítanom a php-t a CGI-s verzsönhöz (most ugye a CLI verzsön van). A jól megszokott LoadModule direktívával adtam ezidáig az Apache-hoz a php-t, és azt hittem, hogy ez jól is van. Először szétnéztem a neten, kérdezgettem ismerősőket, egy csomó levlistát átnyálaztam, de sehol nem tudtam megérteni tökéletes mértékben (lehet hogy velem van a hiba), hogy mitől fog futni a php értelmező cgi módban?
A legutóbbi netes boklászásom összefoglalása: a php feldolgozó cgi módú futása tulajdonképpen az Apache httpd.conf-jában megadott direktívákkal érhető el, azaz nem loadModule verzsönnel kell beincludolni.
Ez tényleg így van, vagy nagyon rosszul jött le az egész? Mi kell ahhoz, hogy az Apache a suexec segítségével a php-t, vagy akármelyik értelemzőt cgi módban futtason az adott felhasználó jogaival?
előre is köszönöm a segítséget!
hihetetlen
Szóval a configure-nak van egy
--disable-cgi
kapcsolója, ez is jelzi, hogy nem kell külön kapcsolót használni ahhoz, hogy kapj CGI-t. Érdekes módon a command line dokumentációnál van leírva, hogy a CLI és CGI binárisokat hol találod, ha már lefordítottad a PHP-t. Ezekután ahelyett, hogy modult töltenél be, a szokásos CGI beállítási módszert kell követni. Ehhez az ApacheScriptAlias
,AddType
ésAction
direktívái kapcsolódnak, erről szintén érdekes módon a Windowsos Apache telepítésben van leírás, ezt tudod adaptálni.Számomra is hihetetlen :)
viszont most fordítom újra az általad leírtak szerint. Végül is tényleg van a sapi/cgi és sapi/cli könyvtár, benne a külnféle C fájlokkal. A kézikönyv azt írja, hogy a PREFIX/bin be mindnképpen a CLI-s verzsön kerül, ha meglett adva a disable-cgi vagy ki lett választva egy SAPI. Hát Én idáig mindig kiválasztottam , és már kezdem is érteni a lényegét. Most úgy fordítom a php-t, hogy nem adtam meg apxs-t. Saját logikám szerint, természetesen létrehozza a binárist, az pedig a cgi-verzsönnek kell lennie. ezután a httpd.conf-ban megadom a szükséges direktívákat:
ScriptAlias : a könyvtár, ahonnan futhatnak a szkriptek (pl /home)
Action a program, ami futtatja őket (/elersi/ut/phphoz)
AddType amivel hozzárendelem a kiterjesztést (.php)
És máris mennie kéne. Viszont levonva a következtetést: a php-t CGI verzsönné a configure-ban megadottak teszik lehetővé: nem szabad kikapcsolni a cgi-t, illetve egyetlen SAPI-t sem adunk meg.
És így is van, most készült el a fordítás, aszondja, hogy SAPI modul: cgi :)) Most már lassan Én is dörzsölöm a kezemet :D
Hát ez megoldva, nagyon szépen köszönöm a segítséget!!!
Remélem, hogy az Apache oldal is menni fog :)
Egy dolgot nem értek
újraindítás
Igen, ezt már megtettem :(
H hiba ez: "Premature end of script headers: index.php"
Az index.php-ban egyedül a phpinfo() szerepel. Egyébiránt a html oldalakt kiszolgálja, az a része jól megy, csak a .php nem tetszik neki. Azt tudja jól, hogy másként kell kezelnie, mint a html-t, de valamiért nem kezeli le. Talán rosszul adtam meg a php elérési útját? A bin könyvtárban szereplő futtathtaó php fájlt adtam meg, az alábbi módon: Action application/x-httpd-php /ut/a/phphoz.
webgyökérben
Nincs logikám??
A php maga jó,kipróbáltam parancssorból. Az Apache maga jó, kiszolgálja a statikus oldalakat.
Utoljára az alábbiakat adtam a httpd.conf-ban:
AddType application/x-httpd-php .php
Action application/x-httpd-php "/debcsomag/php5-ujcgi/bin/php"
ezt már azért csináltam, mert azt sem tudtam már, hogy mi hogyan működik, annyira értelmetlennek tűnik az egész.
Az én logikám szerint ha használni akaroma php-t, akkor megmutatom az Apache-nak, hogy melyik végződést figyelje (jelen esetben .php), aztán ehhez a végződéshez rendelek egy programot, amely megkapja végrehajtásra a fájlt, majd a kimenetet visszaadja az Apache-nak. Úgy gondolom, hogy aki akarja, az használja a ScriptAlias-t, de Én azt akarom elérni, hogy a php fájlok bárhonnan futtathatóak legyenek. Illetve a DocumentRoot-on belül.
De hol nincs meg a fájl, hol nincs hozzáférési jog, hol meg felkínálja a lehetőséget, hogy lementhettem a fájlt.
Amikor lementem a fájlt, és megnézem, hogy mi van benne, akkor azt látom, hogy 500-as error van benne. Nem sokat foglakoztam az Apache beállításaival, mert a modulos megoldás igen egyszerű volt, de ez most nagyon megharaptat.
kipróbáltam a linkelt oldalon található beállítást több verzsönben, de eredmény még semmi :(
Hol lehetne megnézni egy httpd.conf-ot Linuxra, cgi-s beállításokkal?
részletesebben
A PHP logikája szerint nem a szkript CGI, hanem a végrehajtója. Ugye ezt mutatja az is, hogy amikor a PHP-t futtatod parancssorból, azt mondja, hogy ez CGI. Szóval a végrehajtóját kell a webgyökér alá tenni, mint CGI-ként futtatható dolgot. Éppen ez teszi lehetővé, hogy bárhonnan futtathass PHP szkripteket, mert a kiterjesztés MIME típushoz rendelése, és a MIME típus kezelő beállítása miatt a PHP végrehajtó CGI mappájában fogja futtatni a PHP-t, ahol az meg van engedve. Különben mappánként kellene ExecGI jogot adnod, ahol PHP-t akarsz használni, +x-elni (futtathatóvá tenni) kellene a PHPket, és shebang (
#!/usr/bin/php
) sorokat kellene bele tenni (hogy tudja, mivel futttassa). De te nem azt akarod :)Kábé így nézhet ki egy linuxos CGI beállítás
Ezúton jelezném, hogy néhány éve pont ezzel a problémával küzdöttem, mármint a PHP és a CGI kapcsolatának megértésével és Gyulus volt oly türelmes, hogy elmagyarázza, azóta is hálás vagyok neki. Számomra az volt a kezdet :)
Köszönöm Gábor!
Az lendített rajtam, hogy megértettem végre az Apache CGI-s működési elvét, azt.hogy miért kell aliasolni a php-t. Számomra ennél volt a kutya elesve :)
Mégegyszer köszönöm a segítséget!