* Выбор ОС
На самом деле вариантов не так уж и много. Windows, Linux, BSD, Solaris. У каждой из этих операционок в плане реализации хостинга есть свои плюсы и минусы. Windows дает нам поддержку ASP и еще некоторых MS-only технологий и визуально несложное администрирование, но, в то же время, накладывает существенные ограничения на производительность и увеличивает наши затраты. Linux – достойная кандидатура, но обилие багов в ядре и наличие в паблике вполне рабочих эксплойтов стало уже закономерностью. Solaris – хорошая система, однако платная; встанет не на любое железо, да и с некоторым софтом возникают траблы. Остается BSD. Из BSD я лучше всего знаю FreeBSD, поэтому строить наш хостинг мы будем на примере этой ОС.
* Нелегкий выбор
Теперь необходимо выбрать версию операционки. На сегодняшний день существует три основных ветки FreeBSD:
4.* - Old stable (Старая стабильная ветка). Последняя версия 4.11. По сути, она уже не поддерживается.
5.* - Legacy production (Старая production-ветка). Последняя (на момент написания статьи) версия 5.4. Стабильный, зарекомендовавший себя релиз.
6.* - Production (Production ветка). Разработчики неожиданно сделали прыжок с 5.4 до 6.0, по сути не внеся никаких революционных изменений. Changelog 6.0 довольно весомый, но на практике - кроме небольшого прироста производительности на SMP ядрах – в нашем случае ничего не дает.
Итог: 4.* - уже практически мертва, в 6.* ожидается много изменений, а значит и сюрпризов. Как приятных, так и не очень. Кроме того, релиз 6.0 вышел относительно недавно, и в нем еще могут обнаружиться серьезные недочеты. Поэтому мы остановим свой выбор на 5.4. Собирать хостинговый сервер мы будем на тестовой машине – P4 2.8 Ghz, 512 DDR, 5x200 gb SATA RAID 0+1. Разумеется, если ты планируешь поднять крупный хостинг – стоит подумать о более шустром железе.
* Pre-Install
Я не буду рассказывать о том, как установить систему - это довольно просто, да и документации по этому поводу в Сети хватает. Я остановлюсь лишь на вещах, которые критически важны для нашего хостинга. Очень важно правильно разбить диск. Swap partition должен находиться как можно ближе к началу диска (физически), поэтому его нужно создавать сразу после /. Размер свопа принято рассчитывать по формуле:
Swap = количество оперативки * 2 + 20-30 MB
Я разбил диск следующим образом:
* / - 512 Мб
* Swap – 1124 Мб
* /tmp – 512 Мб
* /usr – 30 Гб
* /var – 30 Гб
* /usr/home – все остальное, в моем случае – примерно 130 Гб
При выборе установки обязательно поставь галочки у src, ports, linux, perl, compat4x.
* The beginning
Первым делом, после того как система загрузилась, проверяем, что нет никаких проблем с железом, установка прошла без сбоев, и система распознает все корректно.
Код:
# dmesg | more
# cat /var/log/messages
* Make
Так как нам предстоит компилировать ядро и кучу разнообразного софта, то сначала необходимо оптимизировать процесс компиляции. Многие часто не придают этому значения, не зная, что таким образом мы не только выигрываем время при сборке, но и оптимизируем все под наше железо и ОС. Идем в /etc/make.conf и там пишем:
Код:
Листинг файла make.conf
# Тип твоего процессора.
# Для AMD - athlon-mp, athlon-xp, athlon-4, athlon-tbird, athlon, k6-3, k6-2, k6, k5.
# Для Intel - p4, p3, p2, i686, i586/mmx, i586, i486, i386.
CPUTYPE?=p4
CPUTYPE=p4
# Совместимость с BSD 4.X
COMPAT4X=true
# Указываем дополнительные флаги
CFLAGS=-O1 -pipe -march=pentium4 -mtune=pentium4
# Говорим, что флаги включать обязательно
NO_CPU_CFLAGS=false
NO_CPU_COPTFLAGS=false
# Отключаем сборку ненужных библиотек и софта
MAKE_KERBEROS4=false
MAKE_KERBEROS5=false
NO_BIND=true
NO_SENDMAIL=true
NO_GAMES=true
# Настройки Perl
PERL_VER=5.8.8
PERL_VERSION=5.8.8
PERL_ARCH=mach
NOPERL=no
WITH_PERL=yes
WITHOUT_PERL=no
# Решаем проблемы с портами
FORCE_PKG_REGISTER=yes
* Update
В наш век разгула скрипткидисов и прочей нечисти крайне важно держать систему и софт обновленными. Исходники 5.4 обновляются очень редко, только в случае, если обнаружилась критическая уязвимость, а вот порты и документация - довольно часто. Сразу оговорюсь: в FreeBSD все надо ставить из портов. Это очень важно, поскольку в портах лежат уже адаптированные под нужную ось проги со всеми необходимыми патчами. Идем в /usr/ports/net/cvsup-without-gui и собираем порт:
Код:
# make install clean
После окончания процесса сборки нужно написать конфиг для cvsup. Идем в /etc, открываем там файл cvsupfile (я обычно переименовываю в cvsup.conf).
Код:
# Сервер, с которым будем синхронизироваться.
*default host=cvsup.FreeBSD.org
# Куда будем складывать свеженькое:
*default base=/usr
*default prefix=/usr
*default release=cvs
# Тег ветки нашей системы
*default tag=RELENG_5_4
*default delete use-rel-suffix
# Используем сжатие при передаче данных
*default compress
# Что будем синхронизировать?
# Все исходники
src-all
*default tag=RELENG_5_4
*default tag=.
# Все порты
ports-all
# Весь RTFM
doc-all
После сборки cvsup-without-gui в /usr/local/bin у тебя появился бинарник cvsup. Запускать его надо со следующими параметрами:
Код:
/usr/local/bin/cvsup -g -L 2 -z /путь/к/конфигу
Согласись, держать команды в памяти неудобно. Поэтому мы напишем скрипт и автоматизируем процесс обновлений. Создаем файл cvs_up:
Открываем его любым редактором и пишем такой скрипт:
Код:
#!/bin/sh
echo "Starting CVSup..."
case "$1" in
-t)
/usr/sbin/ntpdate -v ru.pool.ntp.org
;;
-q)
/usr/sbin/ntpdate -v ru.pool.ntp.org 2>&1 > /dev/null
/usr/local/bin/cvsup -g -L 2 -z /etc/cvsup.conf 2>&1 > /dev/null
;;
*)
/usr/local/bin/cvsup -g -L 2 -z /etc/cvsup.conf
;;
esac
echo "Packages needed to update:"
/usr/sbin/pkg_version -v |grep '<'
exit 0
Кладем скрипт в нужное место, выставляем chmod и chown:
Код:
# mv cvs_up /usr/local/sbin/cvs_up
# chown root:wheel /usr/local/sbin/cvs_up
# chmod 0700 /usr/local/sbin/cvs_up
Теперь, для того чтобы синхронизировать исходники, порты, документацию и даже время на сервере, у нас есть один скрипт, который после синхронизации еще и покажет, что обновилось. Как видишь, его можно запускать с флагом –q, который перенаправит всю отчетность скрипта в /dev/null.
Нам также понадобится утилита, которая займется апгрейдом довольно активно обновляющихся портов. Ставим portupgrade:
Код:
# cd /usr/ports/sysutils/portupgrade
# make install clean
И запускаем наш скрипт. По окончании своей работы скрипт выдаст отчет о том, какие порты требуют обновлений. Обновить софтину или библиотеку очень просто:
Код:
# portupgrade порт1 порт2 ... порт22
Если хочешь, - можешь прописать этот скрипт в cron на выполнение раз в сутки, желательно ночью, или в то время, когда нагрузка на твой сервер минимальна. Например так:
Код:
0 4 * * * /usr/local/sbin/cvs_up >/dev/null 2>&1
Лично я предпочитаю запускать его вручную, так как cvsup сервер часто не пускает с первого раза, и скрипт остается висеть в процессах, что не есть хорошо.
* <Kernel::About>
Пора приступать к самой важной части настройки системы – к ядру. При инсталле системы автоматически устанавливается ядро GENERIC. В нем включена поддержка устройств, необходимых для старта системы на любой конфигурации. Оптимизировав ядро под свою систему, мы убираем поддержку ненужных устройств и функций, уменьшая таким образом время загрузки и, что еще важнее, улучшая производительность системы в целом. Давай посмотрим, сколько весит ядро до оптимизации:
Код:
# ll /boot/kernel/kernel
-r-xr-xr-x 1 root wheel 5940286 Feb 23 2004 /boot/kernel/kernel
#
Почти шесть мегабайт - для *BSD это очень много. Для сборки своего ядра нам понадобятся исходники (src) системы. Если ты не послушал моей рекомендации и не сделал этого при установке, то вставь диск с операционкой и установи их, используя /stand/sysinstall. Не забудь после этого обновить исходники скриптом cvs_up.
* <Kernel::Config>
Конфиги ядра лежат в папке /sys/<архитектура>/conf. Если у тебя обычный PC, то в /sys/i386/conf. Заходи туда, найди там файл GENERIC и скопируй его с другим названием. Да-да, именно скопируй. Если что-то вдруг пойдет не так как надо, у нас останется рабочий конфиг. Итак, копируем:
Код:
# cd /sys/i386/conf
# cp GENERIC HOSTING
Теперь открываем конфиг HOSTING любимым редактором. Опции настройки ядра указаны в виде устройств (device) и расширений/модулей. Все строчки, которые начинаются с символа “#” – закомментированы, а проще говоря, они не будут учтены при сборке нового ядра. Наша задача - закомментировать ненужные нам строчки, оставив только необходимое (рекомендуется ни в коем случае не удалять, а именно комментировать строки конфига, иначе потом придется долго вспоминать «как же называлась эта опция, после удаления которой ничего не собирается?..» – прим. автора).
Конфиг ядра составляем по принципу “все, что не критично – не нужно”. Вряд ли хостинговому серверу так сильно необходимы USB сканер, десяток драйверов к Wi-Fi карточкам и PCIMCA. Некоторые устройства имеют статус обязательных - без них ядро просто не соберется. Они помечены комментарием required. После того, как ты закомментировал все ненужное, пришло время добавить недостающее.
Код:
Options IPFIREWALL # Включаем ipfw
Options IPFIREWALL_VERBOSE
Options IPFIREWALL_VERBOSE_LIMIT=1000
Options TCP_DROP_SYNFIN # Запрещаем SYN/FIN пакеты
Options ACCEPT_FILTER_DATA # Включаем accept фильтры
Options ACCEPT_FILTER_HTTP
Сохраняем конфиг и собираем ядро:
Код:
# cd /usr/src
# make buildkernel KERNCONF=HOSTING
# make installkernel KERNCONF=HOSTING
Все, после ребута загрузится свежесобранное ядро. Но ребутиться мы пока не будем - нам надо отредактировать /etc/rc.conf.
Код:
# Поддержка линуксовых бинариков
linux_enable="YES"
# Запускаем sshd
sshd_enable="YES"
# Вырубаем лишнее
usbd_enable="NO"
sendmail_enable="NONE"
inetd_enable="NO"
# Включаем сислог
syslogd_enable="YES"
syslogd_flags="-ss"
# Очищаем /tmp при старте системы
clear_tmp_enable="YES"
# Включаем фаервол
firewall_enable="YES"
firewall_script="/etc/rc.firewall"
firewall_type="client"
firewall_quiet="NO"
Все. Наша система настроена и готова к бою . Если ты работаешь удаленно, пропиши в /etc/rc.firewall разрешающее правило для себя, иначе после ребута потеряется доступ к машине. Если у тебя локальная консоль – смело идем в ребут:
Как только сервер поднялся, нужно еще раз проверить, что не возникло проблем с железом, софт не плевался ошибками и вообще все в шоколаде. Помнишь, мы смотрели размер ядра до пересборки? Посмотрим еще раз:
Код:
# ll /boot/kernel/kernel
-r-xr-xr-x 1 root wheel 2675196 Mar 10 04:10 /boot/kernel/kernel
#
2.6 мегабайт. Совсем другое дело .