Для работы, да и просто для экспериментов, часто требуется отдельный сервер/VDS или же просто хостинг с Linux/Apache/MySQL/PHP, но аренда стоит определенных тугриков, а бесплатные решения в сети имеют множество ограничений, поэтому имеет смысл соорудить свой собственный виртуальный LAMP-сервер на домашнем/рабочем компьютере.
Сразу оговорюсь на счет терминов: хост это наш компьютер, на который мы поставим виртуальную машину (с Ubuntu Server), называемую гостевой системой.
В качестве виртуальной машины (ВМ) будет использоваться VirtualBox, операционной системой хоста (т.е. нашего компьютера) у нас уже стоит десктопная Убунта, а в качестве гостевой системы возьмём Ubuntu Server (на момент написания поста — Ubuntu Server 10.04 LTS), которая хороша тем, что в ней всё лишнее, для сервера, выпилено.

Если операционной системой хоста является Windows, то эта статья так же будет полезна, ведь основная настройка производится именно на гостевой системе.

Программа действий следующая:

• Создать и настроить виртуальную машину, в которой будет работать наша гостевая система
• Установить Ubuntu Server, как гостевую систему
• Настроить в гостевой системе Apache/MySQL/PHP/PhpMyAdmin
• Настроить общий доступ к файлам гостевой системы из хоста

И так начнём:

1) Качаем свежий образ Ubuntu Server

2) Подключаем «родной» репозиторий VirtualBox-а (раздел «Debian-based Linux distributions»), и ставим сам пакет. Подключение репозитория нужно, чтобы иметь самую свежую версию виртуальной машины, свежее, чем в репозиторий Ubuntu.
Думаю, с подключением репозитория и установкой пакета, ни у кого не возникнет проблем. На Windows этот шаг, конечно, пропускается.

3) В VirtualBox, через кнопку «Создать», cоздаём виртуальную машину, в которой будет вертеться Ubuntu Server, со следующими параметрами (которые используются у меня):

Имя: LAMPUbuntu (для примера)
Операционная система: Linux
Тип ОС: Ubuntu
Размер видеопамяти: 12 МБ (по умолчанию)
Размер основной памяти: 512 МБ (потом можно изменить по своим потребностям)
Тип образа жесткого диска: Динамически расширяющийся образ (образ будет меньше занимать места)
Расположение: LAMPUbuntu (лучше оставить, как есть)
Размер: 2 Гб (размера виртуального жесткого диска)

4) После создания виртуальной машины, нужно донастроить её.

В свойстве «Система» > «Материнская плата» убираем дискету из очереди загрузки и обязательно ставим первой CD/DVD-ROM.
Так же снимаем галку в «Аудио» > «Включить аудио», зачем оно на сервере? :)
В свойствах «Носители» > «IDE контроллер» и в «SATA контроллер» проверяем, стоят ли галочки «Кеширование операций ввода/вывода», если нет — ставим.
И наконец, в свойстве «Сеть» нашей виртуальной машины ставим:
• Тип подключения «Сетевой мост»
• Имя адаптера (по умолчанию «eth0»)
• Тип сетевого адаптера в «PCnet-FAST III (Am79C973) (в подразделе «Дополнительно»)
• Галку «Кабель подключен».

Хочу сразу сказать, что при типе подключения «Сетевой мост» ваша гостевая система будет «видна» в сети, как отдельный компьютер, и с ней возможна инициация соединения не только с хоста, но и из сети.

Так же замечу, что в будущем, уже при настроенной гостевой системе, МАС-адрес её сетевого адаптера желательно не трогать (в сетевых настройках виртуальной машины), т.к. каждый раз, после смены МАС-а, гостевая система будет считать, что её сетевую карту поменяли на другую и, соответственно, присвоит сетевому интерфейсу новое имя — на единицу больше предыдущего (например, с прежним MAC-ом было eth0 — с новым стало eth1 и т.д.).

А это чревато тем, что сеть в гостевой ОС перестанет работать, ведь в её настройках указан старый сетевой интерфейс, и поэтому, чтобы сеть продолжала нормально функционировать после смены MAC-а, так же придётся исправить имя сетевого адаптера на новое в /etc/network/interfaces, либо чистить содержимое /etc/udev/rules.d/70-persistent-net.rules (там лежат соответствия MAC-ов сетевых карт и имён сетевых интерфейсов).

5) Скачанный образ iso, с дистрибутивом Ubuntu Server, надо добавить в число доступных образов для виртуальных машин, через меню «Файл» > «Менеджер виртуальных носителей» > «Образы CD/DVD».
Затем, в свойствах «Носители» нашей виртуальной машины, в «IDE контроллер» > «Пусто» > «Привод» нужно указать наш образ Убунты , либо реальный привод CD/DVD-привод с диском нашего дистрибутива.

6) Установка Ubuntu Server не должна вызвать проблем, но на всякий случай пройдемся по основным моментам:

Исключительно для статьи, в качестве всех логинов и паролей будем использовать слово developer (Привет Стивену Балмеру :))
На практике, из-за соображений безопасности, этого делать НЕ РЕКОМЕНДУЕТСЯ!

• При настройке сети указываем имя компьютера — development (для примера)
• Вариант разметки диска на Ваше усмотрение, но если не уверены, то используйте вариант «Авто — использовать весь диск»
• Полное имя пользователя, учетной записи и пароль — developer
• Вид обновления — на Ваш вкус, но лучше держать систему актуальной через «Устанавливать обновления безопасности автоматически»
• При выборе программного обеспечения выбираем «LAMP server» (это набор Apache+MySQL+PHP) и «OpenSSH server».
• Задаём пароль root-а для MySQL — всё тот же developer :)
• Соглашаемся с установкой Grub-а и перезагрузкой
• После загрузки гостевой системы, отключаем её через меню «Машина» > «Выключить через ACPI» либо после логина отключаем через команду:

sudo shutdown -h 0

7) Теперь осталось отключить загрузку с CD/DVD-ROM. Это делается через свойства BM «Носители» > «IDE контроллер» > «ubuntu-10.04-server-i386.iso» (название вашего образа) > «Привод» > устанавливаем в «Пусто».

8) Запускаем наш виртуальный Ubuntu Server, логинимся и запускаем обновление пакетов:

sudo apt-get update
sudo apt-get upgrade

9) Теперь нужно настроить сеть на гостевой Ubuntu Server. По умолчанию, сетевой интерфейс гостевой системы настроен получать IP через DHCP, но нам нужен статический IP-адрес. Поэтому, на Ubuntu Server, под рутом запускаем mc (или любимый редактор) и идём править /etc/network/interfaces, в котором вместо строк:

auto eth0
iface eth0 inet dhcp

пишем следующее:

auto eth0
iface eth0 inet static
# статический IP нашего виртуального сервера
address 192.168.1.50
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
# и гейт (например, LAN-модем), откуда будем брать инет :)
gateway 192.168.1.1 

теперь перезапустим сетевые службы гостевой системы с новыми настройками:

sudo /etc/init.d/networking restart

и проверим их у нашего адаптера eth0:

ifconfig -a

Далее, с нашей системы-хоста проверим пинг до гостевой системы Ubuntu Server (с адресом 192.168.1.50) и пинг из гостевой системы до любого домена в интернете. Если пинги идут нормально, то сеть функционирует нормально.

10) Теперь, займемся Apache-м.

Первым делом, проверим работу веб-сервера Apache на гостевой системе, набрав в адресной строке браузера IP-адрес гостевой системы — http://192.168.1.50/. Апач поприветствует нас следующим сообщением:

It works!
This is the default web page for this server.
The web server software is running but no content has been added, yet.

Теперь, когда видно, что Апач работает :), настроим на нём первый виртуальный хост, и назовем этот домен, например, dev.i

Первым делом, на хосте, отдельной строкой добавим в файл /etc/hosts запись о новом домене (на Windows-хостах в %SystemRoot%\system32\drivers\etc\hosts):

192.169.1.50    dev.i www.dev.i

Тем самым, с хоста можно будет обращаться к гостевой системе не только по IP, но и имени конкретного домена.

Далее, в гостевой системе, под рутом, добавляем в /etc/apache2/httpd.conf конфигурацию нового виртуального хоста:

NameVirtualHost 192.168.1.50:80
<VirtualHost 192.168.1.50:80>
	ServerAdmin webmaster@localhost
	ServerName dev.i
	ServerAlias dev.i www.dev.i
	DocumentRoot /home/developer/www/dev.i/htdocs/
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /home/developer/www/dev.i/htdocs/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>

	ScriptAlias /cgi-bin/ /home/developer/www/dev.i/cgi-bin/
	<Directory "/home/developer/www/dev.i/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>

	ErrorLog /home/developer/www/dev.i/logs/error.log

	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn

	CustomLog /home/developer/www/dev.i/logs/access.log combined

</VirtualHost>

При чём, директива NameVirtualHost описывается лишь один раз в начале файла, а конструкция <VirtualHost 192.168.1.50:80>…</VirtualHost> для каждого домена создается своя.

Затем, в гостевой системе, в домашней папке пользователя developer создадим структуру директорий для нашего домена:

mkdir /home/developer/www
mkdir /home/developer/www/dev.i
mkdir /home/developer/www/dev.i/htdocs
mkdir /home/developer/www/dev.i/logs
mkdir /home/developer/www/dev.i/cgi-bin

Как видно по структуре папок и настройкам в конфигурации виртуального хоста (выше) — логи доступа и ошибок будут лежать в папке logs и у каждого виртуального хоста они будут свои.

После создания структуры папок, в /home/developer/www/dev.i/htdocs для нашего сайта создадим индексный файл index.php:

<?php phpinfo();?>

Осталось перезапустить Apache для вступления в силу новых настроек, что мы и сделаем:

sudo /etc/init.d/apache2 restart

Чтобы проверить работу PHP на гостевой системе, с Ununtu-хоста, в браузере, откроем адрес http://dev.i/ и получим информацию выданную командой phpinfo().

11) Наконец, очередь дошла и до phpmyadmin.

Ставим этот чудесную утилиту для администрирования MySQL:

sudo apt-get install phpmyadmin

Во время установки phpmyadmin нас попросят выбрать веб-сервер, который мы используем, указываем, конечно, Apache2.
Затем соглашаемся установить и настроить базу данных для работы phpmyadmin, для чего вводим пароль административного пользователя MySQL (root-a), который мы уже задали на стадии установки системы (это слово developer) и пароль для соединения phpmyadmin-а к MySQL (опять таки developer :)). Второй пароль нужен затем, чтобы phpmyadmin, который в процессе установки создает свою служебную базу и своего одноименного пользователя, мог подключаться к своей рабочей MySQL-базе.

Если установка phpmyadmin прошла с ошибками, то его можно переустановить следующим образом (с удалением конфигурационных файлов):

sudo apt-get remove phpmyadmin
sudo dpkg -P phpmyadmin
sudo apt-get install phpmyadmin

Заходим через браузер с хоста по адресу http://192.168.1.50/phpmyadmin/ или по http://dev.i/phpmyadmin/ и радуемся жизни.

Теперь несколько слов о «Shared Folders», т.е. об общих папках. Владельцам хостов с Windows можно пропустить следующие абзацы про SSHFS и смело использовать «Shared Folders».

Честно говоря, реализация шар у VirtualBox мне никогда не нравилась, поэтому под Linux-хостом мы пойдем другим путём.

Как Вы помните, я рекомендовал, во время установки гостевой Ubuntu Server, поставить ещё и OpenSSH server. Он нам понадобится для подключения и удаленного управления файлами гостевой системы по протоколу SSH. Т.е. можно будет примонтировать удаленную папку гостевой системы на файловой системе хоста и работать с ними, как с локальными файлами.
Для этого, в системе компьютера-хоста, нужно установить пакет SSHFS:

sudo apt-get install sshfs

и для понимания прочитать пару абзацев здесь: SSHFS — Secure SHell FileSystem.

Монтирование папки гостевой системы со виртуальными хостами к файловой системе хоста будет выглядеть так:

sshfs developer@192.168.1.50:/home/developer/www/  /путь_на_хосте/куда_монтировать -p 22

где -p 22 — это порт OpenSSH в гостевой системе (который можно поменять в /etc/ssh/sshd_config, например на 2022, дабы запутать посторонних :))

а размонтировать можно так:

fusermount -u /путь_на_хосте/куда_смонтировано/

Команды монтирования и размонтирования лучше засунуть в два скрипта и держать под рукой, правда размонтирование требуется редко, ведь после выключения гостевой системы смонтированная папка отваливается сама.

Вот как-то так…

Кстати, вовсе необязательно использовать «Shared Folders» или монтирование папок, если конечно Вам не нужна какая либо IDE — можно работать прямо в консоли гостевой системы.

Для этого, в гостевой нужно всего лишь изменить разрешение в консоли на большее (через Grub2, правкой /etc/default/grub — подробнее можно найти в интернете), поставить любимый консольный редактор или Midnight Commander и работать не выходя во вне :)