Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 120, ДЕКАБРЬ 2008 г.

Волшебная лампа админа: пошаговое руководство по установке LAMP-сервера

Sergey Jaremchuk feat. Andrey Matveev




У 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-версии заявлена на пять лет (до апреля 2013), а значит, все это время разработчики обязуются выпускать обновления. Такой увеличенный период технической поддержки полностью отвечает требованиям современного бизнеса.

Большая часть сказанного будет действительна для Debian и некоторых других дистрибутивов, использующих APT. Сервер будем ставить в такой конфигурации:

  • Apache 2 - веб-сервер;
  • MySQL 5 - сервер баз данных;
  • PHP5 - PHP CGI.

Процесс установки системы происходит в псевдографической среде. Трудностей он обычно не вызывает, поэтому по этапам пробежимся лишь поверхностно. Чтобы все сообщения системы выводились на русском языке, в загрузочном меню нажимаем <F2>. После выбора региона и установки раскладки клавиатуры будет произведена автоматическая настройки сети с помощью DHCP. Если такого сервера нет, выбираем пункт «Настроить сеть вручную» и последовательно вводим параметры: IP-адрес, маску подсети, IP-адрес шлюза, адреса DNS-серверов (через пробел), имя компьютера и домена. Далее выбираем в списке часовой пояс, и наступает самый важный этап – разметка диска. Мастер предлагает четыре варианта: автоматическая разметка, LVM (обычный и шифрованный) и ручной труд. Каждый имеет свои плюсы и минусы; если есть сомнения, здесь же доступна справка, которая поможет тебе определиться с выбором. При автоматической разметке скрипт создает swap-раздел, равный 1.5 объема ОЗУ (с конца диска). Все остальное место форматируется как ext3 и монтируется как корневой раздел. Что ж, новичкам такая схема вполне подойдет.

При ручной разметке для размещения журналов событий, файлов БД и данных веб-сервера лучше создать отдельные разделы /var/log, /var/mysql и /var/www, отформатированные в ReiserFS. Эта файловая система обеспечивает улучшенную производительность при работе с большим количеством маленьких файлов. Кстати, в Ubuntu есть одна особенность: каталог /var/run обязательно должен быть расположен в корневой файловой системе, иначе некоторые сервисы просто не смогут загрузиться. Если планируется разрешить пользователям создавать публичные веб-папки (об этом чуть ниже), то имеет смысл назначить раздел для /home. Под корень достаточно отвести 3-4 Гб. Затрудняешься определить, сколько требуется места под каждый раздел? Тогда стоит присмотреться к менеджеру логических томов LVM.
После установки базовой системы создаем учетную запись пользователя, который будет одновременно и суперпользователем (через sudo). Мастер установки предлагает семь готовых конфигураций сервера: 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 (программный инструмент упреждающей защиты, основанный на политиках безопасности, подробности ищи в статье «Бронированный тукс» в X_08_2007) слишком рьяно выполняет свои обязанности. Например, при установке ispCP (смотри статью «Незаменимый помощник хостера» в X_10_2008) AppArmor напрочь блокировал работу сервисов. При построении защищенного Web-сервера можно обойтись и без него. Поэтому если обнаружится какая-то проблема, останавливаем работу профилей безопасности:

$ 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

DVD

На прилагаемом к журналу диске ты найдешь весь софт, упоминаемый в статье, а также видеоролик, где показано, как развернуть архитектуру LAMP.

INFO

Ядро Ubuntu Server Edition специально оптимизировано для работы на сервере за счет Tickless, No Preemption, Deadline I/O, PAE и 100Hz.

О повышении безопасности веб-сервера читай в статье «Возьми индейца под защиту», опубликованной в ][_10_2007.

WWW

  • Основные параметры и модули Apache расписаны в документации веб-сервера httpd.apache.org/docs/2.2.
  • Скачать Ubuntu 8.04.1 LTS Server Edition можно по ссылке на странице www.ubuntu.com/getubuntu/download.
  • Диски Ubuntu высылаются по почте всем желающим. Для заказа зарегистрируйся на странице https://shipit.ubuntu.com.
Содержание
ttfb: 7.0259571075439 ms