Tento tutoriál je již neaktuální! Doporučuji rovnou přeskočit na jeho aktualizovanou podobu.
Programujete v PHP? Využíváte při tom databáze MySQL nebo PostgreSQL? A vyvíjíte přitom ve Windows? Pokud jste na všechny otázky odpověděli ano, pak jste možná i vy narazili na problém, který jsem před časem sám řešil. Jsem Windowsář (né, to není ten problém :-)), nestydím se za to a dokonce jsem na to i hrdý. Nejsem zvyklý používat vzdálené vývojové servery, kde bych bastlil své aplikace, ale mám rád všechno hezky u sebe. Často vyvíjím na různých místech a (kvalitní) připojení k internetu není vždy dostupné. Apache, MySQL i PostreSQL mají sice své verze pro Windows, ale hlavně co se databází týče, se mi pořád nezdají jako ideální volba. Také jsem zvyklý programovat na notebooku, který často používám i k jiným věcem a pak není třeba, aby mi na pozadí běžely další služby, které nevyužívám, a zabírají pouze paměť. V neposlední řadě jsem se pořád chtěl zdokonalit v administraci linuxu, protože jako webový vývojář se linuxu stejně nevyhnu. A tak jsem dostal nápad, udělat si s pomocí VirtualBoxu vlastní lokální virtuální vývojový server v linuxu. (Jak jsem poznal ve firmě, kam jsem chvilku po mém osvícení nastoupil, nebyla to myšlenka originální. Ale jeden nový kolega mi dokonce tvrdil, že mu PostgreSQL běhá v linuxovém virtuálu rychleji než na Windows, což mě potěšilo, ale berte to prosím bez záruky.)
První idea byla taková, že si nainstaluji server, nastavím sdílení dat a všechna data nechám na Windows. Možná by takové řešení šlo opravdu udělat, ale pokud by šlo, nemyslím si, že by šlo o ideální variantu. Takže plán dvě. Data pro databáze budou na linuxu, web si nechám na Windows, abych měl kód vždycky při ruce, a budu ho přes sdílení poskytovat Apachi na linuxu. Takhle bych si už vývojový server dokázal představit, ale nakonec jsem u této varianty také nezůstal, negativa zvítězila (hlavně nemožnost nastavovat linuxová práva na souborech sdílených z Windows a nemožnost předávat ve VirtualBoxu NATem porty nižší než 1000 – i když to už novější VirtualBox umí). Dospěl jsem k názoru, že je výhodnější nechat běžet a nastavovat Apache lokálně na Windows a ve virtuálním serveru budou pouze databáze (teda já tam mám i ten Apache, když bych si potřeboval zkusit nějakou linux-only fýčuru).
Teď už se dostáváme skoro do finiše. Poslední problém byl, že jsem server i data umístil na jeden disk, neodhadl jsem jeho velikost a najednou začal padat PostgreSQL pro nedostatek volného místa. Tehdy ještě nešla jednoduše zvětšit velikost disku ve VirtualBoxu a tak jsem se rozhodl mít jeden disk pro systém a druhý pro data. Díky domu mohu i velice snadno provádět zálohy dat. Prostě si jenom zkopíruji datový disk na záložní médium.
A co se tedy nakonec povedlo vytvořit a co vám zde budu popisovat?
- server se systémem Ubuntu Server 12.04 32bitů
- PHP 5.3, Apache 2.2 s PHP
- MySQL 5.5
- PostgreSQL 9.1
- sdílení mezi Windows a Ubuntu (pro jednoduchou výměnu souborů)
Všechny části jsou volitelné, a pokud některou z nich nebudete potřebovat, instalovat si ji na vlastní server nemusíte. Línější z vás najdou na konci článku odkazy na hotový server připravený k použití.
Také bych rád upozornil, že nejsem žádný linux guru. Všechny postupy jsou vygooglené a nějak pospojované dohromady. Něco možná dělám nelogicky, zbytečně složitě, ale jako celek to funguje. Takže pokud tento článek bude číst nějaký odborník na linux, prosím o shovívavost a připadnou radu v komentářích. Děkuji…
Příprava virtuálního serveru
Nejprve musíme ve Windows nainstalovat samotný VirtualBox (for Windows hosts). Ten stáhneme z jeho oficiálních stránek https://www.virtualbox.org/wiki/Downloads. Při instalaci je potřeba nainstalovat i součást VirtualBox Networking – VirtualBox Host-Only Networking. Aktuální verze v době psaní článku je 4.1.16.
Jako server jsem hledal jednoduchý systém na instalaci a správu s množstvím tutoriálů na webu. Jako takový jsem vybral Ubuntu a protože pro server nepotřebuji X Windows, vybral jsem si edici Ubuntu Server. Pro virtuální stroj stačí 32bitová edice (na mém notebooku bych stejně ani 64bitovou edici virtualizovat nemohl). Instalační ISO obraz, který budeme potřebovat, stáhneme na adrese http://www.ubuntu.com/download/server.
Nyní můžeme spustit VirtualBox a vybráním menu Počítač – Nový spustíme průvodce, který založí náš virtuální server. Postupně v průvodci zadáme následující parametry:
- název server, všude budu používat „devel79„
- jako operační systém nastavíme Linux a Ubuntu
- paměť RAM by měla být přednastavená na 512MB, pokud není, nastavíme jí tak
- vybereme, že chceme bootovací pevný disk a Vytvořit nový pevný disk typu VDI (VirtualBox Disk Image)
- velikost disku necháme Dynamicky alokovaná a název disku „devel79„
- velikost pro systém bohatě stačí 2GB
Dokončíme průvodce, vybereme náš nový virtuální server a klikneme na tlačítko Nastavení. Virtuální server upravíme takto:
Systém
Na záložce Základní deska nastavíme:
- Pořadí bootování: 1) CD-ROM 2) Pevný disk
- odškrtneme možnost Povolit zařízení s absolutními souřadnicemi – to je kvůli tomu, že nebudeme používat USB ovladače
Obrazovka
Na záložce Video nastavíme Video paměť na minimum 6 MB.
Úložiště
- odebereme z IDE řadiče CD-ROM ikonkou pod seznamem (druhá z leva), pak odebereme celý IDE řadič (poslední ikonka)
- u SATA řadiče přidáme CD-ROM (první ikona u SATA řadič) – dáme vybrat disk a vybereme stažený ISO soubor s instalací Ubuntu Serveru
Zvuk
Odškrtneme Povolit zvuk, na serveru zvuk nepotřebujeme.
Síť
Na záložce Karta 1 zaškrtneme Povolit síťovou kartu, „Připojena k“ nastavíme na NAT. Rozklikneme „Pokročilé“ a typ síťové karty nastavíme na Intel PRO/1000 MT Desktop (82540EM), necháme zaškrtnuto Kabel připojen a klikneme na Předávání portů. V otevřeném okně klikneme na ikonu Vložit nové pravidlo (Insert) a postupně vložíme tyto tři (pokud nějakou službu nebudeme instalovat, pravidlo vynecháme):
- Název Apache, port hostitele i hosta 80
- Název MySQL, port hostitele i hosta 3306
- Název PgSQL, port hostitele i hosta 5432
USB
Odškrtneme Povolit USB ovladač.
Sdílené složky
Pokud nechceme použít jednoduché sdílení mezi Windows a Ubuntu, můžeme přeskočit. Klikneme na ikonu Přidat sdílenou složku (Insert), vybereme cestu ke složce a jako název složky zadáme „share„.
Zavřeme nastavení a kliknutím na Spustit spustíme virtuální server.
Instalace Ubuntu Serveru
Po prvním spuštění serveru nabootuje Ubuntu instalátor. Popíšu moje nastavení, které mi pro vývojový server přijde ideální, pokud máte jiné preference, upravte si je podle svého.
- vybereme jazyk instalátoru, English
- vybereme položku Install Ubuntu Server
- vybereme jazyk English – English
- vybereme zemi Other – Europe – Czech republic
- pro ni neexistuje základní nastavení, vybereme United States
- detect keyboard layout, vybereme No
- nastavíme klávesnici English (US)
- jako layout klávesnice vybereme také English (US)
- nastavení sítě, zadáme hostname, používám všude „devel79„
- zadáme jméno uživatele, u mě Developer
- zadáme username, kterým se budeme přihlašovat do systému, u všech služeb volím „devel„
- zadáme heslo, zase všude volím, „devel„
- a stejně tak i potvrzení hesla, „devel„
- pokud zadáme slabé heslo (což devel je), potvrdíme Use weak password, Yes
- na vývojovém serveru je podle mě zbytečné šifrovat data a tak Encrypt home directory dáme No
- v nastavení času Configure the clock, by měla být automaticky nastavena zóna Europe/Prague, potvrdíme Yes, nebo zvolíme No a časové pásmo vybereme sami
- rozdělení disku Partition disk, jako Partitioning method vybereme Guided – use entire disk
- vybereme disk SCSI1 – ATA VBOX HARDDISK
- necháme zapsat změny na disk Write the changes to disks – Yes
- nastavení proxy Configure proxy manager, HTTP proxy information necháme prázdné
- osobně nemám rád, když se systém sám updatuje a tak pro nastavení aktualizací How do you want to manage upgrades on this system? vybírám No automatic updates
- ve výběru software Software selection nevybereme nic (vše si nainstalujeme sami) a dáme Continue
- nainstalujeme zavaděč systému – Install the GRUB boot loader to the master boot record? – Yes
- a nakonec dokončíme instalaci Finish the instalation – Continue
Nyní můžeme počítač vypnout z menu Počítač – Zavřít – Vypnout. Zobrazíme si nastavení počítače a provedeme následující úpravy:
Na záložce Úložiště vytvoříme nový pevný disk pro data:
- klikneme na Přidat pevný disk u SATA řadič
- vybereme Vytvořit nový disk
- typ souboru bude VDI (VirtualBox Disk Image)
- velikost disku nastavíme na Dynamicky alokované
- zadáme jméno disku do Umístění, já zvolil devel79_storage a nastavíme velikost (pro mě stačí 1GB)
- nakonec klikneme na Vytvořit
Následně odebereme CD-ROM mechaniku (druhá ikonka pod seznamem úložišť). Klikneme na nový pevný disk, který jsme vytvořili, a na pravé straně se nachází Atributy, kde nastavíme Pevný disk na Sata port 1.
Pokud chceme nastavit sdílení mezi Windows a Ubuntu, musíme nainstalovat VirtualBox Guest Additions, k SATA přidáme CD-ROM mechaniku (klikneme na SATA řadič, pak je to první ikonka vedle SATA řadič – Přidat CD/DVD zařízení). Klikneme na nově přidanou CD-ROM mechaniku a v sekci Atributy klikneme na ikonku úplně vpravo u CD/DVD zařízení, zvolíme Vybrat soubor s obrazem virtuálního CD/DVD… a najdeme soubor VBoxGuestAdditions.iso, který se nachází v adresáři, kde je VirtualBox nainstalovaný.
Zavřeme nastavení a spustíme náš server.
Základní nastavení
Přihlásíme se do systému, uživatelské jméno „devel“ a heslo „devel“ (pokud jste si při instalaci nevybrali jiné). Jako první provedeme upgrade dosud nainstalovaných balíčků. Zadáme:
sudo apt-get update sudo apt-get upgrade
Příkaz sudo se vás občas zeptá na heslo. Zadejte heslo pro přihlášení do systému (v mém případě „devel“). Při upgradu se také může zobrazit dotaz na potvrzení nainstalování nových verzí, pokračujte zadáním „Y“.
Pokud jste zvyklí pracovat se správcem souborů ve stylu Norton Commander, nainstalujte si Midnight Commander:
sudo apt-get install mc
Midnight Commander poté spustíme zadáním mc (případně sudo mc s přístupovými právy jako root).
Pokud chceme používat sdílení mezi Windows a Ubuntu, musíme nainstalovat VirtualBox Guest Additions. Nejprve potřebujeme do systému dostat potřebné knihovny:
sudo apt-get install build-essential sudo apt-get install linux-headers-$(uname -r) sudo apt-get install dkms
Nyní můžeme připojit CD-ROM mechaniku a spustit instalaci a vytvořit adresář, kam sdílení připojíme:
sudo mount /dev/cdrom1 /media/cdrom cd /media/cdrom sudo sh ./VBoxLinuxAdditions.run sudo mkdir /share
Přidání disku pro data
Zadáme příkaz:
sudo lshw -C disk
Uvidíme všechny disky, které se nacházejí v systému. Nás zajímá ten druhý (spolehlivě ho identifikujeme podle velikosti – size, ta musí odpovídat velikost datového disku, který jsme přidávali v nastavení počítače a product: VBOX HARDDISK), zapamatujeme si logical name (mělo by být a v následujících příkazech počítám s /dev/sdb). Vytvoříme na disku novou primární partition:
sudo fdisk /dev/sdb n, ENTER - new p, ENTER - primary 1, ENTER - číslo partition 2x ENTER - defaultní hodnoty w, ENTER - write - zápis změn a konec sudo fdisk -l
Uvidíme všechny partition na discích a musí tam být i naše nová. Pokračujeme formátováním a připojením disku do adresáře /data.
sudo mke2fs -j /dev/sdb1 sudo mkdir /data sudo vi /etc/fstab
Soubor se nám otevře v editoru vi. Abychom mohli do souboru zapisovat, stiskneme klávesu INSERT, přesuneme kurzor na konec a na novou řádku přidáme následující text:
/dev/sdb1 /data ext4 rw 0 0
Pokud chceme nastavit sdílení mezi Windows a Ubuntu, přidáme nakonec další řádek:
share /share vboxsf rw 0 0
Nyní zmáčkneme klávesu ESC, tím se dostaneme do režimu zadávání příkazů. Napíšeme „:w“ a zmáčkneme ENTER (tím soubor uložíme – write), pak napíšeme „:q“ a zmáčkneme ENTER (tím editor ukončíme konec – quit). Pro otestování můžeme server restartovat příkazem
sudo reboot
a po zadání
ls /share
bychom měly vidět výpis souborů složky, kterou jsme ve Windows nasdíleli.
Instalace PHP
PHP v aktuální verzi (5.3) nainstalujeme příkazem:
sudo apt-get install php5-cli
Soubor s nastavením php.ini se nalézá zde /etc/php5/cli/php.ini.
Instalace a nastavení Apache s PHP:
Nainstalujeme Apache 2 a PHP:
sudo apt-get install apache2 sudo apt-get install php5
Na datovém disku vytvoříme adresář pro Apache a natavíme mu jako vlastníka uživatele devel (případně jiného, kterého jsme zvolili při instalaci serveru). Do adresáře pak zkopírujeme ukázkové soubory z instalace Apache a z původního umístění je vymažeme:
sudo mkdir /data/www sudo chown devel.devel /data/www cp -r /var/www/* /data/www sudo rm -R /var/www
Teď změníme nastavení, aby ukazovalo do nového umístění:
sudo vi /etc/apache2/sites-available/default
Stiskneme INSERT a najdeme řádek začínající DocumentRoot. Tento řádek změníme na „DocumentRoot /data/www“. Pak najdeme řádek začínající <Directory a nahradíme ho s „<Directory /data/www>“. Stiskneme ESC a napíšeme :w a :q pro uložení souboru a ukončení editoru. To samé uděláme se souborem pro SSL:
sudo vi /etc/apache2/sites-available/default-ssl
Stiskneme INSERT a najdeme řádek začínající DocumentRoot. Tento řádek změníme na „DocumentRoot /data/www“. Pak najdeme řádek začínající <Directory a nahradíme ho s „<Directory /data/www>“. Stiskneme ESC a napíšeme :w a :q pro uložení souboru a ukončení editoru. Nakonec Apache restartujeme:
sudo /etc/init.d/apache2 restart
MySQL
Nejprve nainstalujeme MySQL server a modul pro PHP:
sudo apt-get install mysql-server php5-mysql
Při instalaci se pravděpodobně zobrazí několikrát dotaz na heslo pro uživatele root. Necháme ho prozatím prázdné a pokračujeme zmáčknutím klávesy ENTER. Upravíme nastavení MySQL:
sudo vi /etc/mysql/my.cnf
Stiskneme INSERT a najdeme řádek „datadir = /var/lib/mysql“, který změníme na „datadir = /data/mysql“. Do sekce [mysqld] přidáme řádek „skip-name-resolve“. Nakonec najdeme řádek „bind_address = 127.0.0.1“, napíšeme před něj #, takže bude vypadat takto „#bind_address = 127.0.0.1“. Soubor uložíme a zavřeme klasickou kombinací ESC, :w a :q. Ještě musíme upravit nastavení AppArmor:
sudo vi /etc/apparmor.d/usr.sbin.mysqld
Najdeme řádek „var/lib/mysql/ r,“ a změníme ho na „/data/mysql/ r,“, pak najdeme „/var/lib/mysql/** rwk,“ a nahradíme za „/data/mysql/** rwk,“. Uložíme a zavřeme ESC, :w a :q. Na datovém disku vytvoříme adresář pro mysql, zkopírujeme do něj data z původního úložiště, nastavíme jim nového vlastníka mysql a po restartu MySQL serveru je vymažeme:
sudo mkdir /data/mysql sudo cp -R /var/lib/mysql /data sudo chown -R mysql.mysql /data/mysql sudo /etc/init.d/mysql restart, restartujeme server sudo rm -R /var/lib/mysql
Spustíme MySQL konzoli pod uživatelem root a všechny práva přenastavíme na uživatele devel s heslem devel (nebo si vybereme vlastního uživatele, případně můžeme ponechat roota, což se mě osobně moc nelíbí…):
mysql --user=root mysql
Do konzole zadáme následující příkazy:
CREATE USER 'devel'@'localhost' IDENTIFIED BY 'devel'; GRANT ALL PRIVILEGES ON *.* TO 'devel'@'localhost' WITH GRANT OPTION; CREATE USER 'devel'@'%' IDENTIFIED BY 'devel'; GRANT ALL PRIVILEGES ON *.* TO 'devel'@'%' WITH GRANT OPTION;
A konzoli ukončíme zadáním:
exit
Restartujeme MySQL server:
sudo /etc/init.d/mysql restart
Znovu se připojíme k MySQL konzoli, tentokrát jako uživatel „devel“ s heslem „devel“ (konzole se nás na něj zeptá).
mysql --password mysql
Vymažeme uživatele root. Pokud jste při instalaci Ubuntu zvolili jiný host name než „devel79“, upravte poslední příkaz tak, aby odpovídal vašemu host name.
DROP USER 'root'@'localhost'; DROP USER 'root'@'127.0.0.1'; DROP USER 'root'@'devel79';
Konzoli ukončíme:
exit
A server restartujeme.
sudo /etc/init.d/mysql restart
PostgreSQL
Nainstalujeme PostgreSQL server a modul pro Apache:
sudo apt-get install postgresql postgresql-contrib sudo apt-get install php5-pgsql libapache2-mod-auth-pgsql
Upravíme nastavení pro vzdálený přístup k server:
sudo vi /etc/postgresql/9.1/main/pg_hba.conf
Stiskneme INSERT, najdeme řádek „local all postgres peer“ a nahradíme ho za „local all devel peer“ (nebo místo devel jiného uživatele, kterého jsme zadali při instalaci Ubuntu). Dále nahradíme řádku „host all all 127.0.0.1/32 md5“ za „host all all 0.0.0.0/0 md5“, čímž povolíme připojení k serveru odkudkoliv. Uložíme a ukončíme editor, ESC, :w a :q.
Vytvoříme adresář na datovém disku a nastavíme mu majitele postgres.
sudo mkdir /data/pgsql sudo mkdir /data/pgsql/9.1 sudo mkdir /data/pgsql/9.1/main sudo chown postgres.postgres -R /data/pgsql
Uživateli postgres nastavíme heslo „postgres“.
sudo passwd postgres
Zadáme a potvrdíme heslo „postgres“.
Nyní se v konzoli přihlásíme jako uživatel postgres a vytvoříme nové úložiště pro databázi.
sudo su postgres /usr/lib/postgresql/9.1/bin/initdb --pgdata /data/pgsql/9.1/main exit
Otevřeme nastavení a nastavíme nové datové úložiště a adresu, na které server naslouchá:
sudo vi /etc/postgresql/9.1/main/postgresql.conf
Zmáčkneme INSERT, najdeme „data_directory = ‚/var/lib/postgresql/9.1/main'“ a nahradíme za „data_directory = ‚/data/pgsql/9.1/main'“.
Dále řádek „#listen_addresses = ‚localhost'“ za „listen_addresses = ‚*'“ a nakonec „ssl = true“ za „#ssl = true“. Uložíme ESC, :w, :q a spustíme server:
sudo /etc/init.d/postgresql start
Znovu se přihlásím jako uživatel postgres a vytvořím nového uživatele „devel“ s heslem „devel“ (nebo jiného uživatele, podle vašich preferencí).
sudo su postgres createuser devel -P
Zadám heslo „devel“ a znovu pro potvrzení. Na dotaz jestli je nový uživatel superuser, zadám „y“. Nakonec vytvoříme databázi „devel“, kterou někteří klienti vyžadují pro připojení.
createdb devel exit
Smažeme nepotřebné soubory z datového úložiště, nepotřebné soubory z instalace PostgreSQL serveru a nakonec server restartujeme.
sudo rm /data/pgsql/9.1/main/postgresql.conf sudo rm /data/pgsql/9.1/main/pg_hba.conf sudo rm /data/pgsql/9.1/main/pg_ident.conf sudo rm -R /var/lib/postgresql sudo /etc/init.d/postgresql restart
BASH skripty pro zálohování o obnovu souborů
Pro snadnou zálohu dat v rámci vývojového server (neplést se zálohou celého pevného disku) jsem napsal dva skriptíky pro zálohování a obnovu celého adresáře. Nejprve nastavíme cestu k našim skriptům do PATH:
vi ~/.bashrc
Zmáčkneme INSERT a na konec souboru připíšeme:
PATH=$PATH:~/batch export PATH
Uložíme a zavřeme ESC, :w a :q. Vytvoříme nový adresář batch v našem domovském adresáři a do něj skripty uložíme:
mkdir ~/batch vi ~/batch/backup
Zmáčkneme INSERT a vložíme následující skriptu souboru pro zálohu dat:
#!/bin/bash USAGE="Usage: backup DirToBackup" date2string() { date "+%Y%m%d.%H%M%S" } if [ $# -ne 1 ]; then ls -1 /data echo $USAGE else FILE="$1.$(date2string).tar.gz" sudo tar -pcvzf /data/backup/$FILE /data/$1 fi
Skript uložíme a zavřeme ESC, :w, :q a otevřeme skript pro obnovu dat:
vi ~/batch/restore
Zmáčkneme INSERT a vložíme:
#!/bin/bash USAGE="Usage: restore FileToRestore" if [ $# -ne 1 ]; then ls -1 /data/backup echo echo $USAGE else cd / sudo tar -pxvzf /data/backup/$1 fi
Uložíme a zavřeme ESC, :w, :q. Skriptům nastavíme práva na spouštění:
chmod a+x ~/batch/*
Vytvoříme adresář, kam se budou zálohy ukládat a nastavíme mu jako majitele uživatele „devel“ (nebo jiného, pokud jste zadali jiný název při instalaci Ubuntu).
sudo mkdir /data/backup sudo chown devel.devel /data/backup
Pro zálohu dat MySQL, PostgreSQL nebo Apache použijte následující příkazy (funguje až po restartu systému nebo odhlášení a novém přihlášení):
backup mysql backup pgsql backup www
Pro obnovu dat použijte příkaz:
backup SouborDatKObnově
Pokud zadáme pouze backup, vypíší se všechny uložené zálohy.
Nyní je server připraven k použití a můžeme ho vypnout z menu Počítač – ACPI vypnutí.
Závěr
Pokud jsme instalovali VirtualBox Guest Additions můžeme otevřít nastavení počítače a na kartě Úložiště odebrat CD-ROM mechaniku, protože ji už nebudeme potřebovat.
Při zvoleném nastavení sítě naslouchá VirtualBox na všech síťových rozhraních v počítači (v přesměrování portů lze nastavit, aby naslouchal na jednom konkrétním) a přeposílá do spuštěného serveru data přicházející na zvolené porty. Chceme-li se tedy připojit ke službě běžící na našem serveru, můžeme přistupovat přímo na localhost nebo IP adresu 127.0.0.1. Osobně mám ve Windows hosts přidán další alias pro 127.0.0.1 (jak na to například zde http://en.wikipedia.org/wiki/Hosts_(file) nebo programem UpdateHosts). U sebe mám nastaveno:
127.0.0.1 devel79
A při komunikaci se serverem pak používám místo IP adresy název hosta devel79.
DEVEL79 TRAY
Pokud chcete zkusit komfortnější ovládání vašeho vývojového serveru, rád bych vám doporučil svoji utilitu Devel79 Tray.