ugrás a tartalomhoz

Mi teszi CGI-vé a PHP-t?

Medvesajt · 2006. Jan. 4. (Sze), 19.37
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!
 
1

hihetetlen

Hojtsy Gábor · 2006. Jan. 4. (Sze), 19.55
Már dörzsöltem is a tenyerem, hogy ugrok, megmutatom, hogy hol van benne a kézikönyvben, mint legkézenfekvőbb helyen... Hát én lepődtem meg a legjobban, hogy nincs Unix CGI telepítésről rendes dokumentáció...

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 Apache ScriptAlias, AddType és Action 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.
2

Számomra is hihetetlen :)

Medvesajt · 2006. Jan. 4. (Sze), 20.42
Hát igen, Én is a kézikönyvet majmolom elsőre, de sajna nem találtam egyértelmű ismertetőt. Kipróbáltam a disable-cli kapcsolót is, és valamilyen oknál fogva bináris nem is készült a fordítás végére :) úgy látszik ehhez még nagyon láma vagyok.

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 :)
3

Egy dolgot nem értek

Medvesajt · 2006. Jan. 4. (Sze), 21.10
Már csak az a kis problémám támadt tesztelés közben, hogy a php fájlokat felkínálja lementeni. ez is egy új dolog, elvégre megadtam az Apache-nak az AddType application/x-httpd-php .php direktívát. Mi lehet a gond vajon?
4

újraindítás

Hojtsy Gábor · 2006. Jan. 4. (Sze), 22.16
Újraindítod, rögtön kapsz hibaüzenetet, ha elirtál valamit...
5

Igen, ezt már megtettem :(

Medvesajt · 2006. Jan. 4. (Sze), 23.44
A log volt az első, amit megnéztem, de az a baj, hogy nem sok ismeretem van az Aopache működését illetően.

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.
6

webgyökérben

Hojtsy Gábor · 2006. Jan. 5. (Cs), 00.07
Mint hogy a Windows példa mutatja, amit linkeltem az Action egy webgyökér alatt lévő dolgot ad meg. A ScriptAlias az, ami behúzza a webgyökér alá a PHP futtatható állományt tartalmazó mappáját.
7

Nincs logikám??

Medvesajt · 2006. Jan. 5. (Cs), 01.13
Lehet, hogy mindent leakarok egyszerűsíteni, az is lehet, hogy teljes tudatlanságban szenvedek, de nem értem, és ennek eredméyne, hogy nem is működik :(

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?
8

részletesebben

Hojtsy Gábor · 2006. Jan. 5. (Cs), 09.22
Nos, fent megpróbáltam leírni, de úgy tűnik nem egyre jár a logikánk...
  • A PHP a CGI feldolgozó, nem a szkripted a CGI, ezért kell ScriptAlias-szal behúzni a webgyökér alá a PHP-t
  • Hozzá kell rendelni a PHP MIME típushoz ezt a kezelőt, már a ScriptAliasolt folderből
  • Hozzá kell rendelni a .php kiterjesztéshez a MIME típust.

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 a /php/ mappába aliaszolja a webgyökér alá a PHP mappáját
ScriptAlias /php/ /usr/bin/php5/
# A PHP kiterjesztés MIME típushoz rendelése
AddType application/x-httpd-php .php
# Itt a már aliaszolt mappában hivatkozunk a futtatható állományra
# Figyelni kell rá, hogy ez biztosan a CGI SAPI szerinti legyen,
# Különben persze nem fog menni...
Action application/x-httpd-php /php/php-cgi
Bővebben arról, hogy a CGI miként működik Apacheban.

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 :)
9

Köszönöm Gábor!

Medvesajt · 2006. Jan. 5. (Cs), 20.39
Alig hiszem el,de végre sikerült megértenem és így aztán beállítanom is PHP CGI-s verzsönjét!! Nagyon szépen köszönöm a segítséget, a lámaszintű magyarázatot!!!

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!