Jelenlegi hely

Gyors fejlesztési környezet

CSÉCSY László képe

Drupallal (és sok egyébbel) való munka közben sokszor jön az igény: legalább a fejlesztésre használatos gépemen hadd dolgozzak a lehető leggyorsabban. Erre legalább háromféle lehetőség is adódik: a gép megerősítése, a munkamódszer hatékonyabbá tétele és a fejlesztői környezet optimalizálása. Most e harmadikról lesz szó.

A legtöbb webes fejlesztő gépén nem csak egy webhely fejlesztése folyik. Sokan egy-egy újabb webhelyen való munkát a helyi fejlesztői környezet kialakításával kezdik - és ezzel sokáig így voltam magam is. Randy Fay írása óta azonban a helyi fejlesztői környezetem kialakítása néhány másodpercre csökkent. Ennek három kulcseleme van:

  • csak helyben elérhető domain, amit nem kell beállítani;
  • saját felhasználó nevében futó Apache virtualhost, amit nem kell beállítani;
  • merevlemez nélkül használt MySQL.

Mivel én Frugalware Linuxot használok, így a fájlnevek, elérési utak és alapértelmezések is ennek felelnek meg - egyéb rendszereken a módszer valószínűleg ugyanígy működőképes, bár a pontos beállításokban eltérések lehetnek (lehet, hogy néhány rendszernél több extra csomagot is telepíteni kell, lásd a hozzászólásokat).

Beállítást nem igénylő helyi domain

Ötlet: hozzunk létre egy akarmi.l (és egyúttal barmi.l, valami.l, stb.) domaint, melyet csak a helyi gépen érünk el!

A megvalósításhoz kell egy DNS szerver, amit úgy állítunk be, hogy a .l domaint saját maga kiszolgálja, minden egyéb domain tekintetében pedig helyi gyorsítótárként szolgáljon. Ez a BIND esetén a következőképp történik:

  1. Hozzuk létre az /etc/named/hosts.l fájlt az alábbi tartalommal:
    $ttl 38400
    @ IN SOA l.l. admin.l. (
            2010091301
            10800
            3600
            604800
            38400 )
    l.      IN NS   localhost.
    *.l.    IN A    127.0.0.1
  2. Az /etc/named.conf fájl tartalma legyen a következő:
    options {
            directory "/var/named";
            forward first;
            forwarders {
                    8.8.8.8;
                    8.8.4.4;
            };
            allow-query { "any"; };
    };
    zone "." IN {
            type hint;
            file "caching-example/named.ca";
    };
     
    zone "localhost" IN {
            type master;
            file "caching-example/localhost.zone";
            allow-update { none; };
    };
     
    zone "0.0.127.in-addr.arpa" IN {
            type master;
            file "caching-example/named.local";
            allow-update { none; };
    };
    zone "l" {
            type master;
            file "/etc/named/hosts.l";
            notify no;
    };

    A forwarders részben feltüntetett IP-k a Google Public DNS címei; itt használhatunk tetszőleges más IP-ket is, melyeken számunkra elérhető DNS szolgáltatás üzemel (a szolgáltatónk DNS szerverét, OpenDNS-t vagy akár saját magunk által üzemeltetett másik DNS szervert - mint ahogy én is teszem).
  3. A helyi DNS szerver elindítása után már léteznie kell az akarmi.l domainnek.

Beállítás nélküli Apache virtualhost(ok)

Ötlet: az összes akarmi.l domaint szolgálja ki egy olyan, helyben futó Apache virtualhost, melyben a PHP a saját felhasználónk nevében fut!

A megvalósításhoz telepítsük a php-cgi csomagot (ha még nem lenne fenn: pacman-g2 -Sy php-cgi), és az Apache webszervert a következők szerint állítsuk be.

  1. Hozzuk létre az /etc/httpd/conf/modules.d/virtualhost-wildcard.conf fájlt az alábbi tartalommal:
    <VirtualHost *:80>
            ServerAlias *.l 
            VirtualDocumentRoot /home/boobaa/drupal/%1/
            UseCanonicalName Off
            <Directory "/home/boobaa/drupal">
                    Options FollowSymLinks
                    AllowOverride All
     
                    Order allow,deny
                    Allow from all
                    DirectoryIndex index.php
            </Directory>
            ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/
            LogLevel debug
            SuexecUserGroup boobaa users
            <Directory "/usr/lib/cgi-bin">
                    Order allow,deny
                    Allow from all
            </Directory>
            <Files ~ "\.php$">
                    AddHandler application/x-httpd-php5 .php
                    Action application/x-httpd-php5 /cgi-bin/virtualhost-wildcard.php.cgi
                    Options ExecCGI SymLinksIfOwnerMatch
            </Files>
    </VirtualHost>
  2. Hozzuk létre a /var/www/html/cgi-bin/virtualhost-wildcard.php.cgi fájlt a következő tartalommal:
    #!/bin/bash
    exec php-cgi -c /etc/php-cgi.ini "$@"
  3. A /var/www/html/cgi-bin/ könyvtár és a benne levő virtualhost-wildcard.php.cgi fájl tulajdonosa egyezzen meg a SuexecUserGroup direktívánál megadottal: chown boobaa.users /var/www/html/cgi-bin/ -R
  4. Az iménti könyvtár és fájl jogosultságait is állítsuk be: chmod 755 /var/www/html/cgi-bin/ -R

Innentől kezdve a /home/boobaa/drupal/ könyvtárban található akarmi/ könyvtár tartalma a helyi gépen elérhető lesz a http://akarmi.l/ címen - és ehhez csak a könyvtárat kell létrehozni, semmi egyéb beállítás (az /etc/hosts fájl szerkesztése, Apache virtualhost létrehozása és beállítása, stb.) nem szükséges. Drupal esetén figyelni kell azonban arra, hogy a .htaccess fájlban a RewriteBase sor elejéről le kell venni a megjegyzésjelet:
  RewriteBase /

MySQL - a lassú merevlemez nélkül

Ötlet: A lassú lemezműveletek felgyorsítására az SSD technológiát még nem engedheti meg magának mindenki, RAM viszont minden gépben van.

Megvalósítás: Használjunk RAM-drive-ot MySQL adatbázis „tárolására”!

  1. Hozzunk létre egy adatbázist: CREATE DATABASE ta;
  2. Állítsuk le a MySQL szolgáltatást: service mysqld stop
  3. Ürítsük ki a /var/lib/mysql/ta/ könyvtárat.
  4. Csatlakoztassunk ide egy tmpfs típusú fájlrendszert, például így (az /etc/fstab fájlban):
    tmpfs /var/lib/mysql/ta tmpfs defaults,noatime 0 0
    Ugyanezt parancssorból is elvégezhetjük: mount tmpfs /opt/ -t tmpfs -o defaults,noatime
  5. Indítsuk újra a MySQL szolgáltatást: service mysqld start

Innentől kezdve a ta (teszt adatok) nevű adatbázisban végzett műveletek nem járnak merevlemezművelettel, azaz sokkal gyorsabbak lesznek. A dolognak van azonban egy hátulütője: a gép kikapcsolásakor az adatbázis teljes tartalma eltűnik!

Ráadás: a webhely gyors alaphelyzetbe állítása

Telepítési profil fejlesztésekor, de sokszor egyéb helyzetekben is szükség lehet arra, hogy gyorsan elölről, a Drupal telepítéssel kezdhessük újra a munkát.

Ötlet: Használjunk egy rövid szkriptet az adatbázis kiürítésére és a beállítások törlésére.

Megvalósítás: Hozzuk létre a /home/boobaa/drupal/zzz-reset.sh fájlt az alábbi tartalommal:

#!/bin/bash
DBUSER=ta
DBPASS=ta
DBNAME=ta
chmod 755 d6/sites/default
chmod 644 d6/sites/default/settings.php
cp -f d6/sites/default/default.settings.php d6/sites/default/settings.php
mysqldump -u$DBUSER -p$DBPASS --add-drop-table --no-data $DBNAME | grep ^DROP | mysql -u$DBUSER -p$DBPASS $DBNAME

Mint látszik, az adatbázisom neve ta (ahogy fentebb beállítottam, ez RAM-drive-ról működik), s az egyszerűség kedvéért mind az SQL felhasználónév, mind a jelszó szintén ta, valamint a /home/boobaa/drupal/d6/ könyvtárban levő Drupal példányomat kifejezetten ilyen gyorsan eldobható, gyorsan felállítható fejlesztésekhez tartom.

Frissítés: automatikus aldomainek

Ha nem csak a foo.l, hanem foo.bar.l, foobar.l vagy akár foo.bar.hu.l (al)domainekre is szükséged van hasonló dinamizmus mellett a fenti funkcionalitásra, akkor a fenti
        VirtualDocumentRoot /home/boobaa/drupal/%1/
sorban helyett a %1-et cseréld %0-ra, és a könyvtárak neve legyen rendre foo.l, foo.bar.l, foobar.l vagy akár foo.bar.hu.l (azaz a .l utótagot is add meg a könyvtárak nevében).

Technológia: 

Hozzászólások

Ha esetleg nem működne az Apache konfiguráció, akkor a következő modulokra van szükség: vhost_alias, suexec, actions

Ezeket az a2enmod paranccsal lehet engedélyezni, természetesen utána Apache újraindítás szükséges.

Kell az apache2-suexec csomag is.

...vagy valamilyen forkját - ott szokás így szanaszéjjel darabolni a dolgokat. ;)

Eléggé megszívatott a "target uid/gid (1000/1000) mismatch with directory (0/0) or program (0/0)" hibaüzenet a suexec.log-ban.

Tanulság: a /cgi-bin/virtualhost-wildcard.php.cgi -nek (a könyvtárnak is!) annak a felhasználónak és csoportnak a tulajdonában kell lennie, amelyik nevében szeretnénk futtatni a PHP szkripteket.
Ezt az /etc/httpd/conf/modules.d/virtualhost-wildcard.conf fájlban adtuk meg a "SuexecUserGroup boobaa users" sorral.

Immár ezeket is tartalmazza a leírás.