Mit tegyünk, ha szerverünk webtárhely partícióján elfogyott a hely?

botond küldte be 2018. 06. 28., cs - 00:50 időpontban

Előfordulhat, hogy egy webszerver működtetése során elfogy a tárhely a fő partíción, amelyiken a weboldalakat tároljuk. Ez igen kellemetlen tud lenni, mert ilyenkor a legjobb esetben is minimum az összes weboldalt át kell költöztetni egy másik meghajtóra, amit újonnan csatoltunk a rendszerbe. Ez időigényes, így több leállással jár mire mindent átmásolunk az új partícióra. Rosszabb esetben pedig telepíthetjük újra az egész rendszert az új merevlemezre.

Ebben a leírásban láthatunk egy praktikusabb megoldást, a bind mount módszert, aminek a segítségével akár egy weboldalt is külön átköltöztethetünk  leállás nélkül, érintetlenül hagyva a többit. Továbbá kihasználjuk az eredeti partíciót is, mivel nem másolunk át mindent az újra. Így optimálisan gazdálkodhatunk az összes tárhelyünkkel. A módszer többféle helyzetben is alkalmazható, például:

  • VirtualBox gépünket bővítjük egy újabb virtuális merevlemezzel
  • Éles használatú szerverünket bővítjük új merevlemezzel
  • Nem bővítjük a gépet semmilyen újabb diszkekkel, hanem csak használatba szeretnénk venni a gépben már meglévő másik partíciókat, amiken több szabad hely van
  • Egy meglévő weboldalt szeretnénk különválasztani a többitől, aminek nagyobb tárhely igénye van
  • Egy új weboldalt kellene átvennünk szerverünkre, de annak már nincs elegendő tárhely az alapstruktúrában

Bármelyik helyzetbe is kerültünk ez a megoldás segít megoldani a problémát. Ebben a példában én az ISPConfig-os tökéletes szerverkörnyezetben mutatom be a harmadik esettel, amikor a rendszer már tartalmazza a szükséges nagyobb partíciót, és arra szeretnénk áttenni egy webtárhelyet. Ettől függetlenül bármilyen webszerver konfiguráció esetén működik (pl. LAMP szerverek), csak ez így életszerűbb, mivel én már ugyanígy különválasztottam egy weboldalt a szerveremen, tehát a saját bevált tapasztalataimat írom le éles használat esetére.

 

 

Tételezzük fel, hogy a /var könyvtárstruktúra és a /home könyvtárstruktúra külön partíción vannak. Az elsőben tárolódnak az ISPConfig által kezelt weboldalak fájlstruktúrái, míg a /home könyvtárstruktúra egy különálló partíción van, ahol még sok szabad hely van.

Legyen az átköltöztetni kívánt weboldalunk neve example.com, aminek a dokumentum gyökér elérése a szerveren pedig:
/var/www/clients/client1/web1/
Ez a könyvtár tehát a weboldal dokumentum könyvtára, ami többek között tartalmazza a chroot-hoz szükséges könyvtárstruktúrát, valamint ezen belül van a "web/" alkönyvtár is, ami pedig a weboldal gyökér könyvtára.

Ebben a példában fogjuk áthelyezni a webgyökér könyvtárat (/var/www/clients/client1/web1/web/) a /home struktúrába. Magát az egyel kijjebb lévő dokumentum gyökeret nem mozgatjuk, mert az a szerverkörnyezet része, és nem is foglal sok helyet, tehát csak a weboldal gyökérkönyvtárát irányítjuk át a másik partícióra.

Lépjünk be root-ként, majd alakítsuk ki a weboldal számára szükséges helyet a /home könyvtár alatt:

cd /home
mkdir example.com

Adjuk át a könyvtárat az ISPConfig-os felhasználónak:

chown web1:client1 /home/example.com
Itt én a web1:client1 példával haladok végig, de természetesen bármilyen felhasználó:csoport -nak átadhatjuk a könyvtárat, a lényeg, hogy ugyanaz legyen ennek a könyvtárnak a gazdája, mint akié a weboldal.

 

Ezután átmásoljuk magát a weboldalt ebbe az új könyvtárba. Ha éppen új weboldalt hozunk létre és még nincs tartalom a webgyökérben, akkor is hajtsuk végre a másolást, mert az ISPConfig a webtárhely létrehozásakor létrehoz néhány alkönyvtárat, pl stats/, cgi-bin/, stb. így ezeket is pontosan át kell másolni, hogy megfelelően működjön a rendszer. Ha viszont már van tartalom a webgyökérben, tehát működő weboldalról van szó, akkor annak a tartalmát majd törölni kell, hogy ne foglalja a régi partíción is a helyet.

 

Itt egyből mozgathatnánk is a webgyökér tartalmat másolás helyett, de akkor a mountolási művelet végéig nem lenne elérhető a weboldal. Tehát ha egy éles weboldalról van szó, és nem szeretnénk kapkodni, akkor a törlést ráér az utolsó pillanatban is elvégezni a mountolás előtt, hogy minimalizáljuk a weboldal kiesését. Így ha nagy adatmennyiséget kell átmásolnunk az új partícióra (pl több 10 Gbyte-nyi apró fájl, stb), a weboldal ezalatt az idő alatt is elérhető marad (még a régi helyéről).

 

Hajtsuk végre a másolást, majd állítsuk át a fájlstruktúrát a weboldal felhasználójára:

cp -r /var/www/clients/client1/web1/web /home/example.com/www
chown -R web1:client1 /home/example.com/www

Itt tehát rekurzívan átmásolunk mindent a webgyökérből, beleértve a rejtett fájlokat is.

 

Itt még megjegyzem, hogy szándékosan nem közvetlenül a /home/example.com alá másoltam a fájlokat, hanem egy www alkönyvtárba, így később szükség esetén a weboldalon kívül lehet még más fájlokat is tárolni, például amik a weboldalhoz tartoznak, de nem kell, hogy a webről elérhetőek legyenek. Így itt az új partíción még szükség esetén bármilyen könyvtárstruktúra kialakítható a webgyökér mellett.

 

Ezután nyissuk meg a /etc/fstab fájlt szerkesztésre:

nano /etc/fstab

És adjuk hozzá a következő sort, majd mentsük le (ekkor még nem lép érvénybe):

/home/example.com/www /var/www/clients/client1/web1/web none bind,nobootwait,_netdev 0 0

(Az fstab fájlban történő mountolás perzisztens marad, tehát a rendszer újraindítása után ismét végrehajtódik a csatolás.)

 

Itt természetesen be kell helyettesítenie mindenkinek a saját szituációjának megfelelő paramétereket:
  • /home/example.com/www: Fájlrendszer, ennek a helyén kell megadni az új partíción lévő elérési utat, ahova másolásra került a weboldal
  • /var/www/clients/client1/web1/web: Csatolási pont, ennek a helyére pedig jön a weboldal eredeti webgyökér könyvtára, ahova csatolásra fog kerülni az előző elérési út fizikai tartalma.

 

Így végig elérhető maradt az oldal, amíg eljutottunk idáig. A mountolás után már nem lesz hozzáférhető az eredeti webgyökér könyvtár tartalma, mivel rácsatolódik a megadott könyvtár, tehát most jöhet az eredeti tartalom törlése (a web könyvtár marad, csak a benne lévő tartalom kerül törlésre):

rm -rf /var/www/clients/client1/web1/web/{*,.*}

Célszerű ellenőrizni, hogy valóban mindent töröltünk a könyvtárból, mert később nem fog kiderülni hogy valami itt foglalja a helyet. Ezután hajtsuk végre a mount parancsot a -a kapcsolójával:

mount -a

Ha mindent jól csináltunk, akkor sikeres mountolás esetén egyből el is érhető a webről az új (fizikai) helyéről az oldal, és még csak az Apache-ot sem kellett újraindítani hozzá. Így az összes többi weboldal működése zavartalan maradt a szerveren és az áthelyezett weboldal is csak arra a pár másodpercre esett ki, amíg végrehajtottuk a törlést és utána kiadtuk a mount parancsot.

 

Ha valami okból később meg szeretnénk szűntetni a csatolást (pl hozzá kell férni az eredeti webgyökérhez vagy oldal visszaköltöztetés, stb), akkor ezt a következő paranccsal tehetjük meg rootként a rendszer újraindítása nélkül:

umount /var/www/clients/client1/web1/web

Majd töröljük a /etc/fstab fájlból a hozzáadott sort is.

 

A bind mount módszerrel tehát külön-külön bármelyik weboldal menet közben átköltöztethető a szerveren egy másik partícióra vagy új merevlemezre, hogyha kevés a webtárhely. Mint láthattuk, a művelet újraindítást nem igényel és leállással sem jár, így a gyakorlatban bármikor alkalmazható éles webszerververen is anélkül, hogy megzavartuk volna a többi weboldal működését.