Hogyan engedélyezzük az Apache2-ben a felhasználói webkönyvtárak külső elérését

botond küldte be 2019. 02. 12., k – 21:30 időpontban

Tartalom

 

Bevezető

A felhasználói webkönyvtárak (UserDir) segítségével átmeneti hozzáférést biztosíthatunk ügyfeleink számára, hogy elérhessék weboldalaikat, amíg nincs ráirányítva a megvásárolt domain név, vagy még nem is lett kiválasztva a megfelelő, stb. Ez idő alatt is elérhetővé tehetjük a weboldalakat, hogy a fejlesztési munkák gördülékenyen mehessenek már a weboldalak megnyitása előtt.

 

 

Előfeltételek

A leírás kivitelezését célszerű egy egyszerű LAMP szerveren végrehajtani, mert ezeken a szervereken az Apache webkiszolgáló többnyire még az alapbeállításokat, vagy az azokat megközelítő állapotot tartalmazza, valamint a PHP-t is Apache modulként futtatja (mod_php SAPI). Ennek megfelelően az itt lévő konfigurációt én a Debian 8 (Jessie) 1.0-ás LAMP szerveren készítem el.

 

Apache2 konfigurálása

Az Apache2 UserDir moduljának segítségével lehetőség nyílik egyetlen domain név alól elérni a felhasználók webkönyvtárait a szerveren kívülről. Ha a szerverre már mutat valamilyen domain név, akkor egy felhasználó webkönyvtára a konfigurálás végeztével a következő URL címről érhető el:

http(s)://domain.tld/~<felhasználónév>/index.php

Ha pedig nem rendelkezik domain névvel a szerver, akkor csak simán az IP-címmel is elérhető ugyanez a tartalom:

http://<szerver IP címe>/~<felhasználónév>/index.php

(IP-cím esetén többnyire csak http kapcsolat áll rendelkezésre, mert  SSL-t inkább csak domain névre szokás igényelni, de elvileg adnak ki IP-címekre is.)

Így tehát a már meglévő domain néven keresztül, vagy a szerver IP címével elérhetővé válnak a rendszerben lévő felhasználók webkönyvtárai. A böngésző címsorába ily módon beírva a webcímeket, az Apache betölti a megfelelő webkönyvtárban lévő tartalmat. Ezek a webkönyvtárak lehetnek a felhasználó home könyvtárán belül, pl.:

/home/<felhasználó>/public_html/

vagy akár azon kívül is lehet, például a /var struktúrában:

/var/www/<felhasználó>/docs/

Bárhol lehetnek ezek a webkönyvtárak, a lényeg, hogy az elérési útban valamelyik alkönyvtárként szerepeljen a felhasználó neve, ami alapján az Apache meg tudja találni a lekért URL címben lévő felhasználó alapján a megfelelő könyvtárat, valamint hogy minden felhasználónál ugyanolyan struktúrában tároljuk ezeket a webkönyvtárakat, hogy egységes legyen az összes.

UserDir modul engedélyezése

Alapból nincs engedélyezve az Apache2-ben az UserDir modul, ezért engedélyezzük root-ként az alábbi paranccsal:

a2enmod userdir

Ekkor javasolja az Apache újraindítását, de még várhatunk vele, mert előtte még átnézzük a konfigurációt.

UserDir konfigurálása

Nyissuk meg szerkesztésre a /etc/apache2/mods-enabled/userdir.conf fájlt, például a nano szerkesztővel:

nano /etc/apache2/mods-enabled/userdir.conf

Ebben "gyárilag" nálam a frissen telepített LAMP szerverben ez van:

<IfModule mod_userdir.c>
        UserDir public_html
        UserDir disabled root

        <Directory /home/*/public_html>
                #AllowOverride FileInfo AuthConfig Limit Indexes
                AllowOverride All
                Options MultiViews Indexes SymLinksIfOwnerMatch
                <Limit GET POST OPTIONS>
                        Order allow,deny
                        Allow from all
                </Limit>
                <LimitExcept GET POST OPTIONS>
                        Order deny,allow
                        Deny from all
                </LimitExcept>
        </Directory>
</IfModule>

Itt első körben a zölddel kiemelt résznek megfelelően kommentezzük ki az alábbi sort:

#AllowOverride FileInfo AuthConfig Limit Indexes

És tegyük be helyette ezt:

AllowOverride All

Ezzel engedélyezzük, hogy a felhasználói webkönyvtárban a .htaccess fájlokkal minden Apache beállítást felül lehessen írni.

Továbbá a konfiguráció UserDir direktívája után lévő "public_html" érték a lényeges még. Ez jelzi az Apache-nak, hogy a felhasználó webkönyvtára az alapértelmezett /home/<felhasználó>/public_html könyvtár alatt legyen elérhető, illetve hogy itt keresse azt. Ha ettől eltérő alkönyvtár rendszert szeretnénk használni, akkor alább láthatunk néhány példát a használatára.

Vegyük például ugyanazt az URL címet több UserDir beállítás esetén. Az URL címünk tehát:

http://<szerver domain neve vagy IP-címe>/~felhasznalo/index.html

Ezt a címet betöltve az alábbi UserDir beállítások hatására az Apache a következő alkönyvtárakra fordítja le a kérést:

UserDir /var/html

Ilyenkor a kérés fizikailag a /var/html/felhasznalo/index.html fájlra fog érkezni. Mivel itt nem használtuk fel a "*" joker karaktert, az Apache úgy értelmezi, hogy a beállított útvonal legvégén kell keresni a felhasználói alkönyvtárat.

UserDir /var/www/*/docs

Ekkor pedig a /var/www/felhasznalo/docs/index.html fájl kerül betöltésre.

És így tovább. A további részleteket az Apache ide vonatkozó dokumentációjában találhatunk.

A beállított értéknek megfelelően természetesen a konfiguráció Directory blokkjának beállítását is szinkronba kell állítani, hogy a könyvtár beállítások a megfelelő könyvtárra vonatkozzanak. Pl.:

[...]
<Directory /var/www/*/docs>
[...]

 

 

Webkönyvtár létrehozása és beállítása

Lépjünk ki root-ból és Sima felhasználóként hozzuk létre a webkönyvtárat a fenti beállításoknak megfelelően:

mkdir /home/$USER/public_html

Vagy ahova éppen beállítottuk a webkönyvtár helyét.

Lépjünk vissza root-ba, majd állítsuk át a könyvtár csoportját a www-data csoportra:

chgrp www-data /home/<felhasználónév>/public_html

(itt helyettesítsük be a felhasználó nevét)

Indítsuk újra az Apache-ot:

service apache2 restart

HTML próba

Innentől már bejönnek a felhasználói webkönyvtárakból a HTML fájlok. Próbaként hozzunk létre egyet az imént elkészült public_html könyvtáron belül sima felhasználóként:

nano ~/public_html/index.html

És dobjunk bele egy nagyon alap HTML5-ös vázat, csak hogy a megfelelő karakterkódolással az ékezetek is működjenek rendesen:

1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html lang="hu">
    <head>
        <meta charset="utf-8">
        <title>Próba oldal</title>
    </head>
    <body>
        Működik!
    </body>
</html>

Majd töltsük be a böngészőbe:

http://<szerver domain neve vagy IP-címe>/~<felhasználó>/

vagy

http://<szerver domain neve vagy IP-címe>/~<felhasználó>/index.html

Apache2 - HTML tartalom tesztelése a felhasználói webkönyvtárban

És szépen bejön a próba HTML oldal.

PHP beállítása

Ugyanez még nem mondható el a PHP fájlokról. Ha most betöltenénk a fentiekhez hasonlóan egy PHP fájlt, akkor annak a forráskódja jelenne meg szövegként, mivel az Apache-ban alapból le van tiltva a PHP fájlok futtatása a felhasználói webkönyvtárakban.

Ennek engedélyezéséhez nyissuk meg a /etc/apache2/mods-available/php5.conf fájlt szerkesztésre root-ként:

nano /etc/apache2/mods-available/php5.conf
[...]
# Running PHP scripts in user directories is disabled by default
# 
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
#<IfModule mod_userdir.c>
#    <Directory /home/*/public_html>
#        php_admin_flag engine Off
#    </Directory>
#</IfModule>

És kommentezzük ki a fájl alsó részében található IfModule rész 5 sorát, ahogyan zöld színnel is kiemeltem.

Indítsuk újra az Apache-ot:

service apache2 restart

PHP próba

Ekkor betöltve egy php fájlt, annak már a megfelelő kimenete látható:

Apache2 - PHP fájl tesztelése a felhasználói webkönyvtárban

Így mostmár működnek a HTML és a PHP fájlok is a felhasználói webkönyvtárakban.

 

 

Hátrányok

Ez mind szép és jó, de nem szabad elsiklanunk amellett a tény mellett, hogy ezzel a megoldással egy alkönyvtárban futtatjuk a weboldalt a web gyökér helyett. Ez a legtöbb HTML+PHP weboldal esetén nem gond, de egy egyedi vagy összetettebb CMS rendszer, futtatásakor vagy a végleges helyére költöztetésekor okozhat némi fejfájást.

PHP $_SERVER tömb vizsgálata

Nézzük ezt meg közelebbről a PHP $_SERVER tömb vizsgálatával.

A fentebb létrehozott php fájlunk tartalmát módosítsuk a következőre:

<?php
echo "<pre>"
    .print_r($_SERVER,true)
    ."</pre>";
?>

Futtassuk le újra a PHP fájlt:

PHP $_SERVER tömb vizsgálata a felhasználói webkönyvtárban

Majd root-ként másoljuk át ezt a php fájlt az alapértelmezett webgyökér könyvtárba:

cp /home/<felhasználó>/public_html/index.php /var/www/html/

És futtassuk le itt is:

PHP $_SERVER tömb vizsgálata az alapértelmezett webgyökér könyvtárban

A képeket megnyitva és a nyíl billentyűkkel váltogatva őket tökéletesen látszódnak a különbségek.

A lényeg tehát itt annyi, hogy ha egy weboldal PHP logikai része nem kezeli le megfelelően ezeket az elérési útvonalakat, akkor gondokat okozhatnak a működésében ezek az eltérések, amikor például áthelyezzük az oldalt a végleges helyére, ahol már a saját domain neve alól fog betöltődni, stb. A mai modern CMS rendszerek persze az ilyesmire fel vannak készítve, de számításba kell venni ezt a hibalehetőséget is, amikor például átadunk egy frissen elkészült webáruházat az ügyfélnek, de a végleges helyére költöztetve hibaüzeneteket dobál.

A .htaccess fájlok

A .htaccess fájlok is elég érzékenyek a feldolgozási helyük tekintetében, mert másképp viselkednek a webgyökér könyvtárban és másképp egy alkönyvtárban. Mint ahogy a fentebbi PHP példánál, itt is számít, hogy hol kerül feldolgozásra a .htaccess fájl.

Példának okáért, a mai modern és divatos SEO-barát URL-eket az Apache rewrite moduljának köszönhetően tudják feldolgozni az Apache alapú webkiszolgálók. Ezeket pedig a weboldalak a .htaccess fájlokban lévő beállítások segítségével kezelik le. Így tehát itt sem mindegy, hogy egy alkönyvtárban (felhasználói webkönyvtár) fut-e a weboldal, vagy a webgyökérben.

Egyes CMS rendszerek a telepítésükkor hozzák létre ezeket a .htaccess fájlokat, és benne a telepítéskori körülményeknek megfelelő automatikus beállításokat, így a telepítés után történő költöztetésnél gondokat okoz a webgyökér megváltoztatása, amikor egy domain név alá költöztetjük az oldalt. Más rendszerek jobb esetben lehetőséget kínálnak az admin felületükben beállítani a weboldal futási környezetének paramétereit, ahol menet közben is módosíthatjuk ezeket.

 

Konklúzió

Láthattuk, hogy a felhasználói webkönyvtárak használata mennyire kényelmes, segítségükkel további domain nevek nélkül tehetünk elérhetővé webes tartalmakat bármelyik felhasználó alkönyvtárából, azonban ennek használatakor mindenképpen érdemes tájékozódni az építeni kívánt weboldal, CMS rendszer futtatási igényeiről, hogy mennyire okozhat ez bonyodalmat, amikor az elkészült oldalt átköltöztetjük a végleges helyére, vagy csak egy virtualhost segítségével keltjük életre a frissen ráirányított domain névvel, ami után már a webgyökérből kell futnia a weboldalnak.

Egy másik leírásban átnézzük, hogy a felhasználói webkönyvtárak használata helyett hogyan tudunk a virtualhost beállításával és a kliens oldali hosts fájlok segítségével "domain neves", éles környezetet kialakítani a domain név megléte nélkül, hogy a fejlesztés alatt álló weboldalt a végleges helyével teljes mértékben kompatibilis környezetben tudjuk futtatni.