Dinamikus Virtualhostok Apache 2.2 szerveren
Helló,
Adott egy localhost Apache 2.2 szerver Ubuntu 12.10-en és a /etc/hosts-ba hozzáadott valami.hu ami az 127.0.0.1-re mutat.
A cél a következő:
Ha megnyitom a weboldalt egy aldomainnel (akarmi.valami.hu) akkor a DocumentRoot a /home/akarmi/www mappa legyen, ellenkező esetben (valami.hu) a /var/www mappa.
Az első lépés sikerült a mod_vhost_alias modul engedélyezésével, majd a követhező scripttel, amit a /etc/apache2/apache2.conf fájl végén helyeztem el:(A teszt kedvéért a /etc/hosts-ba beraktam egy sub.valami.hu-t)
A másodikat viszont nem tudom hogyan kellene megvalósítani, ebben szeretném a segítségeteket kérni. Gondoltam az ErrorDocument 404-re, viszont az egyrészt nem is lenne elegáns, másrészt szeretnék majd 404-es hiba jelző oldalt.
A fenti script szétválaszthatóvá teszi az URL-t és %1-gyel az első részét (a legelső pontig) beilleszti szövegként és így a sub.valami.hu-t megnyitva a /home/sub/www mappát állítja be DocumentRootnak. A dolog lényege, hogy ne kelljen minden egyes aldomaint külön virtualhostként beállítani, hanem ezzel a pár sorral meg lehessen valósítani.
Azt is jó lenne megoldani, hogy ha www.sub.valami.hu-t nyitok meg, akkor ne a /home/www/www mappába irányítson át, hanem a /home/sub/www-be. Ugyanezt az aldomain nélküli változatnál, tehát www.valami.hu-ról ne a /home/www/www-t hanem a /var/www-t használja.
Előre is köszönöm a segítséget.
■ Adott egy localhost Apache 2.2 szerver Ubuntu 12.10-en és a /etc/hosts-ba hozzáadott valami.hu ami az 127.0.0.1-re mutat.
A cél a következő:
Ha megnyitom a weboldalt egy aldomainnel (akarmi.valami.hu) akkor a DocumentRoot a /home/akarmi/www mappa legyen, ellenkező esetben (valami.hu) a /var/www mappa.
Az első lépés sikerült a mod_vhost_alias modul engedélyezésével, majd a követhező scripttel, amit a /etc/apache2/apache2.conf fájl végén helyeztem el:
UseCanonicalName Off
VirtualDocumentRoot /home/%1/www/
A másodikat viszont nem tudom hogyan kellene megvalósítani, ebben szeretném a segítségeteket kérni. Gondoltam az ErrorDocument 404-re, viszont az egyrészt nem is lenne elegáns, másrészt szeretnék majd 404-es hiba jelző oldalt.
A fenti script szétválaszthatóvá teszi az URL-t és %1-gyel az első részét (a legelső pontig) beilleszti szövegként és így a sub.valami.hu-t megnyitva a /home/sub/www mappát állítja be DocumentRootnak. A dolog lényege, hogy ne kelljen minden egyes aldomaint külön virtualhostként beállítani, hanem ezzel a pár sorral meg lehessen valósítani.
Azt is jó lenne megoldani, hogy ha www.sub.valami.hu-t nyitok meg, akkor ne a /home/www/www mappába irányítson át, hanem a /home/sub/www-be. Ugyanezt az aldomain nélküli változatnál, tehát www.valami.hu-ról ne a /home/www/www-t hanem a /var/www-t használja.
Előre is köszönöm a segítséget.
Nem illik
Tudom
Rewrite
Tarhely
1. lepes: manualis konfig
Kezzel hoztam letre a vhostokat, mindenhova irogattam bele a dolgokat. Azert, hogy ne legyen olyan bonyolult, en is kiserleteztem mindenfele VirtualDocumentRoot-tal meg ilyesmivel, de sajnos a kulonbozo Apache modulok (kulonosen a Rewrite) nem mukodott eleg jol vele.
2. lepes: FastCGI
Mar idejekoran eljutottam odaig, hogy a usereimet el kellene szeparalni jogosultsagok szintjen es SSH hozzaferest adni nekik. Meg mindig manualis konfiguracioval, de mar FastCGI-vel mentek a PHP-k. Sajnos karbantartasilag ez nem segitett sokat.
3. lepes: MPM ITK
Tovabbra is a user szeparacion dolgoztam es az MPM ITK-t nezegettem. Anno nem volt olyan fejlett a FastCGI tamogatas a PHP-ban, ezert folyamatosan voltak problemak. Sajnos mind biztonsagi, mint teljesitmeny szempontbol problemas volt a dolog.
4. lepes: sajat Apache modul
Amikor elkezdtem komolyabban dolgozni ezen a kerdesen, muszaj volt automatizalni. Ekkor kerult kepbe a kulonbozo dinamikus vhostokat lehetove tevo modulok. Mivel egyik sem volt igazan jo, elkezdtem egy sajatot fejleszteni. Ez sikerult is, napi tobb millio oldallekerdezest sikerult ezzel kiszolgalni.
5. lepes: mod_vhost_ldap
Ahogy uj rendszerekkel kiskerleteztem, egyre inkabb szerettem volna valami karbantarthato(bb) megoldast, amivel nem kell annyit foglalkozni. Igy kerult kepbe a mod_vhost_ldap. Ez egy LDAP szerverbol huzta a vhostokat, cachelt es egeszen jol mukodott. Eddigre a FastCGI mar egesz epkezlab allapotokat oltott, igy azzal hazasitottam ossze es buszken jelenthetem, szepen mukodott is.
6. lepes: virtualizacio
Ahova mar nem jutottam el mivel kikerultem a tarhely szolgaltatas temakorbol: a virtualizacio. A celom az volt, hogy minden felhasznalonak egy sajat virtualis gepet inditsak egy nagyon pici Apache-al benne, elotte pedig egy nginx teljesitene szolgalatot mint proxy.
Kombináld hagyományos VirtualHost-tal
Ha viszont a fődomaineket nem akarod ezzel kezelni, akkor a hagyományos virtuális hoszttal kombinálva megoldható:
Kell egy fix aldomain, ami lehet a ServerName helyén, hogy megkülönböztesd a default-tól. Illetve ServerAlias minden aldomainje a valami.hu -nak.
Ahhoz, hogy a www a VirtualDocumentRoot -ba se kavarjon be, nem az első ( %1 ) részt kell venni a domainből, hanem jobbról a harmadikat ( %-3 ). Ami az előtt van, már lehet www vagy bármi más is. De ha a hosts fájlban csak a www-t engedélyezed, akkor úgyis csak azzal fog működni.
PHP-FPM
Próbaként létrehoztam egy tomi.php-t a /var/www-ben aminek a tartalma a következő:
Ezen kívül ott tartok, hogy írtam egy bash scriptet, ami létrehoz egy új virtualhostot - documentrootot, subdomaint a paraméternek megadott adatok alapján állít be.
php.ini
disable_functions
(php.ini)Lehet, hogy van sokkal jobb megoldás is, azt majd valaki okosabb...
php safe_mode
CGI
PHP-FPM-et (FastCGI Process
Egyébként ez azt jelenti, hogy a PHP-FPM önmagában nem alkalmas a fájlok tulajdonosaik jogaival való futtatására? Tehát kell FPM mellé suexec?
Amit te akarsz, azt úgy
Nem ismerem, csak ezt a topikot látva futottam át a leírását, de nekem úgy tűnt, az is csak virtualhost-hoz/userdir-hez tud önálló usert rendelni, de olyat, mint op.rendszer szinten a suid bit beállításával... nekem úgy tűnt, olyat az sem tud.
A PHP-FPM-et meg a jelenleg rendelkezésemre álló linuxon nem tudtam beüzemelni.
oprendszer szintű jogok
Használhatsz open_basedir -t is, amivel pl fopen-nel vagy file_get_contents függvénnyel nem tudnád megnyitni a passwd fájlt, de system-mel továbbra is. Marad a függvénytiltás. Illetve janoszen említette a virtualizációt. Vagy van a "chroot", amivel bezárhatod a usert egy könyvtárba. És oda olyan fájlokat teszel, amiket egy részt muszáj, más részt amit még nem sajnálsz. Ezzel a témával foglalkozom egy ideje, de idáig még nem jutottam el. Janoszen tudna több infóval szolgálni. Mivel ő írta azt a bejegyzést is, amiből én is tanultam az fpm-ről. Bár csak egyszer próbáltam ki chroot-tal.
A usert viszont, aminek a nevében a php futni fog, nem a fájl jogosultságával kell állítani. Hanem a php-fpm.conf -ban. A fájl joga csak annyit ér, hogy ha a userednek nincs megfelelő joga a fájlra, akkor nem fogod tudni futtatni.
Na szóval összegezve a lényeg: Nem kell suexec, sem suphp az adott user nevében futtatáshoz, de a jogosultságokat oprendszer szinten kell kezelned. Illetve a php beállításait állíthatod "pool-onként".
Ennyit tudtam hozzászólni. De az ismerkedés még folyamatban van ezekkel a megoldásokkal.