Статья написана для журнала
GNU/Linux имеет много преимуществ, но именно возможность мгновенного преобразования бюджетного компа в полнофункциональный Web-сервер позволила этой операционке ворваться в домашние сети и на корпоративный рынок. Если ты планируешь развернуть web-сервис на базе архитектуры LAMP в интранет/интернет, эта статья — для тебя.
Установка Ubuntu Server Edition
За аббревиатурой LAMP скрывается конфигурация Linux, Apache, MySQL, PHP/Perl/Python (плюс сюда часто добавляют и Ruby On Rails). В статье остановим свой выбор на Ubuntu Server Edition 8.04.1 LTS. Почему именно он? Причин несколько. Во-первых, Ubuntu — один из самых дружелюбных дистрибутивов, начинающему администратору с ним будет легче разобраться. Во-вторых, быстрота развертывания: весь процесс займет примерно 30 минут вместе с установкой сервера. В-третьих, ядро Ubuntu Server Edition (версии 2.6.24) специально оптимизировано для работы на сервере за счет использования Tickless (этот режим приводит к уменьшению энергопотребления и тепловыделения), No Preemption (время отклика для интерактивных задач не уменьшается), Deadline I/O (планировщик, минимизирующий задержки ввода/вывода и обеспечивающий поведение, близкое к реальному времени), PAE (поддержка аппаратной технологии, с помощью которой программы на 32-разрядных серверах с процессорами IA-32 могут адресовать физическую память свыше 4 Гб), 100Hz (таймерное прерывание). Кроме того, поддержка LTS версии заявлена на 5 лет (до апреля 2013), а значит, все это время разработчики обязуются выпускать обновления. Такой увеличенный период технической поддержки полностью отвечает требованиям современного бизнеса.
Большая часть сказанного будет действительна для Debian и некоторых других дистрибутивов, использующих APT. Сервер будем ставить в такой конфигурации:
— Apache 2 — веб-сервер;
— MySQL 5 — сервер баз данных;
— PHP5 — PHP CGI.
Процесс установки системы происходит в псевдографической среде, и трудностей обычно не вызывает, поэтому по этапам пробежимся поверхностно. Чтобы все сообщения системы выводились на русском языке, в загрузочном меню нажимаем <F2>. После выбора региона и установки раскладки клавиатуры будет произведена автоматическая настройки сети с помощью DHCP. Если такого сервера нет, выбираем пункт «Настроить сеть вручную» и последовательно вводим параметры: IP-адрес, маску подсети, IP-адрес шлюза, адреса DNS серверов (через пробел), имя компьютера и домена. Далее выбираем в списке часовой пояс, и наступает самый важный этап – разметка диска. Мастер предлагает четыре варианта: автоматическая разметка, LVM (обычный и шифрованный) и ручной труд. Каждый имеет свои плюсы и минусы, если есть сомнения, здесь же доступна справка, которая поможет определиться с выбором. При автоматической разметке скрипт создает swap раздел, равный 1.5 объема ОЗУ (с конца диска), все остальное место форматируется как ext3 и монтируется как корневой раздел. Новичкам такая схема вполне подойдет. При ручной разметке лучше вынести на отдельный раздел (диск) /var, в котором будут храниться данные веб-сервера, базы данных и журналы. Для этого раздела больше подойдет файловая система ReiserFS. Она обеспечивает улучшенную производительность при работе с большим количеством маленьких файлов. Правда в Ubuntu есть одна особенность — каталог /var/run обязательно должен быть на корневой файловой системе, иначе некоторые сервера просто не будут загружаться. Еще предпочтительнее создать отдельные разделы /var/log и /var/www. Если планируется разрешить пользователям создавать публичную веб-папку (об этом чуть ниже), тогда имеет смысл вынести и /home. Под корневой раздел достаточно отвести 3-4 Гб. Если четко определить, сколько необходимо места под каждый раздел, затруднительно, в этом случае следует присмотреться к менеджеру логических томов LVM.
После установки базовой системы создаем учетную запись пользователя, который будет одновременно и суперпользователем (через sudo). Мастер установки предлагает 7 готовых конфигураций сервера: DNS, LAMP, Mail, OpenSSH, PostgreSQL, Print и Samba.

После выбора любого варианта на выходе получаем готовое решение. Новички могут воспользоваться таким предложением. Но чтобы полностью контролировать процесс, лучше все компоненты установить самостоятельно. Тем более в репозитарии дистрибутива, как правило, находятся пакеты посвежее, и при обновлении дистрибутива все равно эти файлы придется качать. Если дальнейшую настройку планируется производить удаленно, ставим только «OpenSSH server». Остальные действия скрипт произведет уже без нашего участия. Спустя некоторое время получим сообщение о том, что установка сервера успешно завершена.
Настройка сервера
Один из сетевых интерфейсов уже настроен во время установки. Если сервер имеет несколько сетевых карт, их необходимо сконфигурировать вручную. Открываем файл /etc/network/interfaces и правим:
$ sudo nano -w /etc/network/interfaces
auto lo
iface lo inet loopback
# Интерфейс eth0 настраивается автоматически посредством DCHP
auto eth0
iface eth0 inet dhcp
# Параметры eth1 указываем самостоятельно
auto eth1
iface eth1 inet static
address 192.168.0.200
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1

Перезапускаем сеть:
$ sudo /etc/init.d/networking restart
Теперь в /etc/hosts прописываем соответствие имени узла и IP-адреса. Например:
$ sudo nano /etc/hosts
192.168.0.200 web.server.com web
Аналогично добавляем записи и для остальных узлов (в том числе и виртуальных), с которыми будем «общаться».
После установки системы в /etc/hostname должно быть прописано имя узла. Если вывод команды «hostname» не соответствует должному, редактируем этот файл.
Установку пакетов будем производить из сетевого репозитария, поэтому в файле /etc/apt/sources.list строка «deb cdrom:[Ubuntu-Server 8.04 _Hardy Heron_ — Release i386 (20080701)]/ hardy main restricted» должна быть закомментирована. Т.к. мы не планируем ничего самостоятельно компилировать, то комментируем и строки, начинающиеся с «deb-src«. Остальное оставляем, как есть.
В некоторых случаях AppArmor, отвечающий за защиту системы, слишком рьяно выполняет свои обязанности. Например, при установке ispCP, AppArmor напрочь блокировал работу сервисов. При построении безопасной системы можно обойтись и без него. Поэтому если обнаружится какая-то проблема, останавливаем AppArmor:
$ sudo /etc/init.d/apparmor stop
Если после этого проблема решена, отключаем автозагрузку AppArmor или совсем его удаляем:
$ sudo update-rc.d -f apparmor remove
$ sudo apt-get remove apparmor apparmor-utils
Обновляем список пакетов и затем полностью систему:
$ sudo apt-get update
$ sudo apt-get upgrade
Если SSH сервер во время инсталляции системы не устанавливался, делаем это сейчас. Заодно установим пакет «ntp«, который обеспечит нам автоматическую синхронизацию времени:
$ sudo apt-get install openssh-server ntp ntpdate
Новичкам для правки файлов и навигации, возможно, удобнее будет использовать файловый менеджер Midnight Commander:
$ sudo apt-get install mc console-cyrillic
Теперь достаточно набрать «mc», и появится окно удобного файлового менеджера, подобного старому доброму нортону. Второй пакет необходим для локализации консоли, иначе сообщения, выводимые на русском, будут не читаемы. В 8.04.1 ссылка для автоматической загрузки console-cyrillic отсутствует, поэтому следует либо каждый раз запускать его вручную, либо переконфигурировать пакет. Вводим:
$ sudo dpkg-reconfigure console-cyrillic
Скрипт задаст несколько простых вопросов касательно переключателя раскладки, шрифта, кодировки (Unicode) и автоматической установки настроек при старте системы.
Итак, «L» уже готов к работе, остался «AMP».
Установка мускула, апача и PHP
Ставим пакеты для MySQL:
$ sudo apt-get install mysql-server mysql-client
В процессе установки должен появиться запрос на ввод пароля администратора базы данных. Если этого не произошло, устанавливаем пасс самостоятельно:
$ sudo mysqladmin -u root password пароль
Пробуем подключиться к базе данных и получить список таблиц:
$ mysql -u root -p
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.0.51a-3ubuntu5.1 (Ubuntu)
mysql> use mysql;
mysql> show tables;
mysql> quit;

В настройках по умолчанию мускул будет отрабатывать только локальные подключения:
$ cat /etc/mysql/my.cnf | grep bind-address
bind-address = 127.0.0.0
Проверяем, прослушивается ли порт 3306/tcp:
$ netstat –ant | grep 3306
tcp 0 0 127.0.0.0:3306 0.0.0.0:* LISTEN
Из соображений безопасности можно отключить этот порт и использовать локальный сокет mysql.sock. Для этого добавим в секцию [mysqld] файла /etc/mysql/my.cnf директиву «skip-networking» и перезапустим сервер:
$ sudo /etc/init.d/mysql restart
Установка веб-сервера Apache довольно проста:
$ sudo apt-get install apache2
Теперь настала очередь PHP5. Не забываем модуль для работы с мускулом:
$ sudo apt-get install php5 libapache2-mod-php5 php5-mysql
Зависимости и остальные компоненты apt-get подхватывает самостоятельно, и в большинстве случаев того, что есть, достаточно. Хотя некоторые модули веб-сервера по умолчанию не подключаются. Список всех доступных модулей можно получить, введя:
$ sudo a2enmod
Как вариант, просто смотрим листинг каталога /etc/apache2/mods-available. Чтобы сделать активным любой из модулей, следует создать символическую ссылку в подкаталог /etc/apache2/mods-enabled (что, собственно, и делает команда a2enmod). Давай посмотрим, что собой представляют файлы, отвечающие за поддержку PHP:
$ cat /etc/apache2/mods-available/php5.conf
<IfModule mod_php5.c>
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps
</IfModule>
$ cat /etc/apache2/mods-available/php5.load
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

Если используется другой дистрибутив, или связка Apache + PHP5 собиралась вручную, обязательно проследи, чтобы в /etc/apache2/httpd.conf (apache2.conf) присутствовали эти строки. Модуль для работы PHP уже активирован:
$ sudo a2enmod php5
This module already enabled.
Для некоторых задач, возможно, потребуются дополнительные модули PHP (полный список пакетов php5-*, доступных в репозитарии, можно получить, введя «sudo apt-cache search php5»):
$ sudo apt-get install php5-gd php5-imagick php5-pspell \
php5-recode php5-xmlrpc php5-xsl php5-mcrypt \
php5-memcache php5-curl php-pear php5-imap php5-snmp
Перезапускаем веб-сервер:
$ sudo /etc/init.d/apache2 reload
Набираем в браузере строку http://localhost, в ответ мы должны увидеть надпись «It works!».

Чтобы проверить работу PHP, создаем файл test.php и пробуем к нему обратиться:
$ sudo echo ‘<?phpinfo()?>’ > /var/www/test.php
$ lynx http://localhost/test.php
В ответ должны получить таблицу с настройками PHP.

Если это не так, следует просмотреть журналы веб-сервера, расположенные в каталоге /var/log/apache2. В них обычно выдаются информативные подсказки.
При первом запуске веб-сервера в консоли выводится сообщение о том, что индеец не может определить доменное имя данного хоста: «apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName». Чтобы его убрать, следует установить значение переменной ServerName в apache2.conf. Хотя в Ubuntu эта настройка вынесена в отдельный файл /etc/apache2/conf.d/fqdn.
$ sudo nano etc/apache2/conf.d/fqdn
ServerName web.server.com
Поддержка MySQL в PHP обеспечивается наличием в каталоге /etc/php5/apache2/conf.d файлов mysql.ini и mysqli.ini. Каждый состоит всего из одной строки. В mysql.ini содержится запись «extension=mysql.so«, а в mysqli.ini — «extension=mysqli.so«. Если эти файлы в твоем дистрибутиве отсутствуют — не беда. Просто сними соответствующие комментарии в php.ini:
$ sudo nano /etc/php5/apache2/php.ini
; Максимальный размер загружаемого файла. Вспомни о нем, когда WordPress откажется понимать файл большего размера.
upload_max_filesize = 6M
; Подключение модулей для работы с MySQL
;extension=mysql.so
;extension=mysqli.so
; Безопасный режим запрещает скриптам производить любые действия, которые являются небезопасными для Web-сервера (будь внимателен, не все CMS его любят)
safe_mode=on
; Перечень функций, использование которых запрещено в пользовательских скриптах
disable_functions=system,exec
Вообще параметров в php.ini довольно много, советую уделить некоторое время их изучению.
Настройка виртуальных хостов
Веб-сервер Apache разрешает использование нескольких вариантов выделения пользователям места под собственный веб-сайт. Самый простой из них — это подкаталог в корне веб-сервера. Например, создаем каталог /var/www/site1, теперь к нему можно обратиться как http://localhost/site1. Но это не всегда удобно, т.к. каждый сайт обычно имеет свое уникальное доменное имя. Еще один вариант — разрешить пользователям, имеющим учетные записи в системе, самостоятельно создавать веб-ресурсы. Активировать такую функциональность можно при помощи параметра UserDir. Вариантов как обычно несколько, чаще всего под веб-сервис используют подкаталог public_html в домашней директории пользователя. Заносим в apache2.conf строку:
UserDir public_html
И подгружаем модуль userdir:
$ sudo a2enmod userdir
Эта команда соответствует добавлению в apache2.conf таких строк:
LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so
…
<IfModule mod_userdir.c>
UserDir public_html
UserDir disabled root
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
</Directory>
</IfModule>
Теперь достаточно любому пользователю создать в своем домашнем каталоге подкаталог public_html и выставить нужные права «mkdir -m 755 ~/public_html», как его содержимое будет доступно по адресу http://localhost/~user. Немного поэкспериментировав с UserDir (за детальным описанием и примерами обращайся к (httpd.apache.org/docs/2.2/mod/mod_userdir.html), адрес можно сделать более приятным глазу.
И третий самый популярный вариант — виртуальные хосты. В этом случае все узлы, висящие на одном IP (и одном Apache), будут иметь свое имя, по которому веб-сервер и определит, из какого каталога следует отдавать файл.
Управление виртуальными хостами в Apache организовано аналогично модулям, т.е. в /etc/apache2/sites-available помещаем файл с описанием, а командой a2ensite с названием файла его включаем. Да, конечно, нам под силу описать все узлы в apache2.conf, но это не очень удобно. Просмотрев список ссылок в sites-enabled, можно быстро узнать, сколько сейчас виртуальных серверов активно, и при необходимости легко включить или отключить любой из них.
В sites-available уже находится файл default, который описывает узел по умолчанию. Его можно использовать как шаблон (этот же узел будет отвечать, если к серверу обратиться по IP-адресу, а не по имени):
$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/server.com
$ sudo nano /etc/apache2/sites-available/server.com
NameVirtualHost server.com
<VirtualHost server.com>
ServerAdmin webmaster@server.com
# Каталог виртуального хоста
DocumentRoot /var/www/server.com
<Directory /var/www/server.com>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
# Для CGI скриптов
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory «/usr/lib/server.com/cgi-bin»>
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
# Журналирование событий
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log
ServerSignature On
</VirtualHost>
Смотрим, с правами какого пользователя работает веб-сервер (в Ubuntu эти данные вынесены в отдельный файл):
$ cat /etc/apache2/envvars
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
Создаем каталог, в котором будут находиться файлы сервера, устанавливаем его владельцем учетную запись www-data и включаем новый сайт:
$ sudo mkdir /var/www/server.com
$ sudo chown www-data:www-data /var/www/server.com
$ sudo a2ensite server.com
При необходимости заносим данные об имени компьютера в /etc/hosts, перезапускаем веб-сервер и пробуем зайти на server.com.
Заключение
В итоге мы получили полностью работоспособный веб-сервер с поддержкой PHP и MySQL, который можно использовать для хостинга, биллинга, форума или при разработке скриптов. Данную схему можно расширять: настроить поддержку SSL и квот, задействовать ModSecurity для защиты веб-приложений как от известных, так и еще неизвестных атак, установить Webalizer или AWStats для сбора и визуализации статистики. Тем, у кого мало опыта работы с MySQL, не помешает веб-интерфейс phpMyAdmin. Не плохо зарекомендовал себя и Webmin, позволяющий управлять всеми компонентами LAMP при помощи локализованного веб-интерфейса.
Основные конфигурационные файлы LAMP в Ubuntu
/etc/network/interfaces – настройка сетевых интерфейсов
/etc/hostname – сетевое имя узла
/etc/hosts – соответствие имени и IP (локальный DNS)
/etc/resolv.conf – IP-адреса DNS серверов
/etc/apt/sources.list – используемые APT репозитарии пакетов
/etc/mysql/my.cnf – настройка MySQL
/etc/apache2 – каталог с конфигурационными файлами веб-сервера
/etc/apache2/apache2.conf – основной файл настройки Apache
/etc/apache2/conf.d/fqdn – имя (ServerName) веб-сервера по дефолту
/etc/apache2/envvars – основные переменные Apache
/etc/apache2/sites-available/default – сайт по-умолчанию
/etc/php5 – файлы настроек PHP5
Permalink
//
Спасибо большое за статьи и за блог, было интересно почитать, сейчас буду ставить и настраивать.
//
Мужик, статья супер!!!!!!!! Главное все команды на удивление работают и у меня, а в описаниях всё понятно. СПАСИБО!!!
//
Супер!!!!!!!!!!
Все працює, ця стаття мені дуже допомогла дякую!!!!!!!!!!!!!!!!!
//
Очень полезная статья, правда у меня 2 раза случился кернел паник, возможно ис за кривого Xen’а)
Еще очень интересует статья по настройке управляемого шлюза с контролем трафика и квотами, можете что т опосоветовать?
//
Подскажите, пожалуйста, есть какие-то другие технологии аналогичны лампе?
//
2Дмитрий Смотря, что имеется в виду. Любой компонент заменяется.
//
у меня не открывается вот это
cat /etc/apache2/mods-available/php5.conf
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps
у меня открывается вот это
SetHandler application/x-httpd-php
SetHandler application/x-httpd-php-source
# To re-enable php in user directories comment the following lines
# (from to .) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
php_admin_value engine Off
Как решить проблему?
//
Thanks for sharing your thoughts on apache.
Regards