Настройка веб-сервера под FreeBSD. Часть 1.

Unix

Автор: Александр Степанов

01 нояб. 2011 г.  992


Приветствую!
Сегодня я расскажу про настройку веб сервера на базе ОС FreeBSD 6.x/7.x
Для экспериментов можно использовать виртуальную машину, вместо компьютера. В дальнейшем можно будет полностью настроенную систему перенести на винчестер будущего сервера.
Сразу оговорюсь, что процесс установки системы занимает меньше получаса даже на Pentium II с 128МБ ОЗУ, однако настройка системы процесс достаточно долгий и требует участия человека. Так что, расчитывайте своё время. Так же, желательно иметь быстрый безлимитный интернет, т.к. в общей сложности прийдётся скачать более 200МБ (не считая саму систему).
Итак, начинаем

Выбор системы

Первое, что нам понадобится — это загрузочно-установочный диск с FreeBSD. Скачать ISO образ можно на сайте freebsd.org/ (система бесплатная). Однако, предварительно нужно определиться с версией и архитектурой системы.

Последние стабильные версии FreeBSD на момент написания статьи — 6.4 и 7.1.
Лично я предпочитаю использовать систему ветки 6.x (т.к. не использую оборудование, которое не поддерживается в данной ветке), однако, к сожалению, она не поддерживает многие современные устройства (некоторые встроенные на материнские платы, сетевые карты nVIDIA, а по непроверенным данным — ещё и процессоры AMD серии Phenom, так же, наблюдались проблемы с нестандартными SATA контроллерами). Однако, касаемо встроенных сетевых карт — это крайне неправильный выбор для сервера. На сегодняшний день хорошо себя зарекомендовали адаптеры Intel и 3COM. Более простые адаптеры, такие как Realtek, D-Link, nVIDIA и другие создают дополнительную нагрузку на процессор.
Что касаемо архитектуры — тут нужно операться на объём ОЗУ и процессор. Для серверов с памятью до 4ГБ рекомендуется использовать архитектуру i386, т.к. она в целом быстрее и стабильнее. Если же объем оперативной памяти превышает 4ГБ, выбора остаётся два. Либо использовать i386 в режиме PAE, либо использовать архитектуру amd64 (64 бита). Однако, для последнего варианта процессор должен поддерживать x64. Лично я остановился бы на i386+PAE.
 

Установка системы

Для начала, следует часы в BIOS'е настроить по Гринвичу (т.е. нулевой часовой пояс).
Убедитесь, что на винчестере вашего будущего сервера нет нужных данных. Убедились? Продолжаем.
Загружаем компьютер с диска FreeBSD, видим экран с выбором вариантов загрузки. Можно подождать 10 секунд, можно нажать Enter… Ждём диалога с выбором региона. Далее советую указывать реальные данные, это влияет на кодировку и на системное время (привязка системного времени к часам в BIOS'е).
Далее появляется диалог с выбором кодировки. Выбираем «Russia (KOI8-R)», жмём Enter для продолжения.
Далее предлагается выбрать вариант установки, выбираем Custom, после чего заходим в раздел Partition. Удаляем все разделы (клавиша D) на том винчестере, на котором должна стоять система (предполагается, что других систем на нём стоять не будет). Создаём один раздел (клавиша C), программа запрашивает размер раздела (по умолчанию там вписан максимально возможный раздел), нажимаем Enter и нам предлагают ввести тип файловой системы. Выбираем стандартный тип (165), он там по умолчанию и вписан. Нажимаем Enter, затем выбираем наш раздел в списке (клавиши стрелок) и нажимаем клавишу S, чтобы пометить раздел как активный (чтобы компьютер грузился с него). Нажимаем Q, после чего у нас спращивают, что нужно записать в MBR. Варианта будет 3 — загрузчик с выбором ОС, загрузчик без выбора ОС и оставить MBR нетронутым. Выбираем второй вариант (Standard).
После этого мы оказываемся в предыдущем меню. Заходим в меню Label, видим утилиту для разметки диска. Нажимаем клавишу C, чтобы создать новую файловую систему. Удаляем число, которое там написано, и пишем 1G. Нажимаем Enter, после чего выбираем тип FS, нажимаем Enter и задаём точку монтирования "/" (без кавычек). Вот мы создали первый раздел, размером в 1ГБ, под саму систему (а больше 1ГБ здесь и не нужно, да и 1ГБ это много; сделано с учётом папки /root, в которой администратор может хранить свои файлы). Создаём следующий раздел, указываем объём 1G (1ГБ) и тип SWAP (точка монтирования для SWAP не задаётся). Этот раздел будет служить для «сбрасывания» туда временных данных, которые не помещаются в оперативной памяти. Создаём третий, последний раздел на этом винчестере, который займёт всё оставшееся место и замонтируем его на /usr (кто не понял — тип раздела FS и точка монтирования "/usr"). Нажимаем Q и снова оказываемся в предыдущем меню.
Заходим в раздел Distributions, прокручиваем в самый низ и выбираем Custom. Далее оказываемся в меню выбора состава системы.
Отмечаем следующие пункты (клавишей Enter):
— Base — базовые файлы
— Kernels (в открывшемся меню отмечаем GENERIC и SMP, прокручиваем вверх и выбираем Exit) — ядра системы (обычное и для многоядерных процессоров)
— man — документации
— src (в открывшемся меню отмечаем только sys, прокручиваем вверх и выбираем Exit) — исходники ядер (ядро мы будем перестраивать)
— ports — набор «портов», откуда мы будем ставить все программы
Поднимаемся вверх и выбираем Exit 2 раза (чтобы выйти из Custom и Distributions).
Выбираем Media и там CD/DVD (чтобы устанавливать систему с диска).
Выбираем Commit, после чего система в последний раз спрашивает, действительно ли мы хотим переразметить винчестер. Отвечаем положительно (однако, это последний шанс отменить установку, если на винчестере есть нужные данные; до этого момента на винчестер ничего не записалось).
Ждём, пока система копируется на винчестер.
Всё поставилось, нам предлагают вернуться в основное меню. Отвечаем отрицательно. После этого программа покажет предупреждение о перезагрузке.
Система установлена. Перезагружаемся (не забываем вытащить диск и в BIOS'е указать загрузку с винчестера).
 

Настройка системы

После установки, загружаем систему в обычном режиме. Вводим логин root, пароль для него, пока что, не задан.
Задаём пароль для root командой passwd.
Набираем ifconfig, смотрим какие есть интерфейсы. lo0 — локалхост, на него можно не обращать внимание. Находим наш основной интерфейс (например, это fxp0).
Набираем команду:
ifconfig fxp0 inet IP.АДРЕС.НАШЕГО.СЕРВЕРА netmask НАША.МАСКА.ПОДСЕТИ up
Можно в таком виде:
ifconfig fxp0 inet IP.АДРЕС.НАШЕГО.СЕРВЕРА/ДЛИНА_МАСКИ up
(маски подсети можно считать здесь: eugen.su/ru/tool/netmask)
Далее выполняем:
route add default IP.АДРЕС.НАШЕГО.ШЛЮЗА
Затем:
echo nameserver IP.АДРЕС.НАШЕГО.DNS > /etc/resolv.conf
Можно для проверки сделать ping -c4 eugen.su, если сеть работает, сервер должен ответить на пинг.
Эти настройки будут работать до первой перезагрузки. Далее в этой статье будет описано, как эти настройки сохранить в файл для их применения после перезагрузки.
Затем делаем:
portsnap fetch
portsnap extract
Для получения свеженьких портов. (на это уйдёт около 70МБ траффика!)
В принципе, этого можно не делать, но в при этом далее будут установлены не самые последние версии программ.
Далее ставим текстовый редактор le (самый удобный из всех, что мне встречались):
cd /usr/ports/editors/le
make install clean
Два файловых менеджера:
Demos Commander
cd /usr/ports/misc/deco
make install clean
Midnight Commander
cd /usr/ports/misc/mc
make install clean (оставляем настройки по умолчанию, нажимаем Tab, чтобы переключиться на кнопку OK и Enter; MC потянет за собой некоторые библиотеки, общим объёмом порядка 20МБ)
Далее выполняем команду rehash (для перестройки списка команд).
Выполняем команды:
chflags -R schg /bin /sbin /lib /libexec /rescue /usr/bin /usr/sbin /usr/lib /usr/libexec
Чтобы позже невозможно было случайно удалить эти папки.
Следующим этапом запускаем deco (для удобства) и делаем cd /
Удаляем папки (F8):
.snap
cdrom (CD-ROM нам больше не будет нужен в системе; если будет нужен, папку можно будет создать)
dist
media
mnt
Потом набираем команду:
rm compat sys (для удаления этих ссылок с корня, они не нужны там)
Далее делаем следующее:
rm -rf tmp
ln -s /var/tmp tmp
Иначе, в системе будет 2 временные папки, часть программ обращается к /tmp, часть к /var/tmp. Разумнее было бы сделать одну папку.
Переходим в каталог usr и точно так же удаляем папки:
.snap
compat
games
Дальше предстоит более интересная процедура — перенос папки /var в раздел /usr (иначе, каталог /var будет находиться на маленьком разделе в 1ГБ на винчестере, при этом в нём будут все логи, почта, временная папка и, позже, базы данных MySQL):
chflags -R noschg /var
mv /var /usr
ln -s /usr/var /var
Далее создаём папку, в которой будут домашние каталоги всех пользователей:
mkdir /usr/home
ln -s /usr/home /home
(опять-таки, на большом разделе винчестера)
Теперь наши файловые системы на / и /usr должны выглядеть таким образом:
X
Так же, можно удалить ещё нектороые каталоги:
rm -rf /etc/bluetooth /etc/X11 /etc/skel /var/games
Далее делаем следующее:
cp /etc/defaults/rc.conf /etc/rc.conf_
le rc.conf_
Файл откроется в редакторе. (по ходу редактирования, советую периодически нажимать F2, чтобы сохранять изменения в файле, мало ли?)
Медленно листаем его вниз. И вот, что нужно отредактировать:
local_startup="/usr/local/etc/rc.d" (т.е. убрать автозапуск из X11R6)
hostname=«ИМЯ_ХОСТА» (это нужно задать, т.к. это будет «именем» системы)
firewall_enable=«YES» (файрволл будет полезен)
firewall_type=«CUSTOM»
network_interfaces=«lo0 fxp0» (не советую использовать auto, лучше перечислить сетевые интерфейсы)
После ifconfig_lo0=«inet 127.0.0.1» добавляем строки:
ifconfig_fxp0=«inet НАШ_IP netmask НАША_МАСКА_ПОДСЕТИ» (надеюсь, понятно, что вместо fxp0 должно быть указано имя нашего интерфейса)
ifconfig_fxp0_alias0=«inet НАШ_ВТОРОЙ_IP netmask НАША_МАСКА_ПОДСЕТИ» (можно задать второй IP, будет полезно для DNS)
ifconfig_fxp0_alias1=«inet НАШ_ТРЕТИЙ_IP netmask НАША_МАСКА_ПОДСЕТИ» (… и третий… и, в принципе, сколько угодно...)
Следующие строки, которые необходимо редактировать:
inetd_enable=«YES» (inetd будет нужен для работы POP3 и PopPWD серверов, настройка которых будет расписана далее)
named_enable=«YES» (если нужно будет поднимать DNS сервер)
sshd_enable=«YES» (если нам нужен SSH)
ftpd_enable=«YES» (если нам нужен FTP)
ntpd_enable=«YES» (для синхронизации времени с интернетом, крайне полезно иметь точное время на сервере)
defaultrouter=«IP.АДРЕС.НАШЕГО.ШЛЮЗА»
Далее настройки, связанные с вводом текста и с кодировкой:

 


keyboard=""
keymap=«ru.koi8-r»
keyrate=«fast»
keybell=«NO»
keychange=«NO»
cursor=«NO»
scrnmap=«koi8-r2cp866»
font8x16=«cp866b-8x16»
font8x14=«cp866-8x14»
font8x8=«cp866-8x8»
blanktime=«NO»
saver=«NO»

 

Остальные настройки:
moused_nondefault_enable=«NO»
sendmail_enable=«YES» (стандартный SMTP демон на 25-м порту, нужен для приёма почты на этот сервер)
clear_tmp_enable=«YES» (чтобы очищать временную папку при перезагрузке; достаточно полезная функция)
Настройка завершена. Далее идут строки для подгрузки других rc.-файлов. Эти строки можно смело удалить.
Нажимаем F2, затем 2 раза Escape.
Далее выполняем команду:
mv /etc/rc.conf_ /etc/rc.conf
Чтобы заменить файл с настройками по умолчанию нашими новыми настройками.
Открываем в редакторе файл /etc/ttys:
le /etc/ttys
Заменяем все cons25 на cons25r (для поддержки кириллицы):
Ctrl+R — замена текста. Смело заменяем все вхождения cons25 на cons25r (клавиша *).
Сохраняем файл, выходим из редактора.
Выполняем команду reboot для перезагрузки сервера. После перезагрузки входим в систему с именем root и паролем, который поставили ему перед временной настройкой сети.
Сразу после перезагрузки сеть работать не должна, т.к. мы включили файрволл, а он по умолчанию блокирует все подключения.
Временно отключить его можно выполнив команду:
ipfw add 65534 allow all from any to any
После чего, сеть заработает. Далее будет описано, как сохранить это и другие правила для файрволла.
На самом деле, 65534 это номер правила файрволла. Приоритет имеют правила с меньшим номером. Номер может быть числом от 1 до 65535, однако правило номер 65535 зашито в файрволл железно.
Далее открываем в редакторе файл /etc/hosts и удаляем всё содержимое. Добавляем одну строку:
127.0.0.1 localhost
ОБЯЗАТЕЛЬНО! строку нужно завершить переходом на новую строку. Это касается любого файла в этой системе. Полученное называется «правильно законченая строка», а не «пустая строка в конце файла».
Сохраняем файл и закрываем редактор.
Далее необходимо создать в /etc файл с именем ftpchroot всего с одной строкой: @www
Делается это так:
echo "@www" > /etc/ftpchroot
Это необходимо, чтобы запретить пользователям FTP выходить вверх за пределы их домашнего каталога.
Далее можно отредактировать содержимое файла /etc/motd, оно отображается пользователям при входе в систему.
Редактируем файл /etc/hosts.allow — удаляем из него всё содержимое, кроме одной строки:
ALL: ALL: allow
Редактируем файл /etc/resolv.conf — добавляем строку:
nameserver 127.0.0.1
в самое начало файла, т.е. перед единственной строкой с адресом нашего DNS сервера.
ВНИМАНИЕ! делать это нужно только если на этом компьютере будет работать свой DNS сервер — строка named_enable=«YES» в /etc/rc.conf
Настраиваем файрволл:
Открываем в редакторе файл /etc/rc.firewall, удаляем полностью его содержимое и записываем в него две строки:
#!/bin/sh
ipfw add 65534 allow all from any to any
Для начала, этого хватит. Самая простая конфигурация файрволла, когда он будет разрешать любые подключения. В общем, на веб сервере и не особо нужны другие конфигурации. Позже, перед этим правилом могут быть добавлены другие, с меньшим номером. Они будут иметь приоритет над этим.
Далее настраиваем SSH доступ к серверу.
Открываем в редакторе файл /etc/ssh/sshd_config
1) Раскомментируем строку PermitRootLogins no и заменим no на yes, чтобы разрешать для root вход по SSH.
2) Раскомментируем строку MaxAuthTries 6 и заменим 6 на 3. При такой настройке, у пользователя будет три попытки входа, после чего сервер обрывает соединение.
Сохраняем файл. SSH настроен и готов к работе.
Настраиваем электроную почту:
Переходим в папку /etc/mail
По очереди открываем в редакторе все файлы с расширением .cf, ищем и удаляем строки вида:
DaemonPortOptions=Name=IPv6, Family=inet6, Modifiers=0
Создаём файл access (le access и на вопрос редактора о создании файла отвечаем положительно), в него пишем строки вида:
127.0.0.1 RELAY
НАШ.IP.АДРЕС RELAY
и т.д.
Обязательно нужно записать туда все IP адреса нашего сервера и все адреса, для которых данный сервер должен работать как открытый SMTP.
Открываем в редакторе файл aliases. Его синтаксис понятен будет сразу — в нём записаны имена, чью почту какому пользователю перенаправлять. Так же, допустимо там указывать полные e-mail адреса.
Если вы хотите игнорировать почту, приходящую на один из адресов, в качестве адреса перенаправления можно указать /dev/null.
После настройки почтовых алиасов, выполняем команду make находясь в папке /etc/mail.
Создаём файл /etc/ntp.conf и записываем в него такие строки:

 


driftfile /var/run/ntp.drift
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org
server pool.ntp.org

 

 

 

С этих серверов наш сервер будет автоматически синхронизировать время.
Настраиваем DNS сервер...
Переходим в каталог /etc/namedb
Открываем в редакторе файл named.conf и приводим его к такому виду:

 

 

 

options {
  directory "/etc/namedb";
  pid-file "/var/run/named/pid";
  allow-query { any; };
  listen-on {
  127.0.0.1;
  IP.АДРЕС.НОМЕР.1; // и дальше все адреса этого компьютера
  };
  version «Forget it! :)»; // можно написать всё что угодно, эта строка будет передаваться как версия сервера
  forwarders { IP.АДРЕС.ВНЕШНЕГО.DNS; };
};
zone "." {
  type hint;
  file «named.root»;
};
zone «0.0.127.in-addr.arpa» {
  type master;
  file «master/localhost-reverse.db»;
};

 

 

Далее, по мере появления записей, в этот файл будут добавляться строки. Формат этих записей не будет рассмотрен в этой статье, т.к. это уже не относится к настройке сервера.
Следующим этапом выполняем команды:
rndc-confgen > rndc.conf
chmod 0640 rndc.conf
chown bind:wheel rndc.conf
Далее копируем блок с ключом rndc-key из файла rndc.conf в rndc.key. Сделать это можно, например, так:
le rndc.conf
Далее становимся курсором в начало блока, нажимаем F5, двигаем курсор к концу блока, нажимаем F6. Потом нажимаем F4 и W, редактор запросит файл, куда следует записать выделенный фрагмент. Указываем имя rndc.key и выбираем Overwrite.
Не забываем проверить, что последняя строка файла завершена переходом на новую строку.
Перезагружаем сервер.

Касаемо базовых настроек системы, это всё.

Во второй части статьи будет описана конфигурация ядра и загрузчика системы, в третей — установка и настройка дополнительных программ.

Спасибо за внимание, с вами был Eugen.