Вы находитесь на странице: 1из 268

СОДЕРЖАНИЕ

Модуль
ду 1. Резервное
р копирование.
р
Копирование данных с продакшен-сервера на backup-сервер ............................................ 7
Перекрестное копирование данных ................................................................................................... 7
Системы хранения данных ...................................................................................................................... 8
Другие носители данных .......................................................................................................................... 9
Виды бекапа .................................................................................................................................................... 9
Схемы ротации бекапов ..........................................................................................................................10
Методы резервирования баз данных ...............................................................................................10
RAID – Redundant Array of Independent Disks ................................................................................11
Типы RAID-массивов..................................................................................................................................11
Уровни RAID-массивов.............................................................................................................................12
RAID 0 (Striped Disk Array without Fault Tolerance) .......................................................................12
RAID 1 (Mirroring & Duplexing) ..............................................................................................................12
RAID 5 (Independent Data Disks with Distributed Parity Blocks) ...............................................13
RAID 1+0 (Very High Reliability with High Performance) Performance)..............................................................13
..............................................................13
RAID 5+0 (High I/O Rates & Data Transfer Performance) ...............................................................14
Storage Area Networkk ................................................................................................................................ 14
................................................................................................................................14
Network Attached Storage .......................................................................................................................15
Direct Attached Storage ............................................................................................................................16
Самописный скрипт использующий атрибут mtime файлов.................................................17файлов .................................................17
Rsync .................................................................................................................................................................19
Зеркалируем разделы ..............................................................................................................................21
Amanda............................................................................................................................................................22

Модуль
ду 2. Сетевой интерфейс
рф Linux.
Какие файлы влияют на работу сетевого интерфейса интерфейса..............................................................30
..............................................................30
DHCP iface ......................................................................................................................................................31
Loopback iface ..............................................................................................................................................32
Custom iface...................................................................................................................................................32
Практика.........................................................................................................................................................33
Маршрутизация ..........................................................................................................................................35
Прописываем маршруты ........................................................................................................................36
Про шлюз........................................................................................................................................................38
Полезные ключи netstat ..........................................................................................................................38
NMAP ................................................................................................................................................................40
tcpdump ..........................................................................................................................................................41

1
Модуль
ду 3. TFTP.
Установка .......................................................................................................................................................42
Работа с TFTP.................................................................................................................................................42
Типы пакета ...................................................................................................................................................43
Режимы передачи ......................................................................................................................................43
Коды ошибок ................................................................................................................................................43
Клиент tftp .....................................................................................................................................................44

Модуль
ду 4. NFS.
Установка .......................................................................................................................................................45
Настройка ......................................................................................................................................................46
Опции конфигурационного файла.....................................................................................................47
Дополнительная информация .............................................................................................................48

Модуль
ду 5. Install-сервер.
р р
Принцип работы .........................................................................................................................................49
DHCP .................................................................................................................................................................50
TFTP ...................................................................................................................................................................51
Syslinux ............................................................................................................................................................51
NFS.....................................................................................................................................................................51
Создаем структуру tftp-сервера добавляем контент на сервер .........................................52
Устанавливаем ОС по сети .....................................................................................................................52
Автоматизация установки с помощью Kickstart ...........................................................................53
Диагностика ..................................................................................................................................................55

Модуль
ду 6. Виртуализация
р у ц Xen.
Что это такое ? ..............................................................................................................................................56
Зачем это нужно ?.......................................................................................................................................56
Типы виртуализации .................................................................................................................................56
Архитектура Xen .........................................................................................................................................58
Причины по которым стоит использовать виртуализацию. ..................................................58
Настраиваем сервер виртуализации ................................................................................................58
Установка Xen...............................................................................................................................................59
Создание новых виртуальных машин в Xen .................................................................................60
Работа с виртуальными машинами ....................................................................................................61
Производительность виртуальных машин ....................................................................................62

2
Модуль
ду 7. Subversion.
Архитектура Subversion ..........................................................................................................................63
Протоколы работы с SVN ........................................................................................................................64
Способы хранения данных ....................................................................................................................64
Компоненты Subversion...........................................................................................................................64
Проблема одновременной работы с файлами.............................................................................64
Рабочий цикл................................................................................................................................................66
Установка .......................................................................................................................................................66
Работаем с репозиторием ......................................................................................................................66
Получение копии репозитария с удаленного сервера где у вас есть аккаунт ..............68
Ограничение доступа...............................................................................................................................69
Работа через Proxy .....................................................................................................................................72

Модуль
ду 8. Apache.
p
Об Apache ......................................................................................................................................................73
Установка .......................................................................................................................................................73
Настройка ......................................................................................................................................................74
Добавляем виртуальный хост ..............................................................................................................82
Возможные опции в директиве Options ..........................................................................................84
Определение возможных директив в .htaccess ...........................................................................85
Аутентификация на сайте .......................................................................................................................86
Включение SSL .............................................................................................................................................87
Server-status и server-info ........................................................................................................................90
SSI.......................................................................................................................................................................91
Использование mod_rewrite .................................................................................................................91
Регулярные выражения mod_rewrite и флаги ..............................................................................93
Коды веб-сервера ......................................................................................................................................94

Модуль
ду 9. SAMBA.
Что такое SAMBA и зачем она нужна ? ........................................................................................... 104
Возможности SAMBA ............................................................................................................................. 104
Установка .................................................................................................................................................... 104
Типы аутентификации ........................................................................................................................... 104
Ключевые файлы ..................................................................................................................................... 105
Структура конфигурационного файла .......................................................................................... 106
Пример конфигурационного файла ............................................................................................... 106
Описание конфигурационного файла ........................................................................................... 107
SWAT – веб-интерфейс к SAMBA ....................................................................................................... 111

3
Модуль
ду 10. DHCPD.
Принцип работы ...................................................................................................................................... 112
Установка DHCPD .................................................................................................................................... 113
Настройка DHCPD ................................................................................................................................... 113
Описание опций из dhcpd.conf
dhcpd.conf.........................................................................................................
f......................................................................................................... 114
Секции-объявления ............................................................................................................................... 116
Типы пакетов протокола DHCP ......................................................................................................... 119
Используемые порты............................................................................................................................. 119
DHCP-клиент .............................................................................................................................................. 119

Модуль
ду 11. MySQL.
y Q
Принцип работы ...................................................................................................................................... 121
Пример роли MySQL в информационном пространстве ..................................................... 122
Типы данных .............................................................................................................................................. 122
Сколько нужно места под хранение типа данных ? ................................................................ 124
Практика...................................................................................................................................................... 125
Файл как источник запросов ............................................................................................................. 130
Пользователи и привелегии .............................................................................................................. 132
Саммари по командам и принципу работы ................................................................................ 133
Конфигурационный файл my.cnf...................................................................................................... 134
Забытый пароль администратора ................................................................................................... 136
Резервное копирование ...................................................................................................................... 136
Проверка целостности таблиц с помощью myisamchkk ......................................................... 137
Саммари по myisamchkk ........................................................................................................................ 138

Модуль
ду 12. Мониторинг.
р
О Nagios ....................................................................................................................................................... 139
Установка и настройка Nagios ........................................................................................................... 140
Добавление хостов и сервисов на мониторинг ........................................................................ 166
Мониторинг различных параметров сервера ........................................................................... 167
Мониторинг свободного места......................................................................................................... 167
Защита системы от пользовательских процессов ................................................................... 168
Мониторинг S.M.A.R.T. - параметров жесткого диска ............................................................. 168
Мониторинг сетевых портов в Linux .............................................................................................. 169
Мониторинг открытых файлов и сокетов .................................................................................... 169
Мониторинг запущенных процессов ............................................................................................. 170
Мониторинг системных ресурсов ................................................................................................... 170
Мониторинг свободного места в разделах ................................................................................. 170
Мониторинг сетевой подсистемы в реальном времени ...................................................... 171
Мониторинг работы DNS-сервера в реальном времени...................................................... 171

4
Мониторинг соединений proftpd в реальном времени........................................................
времени........................................................ 172
Статистика по виртуальной памяти ................................................................................................ 172
Статистика по процессору и устройствам ввода-вывода..................................................... 172

Модуль
ду 13. DNS.
Установка .................................................................................................................................................... 173
Инструменты ............................................................................................................................................. 173
Базовые понятия ..................................................................................................................................... 174
Правила построения DNS-системы ................................................................................................ 174
Режимы работы ДНС-серверов......................................................................................................... 175
Типы ответов DNS-серверов .............................................................................................................. 177
Виды запросов к DNS-серверу .......................................................................................................... 177
Способы копирования зоны с master-сервера ......................................................................... 177
Виды записей............................................................................................................................................. 179
Структура конфигурационного файла .......................................................................................... 181
Настройка ................................................................................................................................................... 182
Опции конфигурационного файла.................................................................................................. 186
Slave-сервер............................................................................................................................................... 187
Записи в /etc/resolv.conff ....................................................................................................................... 190
Статистика работы ................................................................................................................................. 190

Модуль
ду 14. Nginx.
g
Что такое Nginx ?...................................................................................................................................... 192
Преимущества Nginx ............................................................................................................................. 192
Варианты использования Nginx ....................................................................................................... 192
Установка EPEL .......................................................................................................................................... 193
Ставим EPEL-пакет ................................................................................................................................... 193
Установка Nginx с поддержкой PHP. Настраиваем связку Nginx + FastCGI. FastCGI...................
.................. 194
Конфигурирование Nginx + FastCGI................................................................................................ 195
Понижаем нагрузку на основной веб-сервер. Установка
Nginx как Frontend к Apache............................................................................................................... 198
Установка mod_rpaff ............................................................................................................................... 201
Включение SSL .......................................................................................................................................... 202
Использование двух версий PHP в Nginx одновременно .................................................... 203
Примеры производительности с Nginx и без него. ................................................................. 204
Описание директив конфигурационного файла ...................................................................... 205
файла......................................................................

Модуль
ду 15. Postfix.
Установка и настройка .......................................................................................................................... 210
Postfix ............................................................................................................................................................ 210

5
MySQL ........................................................................................................................................................... 216
Dovecot......................................................................................................................................................... 217
Clamd............................................................................................................................................................. 220
ClamSMTP .................................................................................................................................................... 221
Spamassassin .............................................................................................................................................. 221
Postfixadmin ............................................................................................................................................... 224
Squirrelmail ................................................................................................................................................. 225
Описание конфигурационных файлов.......................................................................................... 226
Postfix ............................................................................................................................................................ 226
Dovecot......................................................................................................................................................... 229
Clamd............................................................................................................................................................. 230
Clamsmtp ..................................................................................................................................................... 231
Spamassassin .............................................................................................................................................. 232

Модуль
ду 16. OpenVPN.
p
Об OpenVPN ............................................................................................................................................... 234
Установка Linux VPN-сервера ............................................................................................................ 234
Настройка Linux VPN-сервера ........................................................................................................... 235
Linux VPN-клиент ..................................................................................................................................... 240
Windows VPN-клиент.............................................................................................................................. 242
Добавление клиентов ........................................................................................................................... 243
Таблица предназначения ключей и сертификатов.................................................................. 243
Конфигурационный файл openvpn.conf на Linux VPN-сервере......................................... 243
Конфигурационный файл client.conf на Linux-клиентах ....................................................... 246
Конфигурационный файл client.ovpn на Windows-клиенте................................................. 247

Модуль
ду 17. Отказоустойчивый
у кластер.
р
Что такое кластер ? ................................................................................................................................. 248
Принцип работы нашего кластера ................................................................................................. 248
DRBD .............................................................................................................................................................. 249
Программы входщие в состав пакета DRBD................................................................................ 250
Heartbeat ..................................................................................................................................................... 251
Именование серверов .......................................................................................................................... 251
Установка ПО ............................................................................................................................................. 251
Настройка DRBD ...................................................................................................................................... 252
Настройка Heartbeat .............................................................................................................................. 257
Установка Apache .................................................................................................................................... 259

6
Модуль 1. Резервное копирование

Процедура бекапа или резервного копирования очень проста, но может


стать большой головной болью если её не делать. Бизнес многих компаний
напрямую зависит от манипуляций с информацией которая хранится на
серверах. Базы данных, репозитории исходных кодов, веб-проекты и т.д. Все
это нужно ежедневно сохранять на резервные носители информации.
В случае потери информации и её невозможности восстановить компания
может понести большие убытки.
В этом модуле мы рассмотрим несколько вариантов резервного
копирования, от самописных скриптов до промышленных решений и
получим необходимую теорию.
Во первых, есть несколько схем резервного копирования.

Копирование данных с продакшен-сервера на backup-сервер


Продакшен-сервер – это рабочий сервер, который выполняет какие либо
сервисы для пользователей.
backup-сервер – это сервер на который копируется контент с продакшен-
сервера. Единственное предназначение такого сервера – хранить данные
с других серверов. Обычно сам он никаких сервисов не выполняет. Главное
требование – большое дисковое пространство. Скорость дисковых
накопителей особого значения не имеет, так как доступ к данным не частый
– записать бекап на диск и считать его в случае необходимости.
Минус этого решения – необходимость в отдельном сервере под backup`ы
а это дополнительные затраты. Маленькие и средние компании обычно
пытаются сэкономить деньги на покупке вспомогательного оборудования.

Перекрестное копирование данных


Когда два или более продакшен серверов копируют друг на друга свои
данные. В случае когда на продакшен серверах есть достаточное количество
дискового пространства для хранение данных с других серверов, их можно
использовать как backup-серверы. Мы копируем данные с сервера server1
на server2 а данные с server2 на server1.
Плюс – экономим деньги на оборудование. Как я писал выше маленькие
и средние организации могут не выделить деньги на вспомогательное
оборудование, даже если это необходимо под резервные копии. В таком
случае вам может помочь такой способ бекапа.

Модуль 1. Резервное копирование. 7


Системы хранения данных
“Классические” сервера для хранения бекапов хороши при относительно
небольших объемах. Сейчас это несколько сотен гигабайт. Когда же объемы
гораздо больше на помощь приходят СХД, Системы Хранения Данных.

Дисковые массивы
Д
По сути такой же сервер, но спроектирован специально под хранение
данных. Имеет много HDD большего размера.

Дисковый массив Sun Storage J4500. Масштабируемость – от 24 до 192 Тб


Поддерживаемые ОС: Solaris, RedHat, Suse, Windows

Ленточные накопители
Они же стримеры. Данные как и в случае с ленточными библиотеками
записываются на специальные картриджи. Как правило, картридж – это
магнитная лента в пластиковом корпусе.

Ленточный накопитель HP StorageWorks DAT 160 SAS.

Картридж для HP StorageWorks DAT 160 SAS. 160 Гб.

8 Модуль 1. Резервное копирование.


Ленточные библиотеки
Предназначены для автоматизированного резервного копирования
данных. Одновременное использование нескольких лентопротяжных
механизмов увеличивает производительность библиотеки и сокращает
время, необходимое для записи и чтения резервных копий.

Одно из самых серьезных решений SUN. Ленточная библиотека Sun


StorageTek SL8500. До 56 петабайт данных. До 70 тысяч картриджей.

Другие носители данных


optical disc (CD-R/RW, DVD-R/RW);
flash-накопители;
ZIP, Jaz, MO драйвы.

Виды бекапа
Полное – все файлы и каталоги которые мы хотим сохранять на отдельном
носителе.
Инкрементальное – копируем только то, что изменилось с момента
последнего резервного копирования. Полного или инкрементального.
Дифференциальное – копируем только то, что изменялось с момента
последнего ПОЛНОГО бекапа.
Пофайловый метод – копируем нужные файлы в индивидуальном порядке.
Дублирование диска – метод при котором мы делаем полный снимок диска.
Например утилитой dd.

Модуль 1. Резервное копирование. 9


Схемы ротации бекапов
Ротация – это политика по которой делается резервное копирование. Как
часто мы будем делать бекап, как долго мы будем хранить резервные копии.
Все это описывается политикой ротации.
Одноразовое копирование – администратор делает копирование вручную.
Обычно делается полный бекап данных.
Простая ротация – подразумевается, что некий набор носителей используется
циклически. К примеру 5 ленточных носителей на каждый день недели. В пятницу
мы делаем полный бекап данных а в остальные дни недели инкрементальный.
“Дед, отец, сын” (GFS) – имеет иерархическую структуру ротации.
Используется три набора носителей. Раз в неделю делается полной бекап
данных. В остальные дни недели – инкрементальный. Раз в месяц делается
еще один полный бекап системы. Набор носителей для ежедневного
инкрементального копирования – сын, набор для еженедельного полного
бекапа – отец, набор для ежемесячного полного бекапа – дед.
“Ханойская башня” – название пошло от древней китайской игры. Смысл
игры заключается в следующем. Есть три стержня и какой-то набор дисков.
Диски нужно перемещать со стержня на стержень, но так, чтобы каждый
новый диск ложился на диск большего диаметра.

Такой метод бекапа достаточно сложен и практически не применяется в


настоящее время.
“10 наборов” – метод рассчитан на 10 наборов носителей. Период из 40
недель делится на десять циклов. В течение цикла за каждым набором
закреплен один день недели. По прошествии четырехнедельного цикла
осуществляется сдвиг номера набора. То есть в первом цикле за понедельник
отвечал набор N1, за вторник N2, за среду N3 и т.д. Во втором цикле за
понедельник будет отвечать набор N2, за вторник N3, за среду N4 и т.д. Такая
схема позволяет равномерно распределить нагрузку между носителями но
из-за своей сложности практически не используется.

Методы резервирования баз данных


hot backup – горячий бекап базы данных. Это когда резервная копия делается
при включенном сервере БД.
cold backup – холодный бекап базы данных. Это когда сервер БД нужно
выключить чтобы сделать резервную копию.

10 Модуль 1. Резервное копирование.


RAID – Redundant Array of Independent Disks
Избыточный массив независимых дисков. Это когда несколько физических
дисков объединяются вместе в один логический чтобы решать какие либо
задачи. Скорее всего вы его будете использовать для отказоустойчивости.
При выходе из строя одного из дисков система будет продолжать работать.
В операционной системе массив будет выглядеть как обычный HDD. RAID –
массивы зародились в сегменте серверных решений, но сейчас получили
широкое распространение и уже используются дома. Для управления
RAID-ом используется специальная микросхема с интеллектом , которая
называется RAID-контроллер. Это либо чипсет на материнской плате, либо
отдельная внешняя плата.

Типы RAID-массивов
Есть два типа RAID-массивов.

RAID-контроллер - LSI LOGIC MegaRAID SCSI 320-1


Аппаратный – это когда состоянием массива управляет специальная
микросхема. На микросхеме есть свой CPU и все вычисления ложатся на
него, освобождая CPU сервера от лишней нагрузки.
Программный – это когда состоянием массива управляет специальная
программа в ОС. В этом случае будет создаваться дополнительная нагрузка
на CPU сервера. Ведь все вычисления ложатся именно на него.
Однозначно сказать какой тип рейда лучше – нельзя. В случае программного
рейда нам не нужно покупать дорогостоящий рейд-контроллер. Который
обычно стоит от 250 у.е. (можно найти и за 70 у.е. но я бы не стал рисковать
данными) Но все вычисления ложатся на CPU сервера. Программная
реализация хорошо подходит для рейдов 0 и 1. Они достаточно просты
и для их работы не нужны большие вычисления. Поэтому программные
рейды чаще используют в решениях начального уровня. Аппаратный
рейд в своей работе использует рейд-контроллер. Рейд-контроллер имеет
свой процессор для вычислений и именно он производит операции
ввода/вывода.

Модуль 1. Резервное копирование. 11


Уровни RAID-массивов
Их достаточно много. Это основные – 0, 1, 2, 3, 4, 5, 6, 7 и комбинированные –
10, 30, 50, 53...
Мы рассмотрим только самые ходовые, которые используются в современной
инфраструктуре предприятия. Буква D в схемах означает Data (данные), или
блок данных.

RAID 0 ((Striped
p Disk Arrayy without Fault Tolerance))

Он же stripe. Это когда два или более физических дисков объединяются в


один логический с целью объединения места. То есть берем два диска по
500 Гб, объединяем их в RAID 0 и в системе видим 1 HDD объемом в 1 Тб.
Информация распределяется по всем дискам рейда равномерно в виде
небольших блоков (страйпов).
Плюсы – Высокая производительность, простота реализации.
Минусы – отсутствие отказоустойчивости. При использование этого рейда
надежность системы понижается в два раза (если используем два диска).
Ведь при выходе из строя хотя бы одного диска вы теряете все данные.

RAID 1 ((Mirroringg & Duplexing)


p g)

Он же mirror. Это когда два или более физических дисков объединяются в


один логический диск с целью повышения отказоустойчивости. Информация
пишется сразу на оба диска массива и при выходе одного из них информация
сохраняется на другом.
Плюсы – высокая скорость чтения/записи, простота реализации.
Минусы – высокая избыточность. В случае использования 2-х дисков это
100%.

12 Модуль 1. Резервное копирование.


RAID 5 ((Independent
p Data Disks with Distributed Parityy Blocks))

Самый популярный вид рейд-массива, в целом благодаря экономичности


использования носителей данных. Блоки данных и контрольные суммы
циклически записываются на все диски массива. При выходе из строя одного
из дисков будет заметно снижена производительность, так как придется
совершать дополнительные манипуляции для функционирования массива.
Сам по себе рейд имеет достаточно хорошую скорость чтения/записи но
немного уступает RAID 1. Нужно не менее трех дисков чтобы организовать
RAID 5.
Плюсы – экономичное использование носителей, хорошая скорость чтения/
записи. Разница в производительности по сравнению с RAID 1 не так сильно
видна как экономия дискового пространства. В случае использования трех
HDD избыточность составляет всего 33%.
Минусы – сложное восстановление данных и реализация.

RAID 1+0 ((Veryy High


g Reliabilityy with High
g Performance))

Он же RAID 10. Сочетание зеркального рейда и рейда с чередованием


дисков.
В работе этого вида рейда диски объединяются парами в зеркальные
рейды (RAID 1) а затем все эти зеркальные пары объединяются в массив с
чередованием (RAID 0). В рейд можно объединить только четное количество
дисков, минимум – 4, максимум – 16. От RAID 1 мы наследуем надежность, от
RAID 0 - скорость.
Плюсы – высокая отказоустойчивость и производительность
Минусы – высокая стоимость

Модуль 1. Резервное копирование. 13


RAID 5+0 ((High
g I/O Rates & Data Transfer Performance))

Он же RAID 50, это сочетание RAID 5 и RAID 0. Массив объединяет в себе


высокую производительность и отказоустойчивость.
Плюсы – высокая отказоустойчивость, скорость передачи данных и
выполнение запросов
Минусы – высокая стоимость

Итоги
Механизм обеспечения
Уровень RAID Использование Мин.дисков
надежности
RAID 0 100% 1 нет
RAID 1 50% 2 зеркалирование
RAID 5 67-94% 3 четность
RAID 1+0 50% 4 зеркалирование
RAID 5+0 67-94% 6 четность
Главный вывод который можно сделать – у каждого уровня рейда есть свои
плюсы и минусы.
Еще главнее вывод – рейд не гарантирует целостности ваших данных. То есть
если кто-то удалит файл или он будет поврежден каким либо процессом, рейд
нам не поможет. Поэтому рейд не освобождает нас от необходимости делать
бекапы. Но помогает, когда возникают проблемы с дисками на физическом
уровне.

Storage Area Network


Архитектурное решение SAN представляет собой сеть, как правило на базе

14 Модуль 1. Резервное копирование.


Fibre Channel (оптика) которая служит для подключения хранилищ данных к
серверам таким образом, чтобы те считали устройства как локальные.

Такое решение добавляет большую гибкость инфраструктуре предприятия.


Ведь СХД могут находиться физически в любом месте и их не нужно
переподключать от одного сервера к другому. Все что нужно сделать
– добавить сервер/СХД в SAN-сеть. Также, трафик LAN/WAN и SAN не
конфликтует между собой. Из-за некоторой сложности, SAN пока не вышел
за пределы крупных компаний.

Network Attached Storage

NAS – это сетевая система хранения данных. В целом это обычный сервер

Модуль 1. Резервное копирование. 15


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

DEPO Storage NAS 1005. До 5 Тб данных.


Неоспоримым плюсом NAS-серверов по отношению к “классическим”
серверам является – цена. Так что, если от будущего сервера потребуются
функции только файл-сервера стоит обратить внимание на NAS-решения.
Для NAS-серверов была специально разработана операционная
система FreeNAS, которая построена на базе FreeBSD. ОС максимально
оптимизирована под задачи NAS и весит в районе 32 Мб. Её можно загрузить
с flash-носителя/cdrom диска.

Direct Attached Storage


Представляет из себя дисковый массив с прямым подключением к серверу.
Другие сервера/клиенты могут получить доступ к этому массиву только
через сервер, к которому он подключен.

16 Модуль 1. Резервное копирование.


Примеры DAS-устройств:
USB-носители
CD/DVD – драйвы
ATA, SATA, SAS, SCSI – диски
Ленточные накопители/библиотеки

Самописный скрипт использующий атрибут mtime файлов


Сделаем простую реализацию бекапа.
Пишем скрипт вида “Что бекапим, куда бекапим, как долго храним копии”.
1 #!/bin/bash
2 #backup.sh

3 timestamp=`date “+%Y-%m-%d-%H-%M”`
4 backupFS=”/etc /var/lib/mysql /usr/local/etc”
5 backupTO=/var/backup
6 KeepTime=7

7 if [ -d $backupTO ]; then

8 find $backupTO -maxdepth 1 -name \*.tar.gz -mtime +${KeepTime} -exec rm -f {} \;

9 for i in $backupFS
10 do
11 j=`expr ${i//\//-}`
12 tar -zcvf $backupTO/`hostname`.${timestamp}.${j}.tar.gz $i
13 echo “$i is done”
14 done
15 else
16 echo “backup directory is missing...exiting”
17 exit 1

18 fi
Выполняем команду chmod +x <имя этого скрипта>, другими словами
делаем его исполняемым.
В рабочем скрипте цифр быть не должно. Я добавил их для удобства
объяснения строк кода.
1. Любой скрипт в Linux начинается с этой последовательности, которая
называется sha-bang. По сути исполняемый файл может быть просто
перечислением набора команд, но если планируется что-то сложнее,
где предстоит работа с переменными то sha-bang стоит поместить в
файл. В этом случае будет создан процесс, в котором мы можем хранить
временные данные;

Модуль 1. Резервное копирование. 17


2. Все строки в файле начинающиеся с символа #, кроме первой строки –
комментарии. Здесь я просто указал название нашего скрипта как многие
делают;
3. В переменную timestamp мы сохраняем результат выполнения команды
date в нужном нам формате: год-месяц-день-час-минута. Значение
переменной будет фигурировать в конечном имени файла;
4. В переменной backupFS мы будем сохранять список каталогов для бекапа.
Каталоги указываем через пробел а весь их список берем в двойные
кавычки;
5. Переменная backupTO содержит каталог, куда мы будем делать бекапы;
6. В переменной KeepTime мы храним срок хранения бекапов. Файлы
старше 7 дней мы будем удалять. Место на диске все таки не резиновое;
7. В дело вступает команда test. Прежде чем продолжить дальше имеет
смысл проверить существование backup-каталога. Иначе нет смысла
продолжать. В скрипте мы не будем его создавать – пусть администратор
сам управляет своей файловой системой;
8. Перед созданием бекапа мы просматриваем backup-каталог и удаляем
файлы которые хранятся более 7 дней. Для вычисления сколько архив
находится в файловой системе мы использовали атрибут файла mtime. В
этом атрибуте сохраняется время последней модификации файла;
9. Начинаем цикл for и последовательно для каждого каталога в переменной
backupFS сделаем ряд действий;
10. Начинаем новую итерацию цикла for;
11. В переменную j мы сохраняем результат выполнения регулярного
выражения. Нам необходимо удалить символ “/” из путей каталогов в
переменной i. Так как создать tar.gz-архив с “/” в имени файла у нас не
получится;
12. Архивируем нужную нам директорию. Имя файла мы генерируем
динамически. В имени будет использован результат выполнения команды
hostname, То есть мы подставим имя нашего сервера, что весьма полезно
при хранение бекапов в централизованном месте, где могут быть бекапы
с десятка серверов. Далее в название файла добавляем текущее время
в соответствие с форматом переменной timestamp. После добавления
времени добавляем название резервируемого каталога с заменой
символов “/” на “-”;
13. Выводим сообщение, что архивация директории завершена. Впрочем
для скрипта висящего в cron в этом нет необходимости;
14. Завершение итерации цикла for;
15. Это условие выполняется если backup-каталог отсутствует в файловой
системе;

18 Модуль 1. Резервное копирование.


16. Выводим сообщение “backup-каталог отсутствует”;
17. Выходим из скрипта с ошибкой (код 1). Польза от этого есть когда это
анализируется каким-то другим процессом. Но в целях правописания мы
это добавим;
18. Завершение условного оператора и выход из программы.
В соответствие со своими нуждами поправьте список каталогов для бекапа,
путь куда их сохранять и количество дней хранения копий. Помещаем скрипт
в cron администратора, например на 4 часа утра каждый рабочий день, еще
мы добавим и субботу, чтобы захватить данные которые были сделаны в
течение рабочего дня пятницы.
0 4 * * 1-6 /root/backup.sh
Каталог для бекапа может быть NFS-ресурсом экспортированным на
сервер. Так мы простым скриптом решаем важную задачу системного
администрирования. Для более сложной инфраструктуры скорее всего
понадобится что-то более функциональное и гибкое.
В своих backup-скриптах больше внимания уделяйте обходу потенциальных
ошибок и неадекватного поведения в случае отсутствия места на диске или
в случае отсутствия нужных каталогов. Не тратьте время на оптимизацию,
смысла в этом не много, ведь узким местом всегда будет процесс
копирования/архивирования ваших данных.

Rsync
Rsync (Remote Synchronization) — с помошью этой программы происходит
копирование файлов между серверами, пришла на замену rcp.
centos52 — сервер куда будем делать бекап
unixbox — сервер с которого будем делать бекап
На сервере unixbox создадим пользователя rsync от которого будут
запрашиваться файлы для бекапа.
Добавим пользователя rsync и установим ему пароль.
# useradd rsync
# passwd rsync
Добавим его в нужные группы чтобы он мог получить право на чтение если
такого еще нет.
Скопируем каталог /etc с сервера unixbox в наш локальный каталог /var/
backup
$ rsync -e ssh -avz --delete-after --force rsync@unixbox:/etc /var/backup/
Вводим пароль и все.

Модуль 1. Резервное копирование. 19


Если хочется процедуру автоматизировать то нужно будет сгенерировать
public ключ на сервере centos52 и положить его в файл authorized_keys
пользователю rsync на сервере unixbox. Давайте сделаем это.
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub rsync@unixbox
Все. Теперь можно поместить выполнение команды в crontab
# crontab -e
* */4 * * * rsync -e ssh -avz --delete-after --force rsync@unixbox:/etc /var/backup
Каждые 4 часа будем копировать каталог /etc с сервера unixbox в локальный
каталог /var/backup

Пояснения
Внимание: если после /etc нет “/” то будет скопирован сам каталог и его
содержимое. Если “/” есть, то будет скопировано только содержимое этого
каталога.
-e ssh – этим ключем мы показываем что будем использовать ssh, то есть наш
трафик будет шифроваться;
-a – работа в режиме архивирования, сохраняются права доступа и
информация о владельцах;
-v – выводить больше информативной информации;
-z – архивировать передаваемые данные;
--delete-after – удалять файлы которые отсутствуют в источнике после того
как закончится передача файлов по сети. Мы хотим иметь полную копию
контента с удаленного сервера. Можете включать эту опцию периодически.
Вдруг кто-нибудь случайно удалит файл на удаленном сервере и во время
ближайшей синхронизации мы удалим его тоже;
--force – не удалять директорию пока в ней есть файлы.

rsyncd
Также есть сервис – rsyncd который работает на порту 873 TCP. При
запущенном сервисе строка доступа может выглядеть так:
rsync://[USER@]HOST[:PORT]/SRC [DEST]
то есть в начале будет добавлено rsync:// а остальное также как и в примере
выше. Аутентификация в rsyncd основана на 128 bit MD4, что очень не
надежно в наше время. К тому же данные передаются в открытом виде, что
явно не в пользу этого сервиса, когда есть такие средства как rsync+ssh и scp.
Поэтому подробно рассматривать его не вижу смысла.

20 Модуль 1. Резервное копирование.


Скрипт в помощь
Этого материала достаточно чтобы начать пользоваться rsync в создание
своих файловых зеркал/резервных копий. Ниже я дам пример скрипта,
который может помочь когда нужно копировать набор каталогов с
удаленного сервера.
#!/bin/bash
#backup.sh

LIST=/var/backup/backup.list

cat ${LIST} | while read res; do


rsync -e ssh -avz --delete-after --force rsync@unixbox:$res /var/backup
done
Файл /var/backup/backup.list должен содержать список каталог для
копирования. Примерно так:
/etc
/var/www/cms
/usr/local/etc
/var/billing

Зеркалируем разделы (используем dd)


Программа dd идеально подойдет там где нужно сделать точную копию
раздела/слайса диска. Она сектор за сектором копирует данные из источника
(параметр if ) в пункт назначения, если так можно выразиться (параметр of ).
Чтобы понять как просто пользоваться программой давайте сделаем это на
практике.
# dd if=/dev/hda of=/dev/hdb conv=noerror,sync
Команда выше сделает точную копию раздела /dev/hda в разделе /dev/hdb.
То есть мы «отзеркалировали» /dev/hda
После conv= мы можем указать ряд параметров.
noerror — продолжать копирование не обращая внимание на bad-блоки и
прочие ошибки
sync — поврежденные или отсутствующие данные во входном буфере на
выходе будут заменены на нули. Опция замедляет работу команды dd, но
для более корректного образа стоит воспользоваться ею.
# dd if=/dev/hda3 of=/var/backup/hda3.img
Этой командой мы записали раздел /dev/hda3 в бинарный файл hda3.img.
Теперь его можно перенести на другой сервер и развернуть в точную копию

Модуль 1. Резервное копирование. 21


/dev/hda3. Только учтите один минус dd — программа копирует данные по
секторам и ей все равно есть на этом участке диска данные или нет, будет
воссоздана точная копия и размер будет точно такой же! То есть если раздел
/dev/hda3 имеет объем в 5 Гб а занят на нем только 1 то файл hda3.img будет
весить 5 Гб.
Восстановить раздел из образа также просто как и создать:
# dd if=/var/backup/hda3.img of=/dev/hda3
Ну и напоследок сделаем копию нашей MBR (Master Boot Record). MBR – это
первый сектор на жестком диске содержащий таблицу разделов и запись,
с какого раздела загружаться. Иногда требуется восстановить MBR из
резерва.
# dd if=/dev/hda1 of=/var/backup/mbr.dump bs=512 count=1
Команде dd мы просто передали параметры bs и count, этим указав какой
объем данных мы хотим скопировать.
bs — block size, размера блока который мы хотим скопировать
count — количество bs
Мы ведь уже знаем, что MBR находится в первых 512 байтах (1-й сектор).
Теперь восстановим MBR из резервной копии
# dd if=/var/backup/mbr.dump of=/dev/hda1 bs=512 count=1
Размер сектора можно узнать так:
# fdisk -l /dev/hda1

Amanda - Advanced Maryland Automatic Network Disk Archiver

Amanda – это клиент/серверная система создания резервных копий.


Хороший выбор для средних и крупных предприятий. Что тут говорить,

22 Модуль 1. Резервное копирование.


сама корпорация Xerox использует Amanda в своей ИТ инфраструктуре.
Изначально Amanda была создана для работы с ленточными накопителями
но сейчас активно используется при бекапе на HDD. Такая концепция
получила название “виртуальные ленты” (vtapes). Amanda не испытывает
проблем при работе в гетерогенных сетях (в сетях, которые используют
разные платформы и операционные системы).

Некоторые термины
level 0 – полный бекап
level 1 – инкрементальный бекап
level n – инкрементальный бекап с момента предыдущего инкрементального
бекапа (level n-1)
Disklist Entry (DLE) – каждая запись в файле disklist
dumpcycle – Промежуток времени в течение которого делается level 0
backup каждой из DLE (обычно 1 неделя)
runspercycle – сколько раз Amanda будет запущена в течение dumpcycle
tapecycle – сколько лент будет использовано в системе резервного
копирования

Мы рассмотрим версию Amanda-2.5.0p2

Настройка Amanda Server


Описание
fasttech – так назовем наш проект про резервному копированию
centos52 – Amanda Server
unixbox – Amanda Client
/var/backup – каталог для резервных копий
Задача
д
Будем делать бекап каталога /etc сервера unixbox. Один раз в неделю будем
делать полный бекап, остальные – инкрементальный.

Начинаем установку
yum -y install amanda-server.i386
Создаем каталог для нового проекта и копируем файл amanda.conf из
проекта по умолчанию.
mkdir /etc/amanda/fasttech

Модуль 1. Резервное копирование. 23


cp /etc/amanda/DailySet1/amanda.conf /etc/amanda/fasttech/
Редактируем файл /etc/amanda/fasttech/amanda.conf
org «Fasttech.ru»
mailto «root»
dumpuser «amanda»
dumporder «sssS»
taperalgo first

displayunit «m»

dumpcycle 5
runspercycle 5
tapecycle 10

tpchanger «chg-disk» # /usr/lib/amanda/chg-disk


tapedev «file:/var/backup»

tapetype DISK
labelstr «fasttech-.*»

infofile «/etc/amanda/fasttech/curinfo»
logdir «/etc/amanda/fasttech»
indexdir «/etc/amanda/fasttech/index»

define tapetype DISK {


length 500000 MB
}
define dumptype comp-tar {
program «GNUTAR»
compress fast
index yes
}

Создаем структуру каталогов и файлов которые потребуются во время


работы.
# mkdir /etc/amanda/fasttech/{curinfo,index}

Создаем два пустых файла


# touch /etc/amanda/fasttech/{tapelist,disklist}

Нашему проекту назначаем правильного владельца


# chown -R amanda:disk /etc/amanda/fasttech/

24 Модуль 1. Резервное копирование.


В файл disklist помещаем систему с которой будем делать бекап и
директорию
# echo 'unixbox /etc comp-tar' > /etc/amanda/fasttech/disklist

Разрешаем пользователю root с сервера unixbox получать с нас бекап.


# echo 'unixbox root' > `grep amanda /etc/passwd | cut -d: -f6`/.amandahosts

Создаем директорию для временных файлов


# mkdir -p /var/backup/holding

В цикле создаем директории для наших будущих виртуальных лент


# for i in 1 2 3 4 5; do mkdir /var/backup/slot$i; done

Делаем символическую ссылку первой ленты на каталог data


# ln -s /var/backup/slot1 /var/backup/data

Устанавливаем права на backup-директорию


# chown -R amanda:disk /var/backup/

Создаем каталог amanda


# mkdir -p /usr/adm/amanda

Устанавливаем правильного владельца на директорию


# chown -R amanda:disk /usr/adm/amanda
Переходим на учетную запись amanda
# su - amanda
В свой файл настроек добавляем каталог /usr/sbin в переменную PATH. Тогда
не нужно будет писать полный путь к программам расположенным в этом
каталоге, достаточно только указать их название.
$ echo «export PATH=$PATH:/usr/sbin» >> .bash_profile

Проверяем
р р статус
у “лент”
$ ammt -t file:/var/backup/ status
file:/var/backup/ status: ONLINE
Переходим в бекап-директорию
$ cd /var/backup

Модуль 1. Резервное копирование. 25


Помечаем директории и виртуальную ленту
$ for i in 1 2 3 4 5; do amlabel fasttech fasttech-$i slot $i; done
Сбрасываем счетчик лент
$ amtape fasttech reset

Проверим
р р корректность
рр нашего amanda.conf
$ amcheck -s fasttech
Amanda Tape Server Host Check
-----------------------------
slot 3: read label `fasttech-3’, date `X’

NOTE: skipping tape-writable test


Tape fasttech-3 label ok
WARNING: tapecycle (5) <= runspercycle (5).
Server check took 0.070 seconds

(brought to you by Amanda 2.5.0p2)


Если серьезных ошибок не замечено то продолжаем дальше.

Запускаем
у сервис
р
В файле /etc/xinetd.d/amandaidx меняем disable=yes на disable=no
# /etc/init.d/xinetd restart
Проверяем, начала ли работать наша служба
# netstat -lp | grep :amanda
tcp 0 0 *:amandaidx *:* LISTEN 3403/xinetd
Сервер готов.

Amanda client
# yum -y install amanda-client
Разрешаем серверу centos52 получать с нас бекап.
# echo «centos52 amanda» > `grep amanda /etc/passwd | cut -d: -f6`/.
amandahosts

Запускаем
у сервис
р
В файле /etc/xinetd.d/amanda меняем disable=yes на disable=no
# /etc/init.d/xinetd restart
# netstat -lp | grep :amanda
udp 0 0 *:amanda *:* 4850/xinetd
Клиент готов.

26 Модуль 1. Резервное копирование.


Backuping
Бекапы делаем от пользователя amanda
# su - amanda
Делаем бекап каталога /etc с сервера unixbox (ну или что там у вас в /etc/
amanda/fasttech/disklist)
$ amdump fasttech
Проверим, получилось ли у нас..
$ amadmin fasttech info unixbox /etc
Current info for unixbox /etc:
Stats: dump rates (kps), Full: 968.0, -1.0, -1.0
Incremental: -1.0, -1.0, -1.0
compressed size, Full: 26.0%,-100.0%,-100.0%
Incremental: -100.0%,-100.0%,-100.0%
Dumps: lev datestmp tape file origK compK secs
0 20090214 fasttech-3 1 11190 2906 3
Как видим бекап был успешно сделан. Поскольку мы делали первый раз
бекап каталога /etc то был сделан полный дамп (Dumps: 0)
Сделав бекап еще раз, мы увидим что на этот раз получена инкрементальная
копия (Dumps: 1)
$ amadmin fasttech info unixbox /etc
Current info for unixbox /etc:
Stats: dump rates (kps), Full: 968.0, -1.0, -1.0
Incremental: 2891.0, -1.0, -1.0
compressed size, Full: 26.0%,-100.0%,-100.0%
Incremental: 26.1%,-100.0%,-100.0%
Dumps: lev datestmp tape file origK compK secs
0 20090214 fasttech-3 1 11190 2906 3
1 20090214 fasttech-4 1 11080 2891 1

Restoring
su - amanda
Выясняем на каких лентах есть нужный нам каталог.
$ amadmin fasttech info unixbox /etc

Модуль 1. Резервное копирование. 27


Current info for unixbox /etc:
Stats: dump rates (kps), Full: 968.0, -1.0, -1.0
Incremental: 2891.0, -1.0, -1.0
compressed size, Full: 26.0%,-100.0%,-100.0%
Incremental: 26.1%,-100.0%,-100.0%
Dumps: lev datestmp tape file origK compK secs
0 20090214 fasttech-3 1 11190 2906 3
1 20090214 fasttech-4 1 11080 2891 1
Если версий этого файла много то можно использовать такую команду
$ amadmin fasttech find unixbox /etc
Scanning /var/backup/holding...
Scanning /var/backup/holding...

date host disk lv tape or file file part status


2009-02-14 unixbox /etc 0 fasttech-3 1 -- OK
2009-02-14 unixbox /etc 1 fasttech-4 1 -- OK
К примеру нам нужен файл shells из каталога /etc c ленты fasttech-3
Вставляем нужную ленту
$ amtape fasttech slot 3
Получаем нужный архив с этой ленты в наш текущий каталог
$ amrestore file:/var/backup/ unixbox '/etc'
Полученный файл — это tar-архив. Теперь возьмем из него файл shells.
$ tar xvf unixbox._etc.20090214.0 ./shells
Файл shells отправляем на сервер unixbox и замещаем им поврежденный
Точно также работаем с целыми наборами каталогов. Если команде amrestore
не передавать в качестве аргумента нужный нам каталог то мы получим все
резервируемые каталоги с сервера. Дальше дело техники.
Чтобы делать бекап в 4 утра каждый будний день, пользователю amanda в
crontab (crontab -e) помещаем такую строку:
0 4 * * 1-6 /usr/sbin/amdump fasttech

Полезное
Эта команда попросит Amanda сделать полный бекап каталога /etc с сервера
unixbox в следующий раз:
amadmin fasttech force unixbox /etc
Команда перемотает виртуальную ленту на начало
ammt -t file:/var/backup rewind
Конфигурационный файл /etc/amanda/fasttech/amanda.conf

28 Модуль 1. Резервное копирование.


org Название компании;
mailto Кому отправлять почтовые отчеты;
dumpuser Логин используемый для бекапов;
Приоритет дампера.
dumporder s – маленький размер;
S – большой размер.
taperalgo Алгоритм для выбора какой дамп записывать на ленту;
displayunit В каких еденицах отображать цифры, используем мегабайты;
dumpcycle Число дней в backup-цикле;
runspercycle Тоже самое что и dumpcycle;
Число лент которое Amanda использует в порядке ротации,
tapecycle должно быть больше чем в dumpcycle, обычно это количество
лент dumpcycle*2;
tpchanger Название устройства по смене лент;
tapedev Тип ленточного устройства;
tapetype Тип ленточного устройства ассоциированного с tapedev;
labelstr Метка которая будет наноситься на ленты;
infofile Опции задают расположение log-файлов, индексных файлов
logdir (содержащих образ бекап-директорий);
indexdir
define tapetype Задает бекап-устройство, в моем примере это диск на 500 Гб;
define dumptype Здесь задаются backup-опции.

Подводим итоги
Принцип работы Amanda понять не сложно. Есть сервер с запущенной
службой через xinetd и есть клиенты с запущенным сервисом ожидающим
подключения от сервера. В файле .amandahosts на клиенте мы разрешаем
каким серверам можно получать с нас бекап. В файле disklist на сервере мы
перечисляем список серверов и каталогов которые мы хотим резервировать
с них. Как я писал выше, изначально Amanda была создана для работы с
ленточными накопителями и это дает о себе знать. Нам нужно создать набор
каталогов и пометить их как лента. Как будто мы работаем с набором лент
ленточного накопителя. При каждом запуске резервного копирования
ленты последовательно будут меняться в “виртуальном лотке”.

Резюме
Мы разобрали теорию бекапов и научились на практике дублировать наши
данные разными способами.

Домашняя работа
Установить и настроить Amanda, сделать пару бекапов, потом удалить“случайно”
какой-нибудь файл в системе и восстановить его средствами Amanda.

Модуль 1. Резервное копирование. 29


Сетевой интерфейс Linux

Сетевой интерфейс – это точка присутствия сервера в локальной сети. В


свою очередь, локальная сеть скорее всего будет иметь доступ в глобальные
сети.
Настройка сетевого интерфейса очень частая работа для системного
администратора и в ней нет нечего сложного.
Какие файлы влияют на работу сетевого интерфейса
/etc/modprobe.conf – здесь загружаются модули ядра для различных
устройств
alias eth0 pcnet32
alias eth1 pcnet32
...
/etc/hosts – здесь находится список ip-адресов и назначенных им имен.
Удобно в отсутствие DNS-сервера или когда нет необходимости сообщать
эти имена на всю сеть.
/etc/resolv.conf – в этом файле указываются DNS сервера. DNS-сервер
задается директивой nameserver
# cat /etc/resolv.conf
nameserver 192.168.146.2
/etc/host.conf – файл указывает последовательность использования
механизмов разрешения имени. В нашем случае сначала используем /etc/
hosts а только потом DNS-сервер.
# cat /etc/host.conf
order hosts,bind
/etc/init.d/network – скрипт останавливающий и запускающий работу сети в
Linux
/proc/sys/net/ipv4/ip_forward – включение маршрутизации для своих
интерфейсов, если у вас два или более интерфейсов её нужно включить.
Включение осуществляется передачей “1” в этот файл.
# echo '1' > /proc/sys/net/ipv4/ip_forward
/etc/sysconfig/network — здесь мы указываем, является ли наш сервер
доступным по сети, если да то по каким протоколам и указываем наш
hostname, то есть имя сервера. Default gateway рекомендуется указывать
здесь.
# cat /etc/sysconfig/network
NETWORKING=yes

30 Модуль 2. Сетевой интерфейс Linux.


NETWORKING_IPV6=no
HOSTNAME=centos52
NETWORKING=yes — будет ли наш сервер работать в сети, наверно 99%
случаев ответ будет — да, то есть yes :) Эта директива для Ipv4
NETWORKING_IPV6=no — Ipv6 уже где-то используется но не настолько чтобы
переводить сервера на его использование. Пока я не буду его включать.
HOSTNAME=centos52 — имя нашего сервера
В /etc/sysconfig/network-scripts/ находятся различные скрипты влияющие на
работу сетевого интерфейса Linux
# ls -l /etc/sysconfig/network-scripts/
-rw-r--r-- 1 root root 140 Feb 14 19:23 ifcfg-eth0
-rw-r--r-- 1 root root 254 Mar 3 2008 ifcfg-lo
...
/etc/sysconfig/network-scripts/ifcfg-*

Для нас самое большое значение имеют скрипты ifcfg-*. Именно в них
описываются настройки сетевых интерфейсов присутствующих в сервере.
Давайте посмотрим что у них внутри.

DHCP iface
Данный интерфейс работает с использованием службы DHCP.
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0C:29:43:5B:3D
ONBOOT=yes
Мой компьютер работает по DHCP, что отчетливо видно по директиве
BOOTPROTO=dhcp. То есть сетевые настройки мы получаем у dhcp-сервера
при загрузке нашего сервера. Другие директивы означают следующее:
DEVICE=eth0 — как будет называться наш интерфейс, принято первый
интерфейс называть как eth0, второй eth1 и так далее
HWADDR=00:0C:29:43:5B:3D — MAC-адрес нашей сетевой карты. Media
Access Control — это уникальный идентификатор сетевой карты. У каждой
сетевой карты свой MAC-адрес и в идеале он не повторяется больше ни с
каким в мире. Иногда MAC-адрес пытаются подменить чтобы выдать свой
компьютер за чужой, по каким либо соображениям, обычно враждебным.
Длина MAC-адреса составляет 48 бит что позволяет иметь 281 474 976 710
656 уникальных комбинаций. У каждого производителя сетевых плат есть

Модуль 2. Сетевой интерфейс Linux. 31


свой диапазон в котором он назначает MAC-адреса своим платам. MAC-
адрес пишется в шестнадцатеричной форме счисления.
ONBOOT=yes — включать ли этот интерфейс автоматически при включение
сервера. Думаю, что скорее всего это и нужно.

Loopback
p iface
loopback-интерфейс необходим для нормальной работы ОС.
# cat /etc/sysconfig/network-scripts/ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
DEVICE=lo — это loopback интерфейс. Интерфейс есть в любой системе и
всегда поднят. Он нужен для нормальной работы ОС.
IPADDR=127.0.0.1 — ip-адрес loopback интерфейса. Он всегда такой.
NETMASK=255.0.0.0 — сетевая маска
NETWORK=127.0.0.0 — сеть в которой находится наш ip-адрес
BROADCAST=127.255.255.255 — адрес широковещательной рассылки
ONBOOT=yes — включать ли интерфейс при загрузке сервера, конечно да!
NAME=loopback — имя сетевого интерфейса. Вывод команды ifconfig будет
показывать значение указанное именно в DEVICE.

Custom iface
Выше мы рассмотрели интерфейс работающий по протолу dhcp. Но как
правило придется работать именно с custom-интерфейсами, то есть вручную
задавать параметры и маршрутизацию о которой мы поговорим немного
позже.
Вот custom-интерфейс
DEVICE=eth0
IPADDR=192.168.0.2
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=255.255.255.255
GATEWAY=192.168.0.1

32 Модуль 2. Сетевой интерфейс Linux.


ONBOOT=yes
BOOTPROTO=dhcp здесь отсутствует но есть другие директивы.
IPADDR=192.168.0.2 — здесь мы задаем ip-адрес нашего интерфейса
NETMASK=255.255.255.0 — сетевая маска
NETWORK=192.168.0.0 — сеть в которой находится наш ip-адрес
BROADCAST=255.255.255.255 — адрес широковещательной рассылки
GATEWAY=192.168.0.1 — шлюз через который мы попадаем в другие сети
ONBOOT=yes — включать ли интерфейс при загрузке сервера

Практика
Настроим сетевой интерфейс в Linux. Мы знаем что lo всегда включен и его
не нужно вообще трогать.
Редактируем /etc/sysconfig/network-scripts/ifcfg-eth0
Мой конфигурационный файл выглядит так:
DEVICE=eth0
HWADDR=00:0C:29:43:5B:3D
IPADDR=192.168.146.130
NETMASK=255.255.255.0
BROADCAST=192.168.146.255
GATEWAY=192.168.146.2
ONBOOT=yes

Далее нужно перезагрузить сетевой интерфейс чтобы прочитались новые


настройки
# service network restart
или
# /etc/init.d/network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]

Проверим все ли поднялось


# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:43:5B:3D

Модуль 2. Сетевой интерфейс Linux. 33


inet addr:192.168.146.130 Bcast:192.168.146.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff :fe43:5b3d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1327 errors:0 dropped:0 overruns:0 frame:0
TX packets:1340 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:149547 (146.0 KiB) TX bytes:232486 (227.0 KiB)
Interrupt:59 Base address:0x2000
...
Жирным выделены особенно интересные нам участки в выводе команды
ifconfig. Как видим все похоже на правду и интерфейс «поднят», то есть
находится в рабочем режиме.
Для большей ясности разберем и некоторые другие параметры сетевого
интерфейса
MTU:1500 — это Maximum Transfer Unit. Различные сети и каналы передачи
имеют разные скорости обмена. Это определяет максимальную длину пакета,
пересылка которого с высокой вероятностью произойдет без ошибок. Для
Ethernet — сетей значение MTU составляет 1500 байт.
Metric:1 — чем меньше это значение тем лучше считается маршрут до этой
сети. На серверах скорее всего это менять не придется. Этот параметр играет
большую роль в работе протоколов маршрутизации.
Сollisions:0 — нулевое значение говорит о том, что с сетевым интерфейсом
все в порядке на физическом уровне.
RX bytes — сколько данных принято
TX bytes — сколько данных отослано

Так идем дальше. В примере выше, после настройки сетевого интерфейса


мы полностью перезагружали службу network. Когда на сервере только один
интерфейс это не страшно, но если их несколько и какие-то уже работают
и выполняют свои функции прерывать их работу нежелательно. Тут нам на
помощь приходит скрипт ifup/ifdown. Он нужен для перезагрузки какого
либо одного сетевого интерфейса. Короткий пример.
Шаг 1. Вносим изменения в /etc/sysconfig/network-scripts/ifcfg-eth0
Шаг 2. # ifdown eth0
Шаг 3. # ifup eth0

34 Модуль 2. Сетевой интерфейс Linux.


Маршрутизация
р ру ц
Маршрутизация — это процесс поиска наилучшего пути от источника к
получателю. Это набор правил по которым будет передаваться трафик.
Мы вроде бы с ней еще нечего не делали, но она уже у вас работает. Не
верите ? Сейчас проверим.
netstat – команда позволяющая отслеживать сетевые подключения сервера

# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.146.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.146.2 0.0.0.0 UG 0 0 0 eth0

В выводе мы увидим список сетей и как до них добраться. То есть какой


шлюз использовать для достижения пункта назначения. Помните, когда мы
настраивали сетевой интерфейс eth0 мы указали директиву GATEWAY в ifcfg-
eth0 ? Этот gateway был помечен как default, то есть шлюз по умолчанию.
Весь трафик в сети, которые явно не описаны в таблице маршрутизации,
отправляются через шлюз по умолчанию. В нашем случае default gateway —
192.168.146.2

Вывод команды “netstat -r” нам говорит следующее


Первая строка. Чтобы попасть в подсеть 192.168.146.0 нам не нужен никакой
шлюз (*), поскольку мы и так находимся в этой сети
Вторая строка — это default, то есть маршрут по умолчанию. Весь трафик
предназначенный по все остальные сети будет уходить через этот шлюз.
Genmask — это сетевая маска, благодаря маске можно отделить сетевую
часть адреса от адреса хоста
Flags: U — это UP, то есть маршрут поднят и функционирует сейчас
Flags: UG — UP, Gateway. Маршрут поднят и использует gateway в своей
работе
MSS – Maximum Segment Size, определяет максимальный размер пакета для
этого маршрута.
Window – размер окна. Максимальный размер пакета, который система
готова принять.
irtt - initial round trip time, задает значение которое используется при установке

Модуль 2. Сетевой интерфейс Linux. 35


соединения. Round trip time – представляет из себя отрезок времени, если
в течение которого от удаленного хоста не пришло подтверждение о
получение пакета, пакет будет выслан снова.
Iface – показывает к какому интерфейсу относится маршрут

Прописываем
р маршруты
р ру
Если на сервере несколько сетевых интерфейсов то скорее всего понадобится
вручную составить таблицу маршрутизации.
Приведу пример. У нас два сетевых интерфейса eth0 и eth1. Через eth0
мы получаем доступ во внешние сети и по умолчанию весь трафик
направляется через него. Через eth1 мы получаем доступ ко внутренней сети
192.168.147.0/24 но что еще важнее, в этой сети есть сервер 192.168.147.1
у которого есть сетевой интерфейс в подсеть 192.168.148.0/24 и мы очень
хотим туда попадать. А для того что туда попадать необходимо прописать
правильные маршруты у себя в ОС.

Так выглядит таблица маршрутизации в нашем случае


# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.147.0 * 255.255.255.0 U 0 0 0 eth1
192.168.146.0 * 255.255.255.0 U 0 0 0 eth0
192.168.148.0 192.168.147.1 255.255.255.0 UG 0 0 0 eth1
default 192.168.146.2 0.0.0.0 UG 0 0 0 eth0

То есть в подсеть 192.168.148.0/24 (внутренняя подсеть) мы попадаем через


eth1 -> 192.168.147.1, сервер выполняющий роль шлюза в эту подсеть. Все
остальное идет через default шлюз. Все очень просто. Ну и собственно как
привести настройки к этому.

36 Модуль 2. Сетевой интерфейс Linux.


Шлюз по умолчанию
# cat /etc/sysconfig/network
...
GATEWAY=192.168.146.2
...

eth0

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:43:5B:3D
IPADDR=192.168.146.130
NETMASK=255.255.255.0
BROADCAST=192.168.146.255
ONBOOT=yes

eth1

# cat /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
HWADDR=00:0c:29:43:5b:47
IPADDR=192.168.147.2
NETMASK=255.255.255.0

И самое главное, файл в котором мы прописываем статический маршрут для


eth1.
# cat /etc/sysconfig/network-scripts/route-eth1
192.168.148.0/24 via 192.168.147.1

Для того чтобы прописать маршруты для какого либо интерфейса,


необходимо создать файл route-<название интерфейса> в каталоге /
etc/sysconfig/network-scripts/ После того как все готово к работе, мы
перезагружаем сетевой сервис.
# service network restart

Модуль 2. Сетевой интерфейс Linux. 37


Теперь подведем итоги, что и как мы сделали.
Есть три вида маршрутов. Динамические – которые динамически назначаются
сетевому интерфейсу, например сервером DHCP. Статические – которые вы
вручную прописываете и они остаются в настройках после перезагрузки
сервера. И маршруты по умолчанию – когда никакие другие маршруты не
подходят для того, чтобы отослать по ним пакеты.
Мы могли добавить маршрут в подсеть 192.168.148.0/24 командой route
# route add -net 192.168.148.0/24 gw 192.168.147.1
Но после перезагрузки сервера информация о маршруте пропала бы.
Чтобы такого не произошло используется специальный механизм. А именно
создание файла вида route-<имя интерфейса> в /etc/sysconfig/network-
scripts В него мы вносим список сетей и как до них добраться. Каждая новая
запись начинается с новой строки.

Про
р шлюз
Чтобы сервер был шлюзом для других компьютеров необходимо
удовлетворить ряд условий:
1.На сервере корректная таблица маршрутизации благодаря которой он
поймет что делать с пакетами дальше;
2.Включена передача пакетов между интерфейсами:
# echo '1' > /proc/sys/net/ipv4/ip_forward
3.Включен маскарадинг (или установлен прокси) для
нужной нам сети, например вот так (перенаправлять
пакеты для хостов из подсети 192.168.146.0/24):
# iptables -t nat -A POSTROUTING -s 192.168.146.0/24 -j MASQUERADE

Полезные ключи netstat


r – показывает таблицу маршрутизации
n – выводит статистику по ip-адресу, не пытается определить имя хоста. Это
работает несколько быстрее и обычно, вывод команды удобнее читать
a – показывает состояние всех сокетов на сервере. Сокет – это конечная
точка сетевых коммуникаций. Каждый сокет имеет тип и ассоциированный
с ним процесс.
t – протокол tcp
u – протокол udp
i – отображает таблицу сетевых интерфейсов
l – отображает сокеты в режиме LISTEN, то есть ожидающие соединения
p – показать PID (process ID) и имя программы с которой взаимодействует
сокет

38 Модуль 2. Сетевой интерфейс Linux.


netstat на практике
р
Параметров выше вполне достаточно, чтобы многое узнать из жизни сетевых
служб.
Слушает ли кто нибудь 25-й порт ?
# netstat -nlp | grep :25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2710/sendmail:

Видим что 25-й порт слушает процесс sendmail с PID 2710


# ps ux | grep 2710
root 2710 0.0 0.7 8992 1836 ? Ss 11:17 0:00 sendmail: accepting
connections

Посмотрим текущие ESTABLISHED-соединения по tcp, то есть с кем у нас есть


подключение и по какому порту
# netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2642 ESTABLISHED
tcp 0 132 ::ffff :192.168.146.130:22 ::ffff :192.168.146.1:2027 ESTABLISHED

Как видим это только соединения по ssh


Также, будет полезно знать какие состояния бывают у сокетов:
ESTABLISHED – сокет с установленным соединением;
SYN_SENT – сокет в процессе установки соединения;
SYN_RECV – был принят запрос установки соединения из сети;
FIN_WAIT1 – сокет закрыт и соединение закрывается;
FIN_WAIT2 – сокет закрыт и сокет ждет закрытия соединения с удаленного
хоста;
TIME_WAIT – сокет после своего закрытия, еще какое-то время принимает
пакеты из сети;
CLOSED – сокет не используется;
CLOSE_WAIT – удаленный хост отключился, ожидаем закрытия сокета;
LAST_ACK – удаленный хост отключился и сокет закрыт. Ожидание
потдверждения;
LISTEN – сокет ожидает входящие подключения;
CLOSING – оба сокета отключились но еще не все наши данные отосланы;
UNKNOWN – статус сокета неизвестен.

Модуль 2. Сетевой интерфейс Linux. 39


Мы научились настраивать один и более сетевых интерфейсов. Разобрались
с маршрутизацией. Узнали какие файлы и как влияют на работу сети в
Linux. Сейчас мы познакомимся с двумя программами которые играют
существенную роль в работе сети. Это программа nmap – которая сканирует
порты удаленного хоста и сообщается какие порты на нем открыты. И
программа tcpdump, она переводит вашу сетевую плату в режим promiscuous,
что позволяет перехватывать весь трафик проходящий через карту.

NMAP
Nmap позволяет сканировать удаленные компьютеры на предмет открытых
портов. С более агрессивными опциями можно узнать версию ОС и
некоторые другие вещи.

Устанавливаем программу
# yum -y install nmap

Просканируем удаленный хост. Как видим есть кое что интересное.


# nmap -A -T5 192.168.146.132

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-02-18 19:36 MSK


Interesting ports on unixbox (192.168.146.132):
Not shown: 1677 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.3 (protocol 2.0)
111/tcp open rpcbind 2 (rpc #100000)
935/tcp open status 1 (rpc #100024)
MAC Address: 00:0C:29:25:04:55 (VMware)
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.7 - 2.6.11
Uptime 0.195 days (since Wed Feb 18 14:55:10 2009)
Nmap finished: 1 IP address (1 host up) scanned in 14.239 seconds

У nmap много различных опций, подробнее о них можно прочитать в man


nmap

40 Модуль 2. Сетевой интерфейс Linux.


tcpdump
p p
Иногда в целях выявления неисправностей нам нужно выяснить, какие
пакеты передаются по сети. Это не сложно сделать с помощью tcpdump.
Слушаем весь трафик для MAC-адреса 00:a0:80:00:2f:fe на интерфейсе eth1
# tcpdump -n -i eth1 «ether host 00:a0:80:00:2f:fe»

Слушаем трафик для определенного ip-адреса и порта


# tcpdump -nn host 192.168.146.130 and port 22

Сканируем диапазон портов


# nmap -sT -p 13722-13783 linuxbox

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

Домашнее задание
Пройдитесь по всем пунктам описанным в этом модуле. Воспользуйтесь
nmap и tcpdump на практике.

Модуль 2. Сетевой интерфейс Linux. 41


TFTP

TFTP (Trivial File Transfer Protocol) — это простой протокол передачи данных.
Для передачи данных использует протокол UDP, что в свою очередь не
гарантирует надежность передачи. Также в нем нет средств аутентификации
пользователей. TFTP используется в связке с другими технологиями когда
нужно просто передать файл без каких либо сложностей.
Самые рраспространенные
р р способы использования TFTP:
передача файлов при загрузке бездисковых рабочих станций;
передача начального загрузочного образа при установке ОС по сети;
участие в процессе backup`а и восстановления конфигурации сетевого
оборудования;
другие схожие операции.
TFTP ищет все файлы в каталоге /tftpboot который создается автоматически
при установке программы.

Установка
Устанавливаем пакет tftp-server из репозитория
# yum -y install tftp-server

Теперь необходимо включить tftp в конфигурации xinetd, для этого в файле


/etc/xinetd.d/tftp

Меняем “disable = yes” на “disable = no” и включаем xinetd


# service xinetd start

Проверяем что порт tftp-сервера прослушивается (tftp работает на порту 69)


# netstat -nlp | grep :69
udp 0 0 0.0.0.0:69 0.0.0.0:* 3105/xinetd

Работа с TFTP
После того как TFTP-сервер запущен можно помещать все нужные файлы в /
tftpboot на отдачу по сети.
Если вы хотите делать backup файлов конфигураций сетевых устройств,
например оборудование компаний Cisco или Nortel то сначала нужно
создать пустые файлы в которые планируется сохранять конфигурацию.

42 Модуль 3. TFTP
То есть при backup`е конфигурации в файл на TFTP-сервере он уже должен
существовать!
Создаем пустой файл
# touch /tftpboot/cisco2960.backup

Устанавливаем на него права


# chmod 666 /tftpboot/cisco2960.backup

Типы пакета
В каждом передаваемом пакете есть поле размером 2 байта, оно и определяет
что это за пакет. Знание какой тип чего делает может помочь при анализе
сетевого трафика, например с помощью tcpdump.
RRQ (Read Request) – запрос на чтение файла;
WRQ (Write Request) – запрос на запись файла;
DATA – данные передаваемые через tftp;
ERR (Error) – ошибка;
OACK (Options Acknowledgment) – подтверждение опций.

Режимы передачи
Существует два режима передачи файлов:
netascii – файл перед передачей перекодируется в ASCII
octet – файл передается без изменений

Коды ошибок
0 Нет определенного кода, см. текст ошибки;
1 Файл не найден;
2 Доступ запрещен;
3 Невозможно выделить место на диске;
4 Некорректная TFTP-операция;
5 Неправильный Transfer ID;
6 Файл уже существует;
7 Пользователь не существует;
8 Неправильная опция.

Модуль 3. TFTP 43
Клиент tftp

Чтобы подключаться к TFTP-серверу из командной строки нужно поставить


tftp-клиент
# yum -y install tftp

Ну а далее просто подключаемся к tftp-серверу, например:


# tftp 192.168.146.135

Можно набрать help чтобы получить список доступных команд. Самое


распространенное действие – это скачка файла, сделать это можно командой
get.
tftp>get filename.txt

Резюме
Обычно TFTP используется в связке с другими технологиями а для
классической передачи данных используют FTP. Настройка TFTP не занимает
более 10 минут.

Домашнее задание
Сделайте TFTP-сервер и поработайте с ним. Закачайте/скачайте файлы
воспользовавшись tftp-клиентом.

44 Модуль 3. TFTP
NFS

Network File System — сетевая файловая система разработанная компанией


Sun Microsystems в 1984 году. Технология позволяет монтировать удаленные
файловые системы у себя, далее вы с ними работаете как с локальными,
права доступа задаются при экспорте.

Установка
Скорее всего NFS уже есть в системе. Это можно проверить следующей
командой.
# chkconfig --list nfs
nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off

Добавляем в автозагрузку
# chkconfig nfs on
# service nfs start

Если же nfs в системе не обнаружен то ставим из репозитория


# yum -y install nfs-utils

В своей работе NFS использует RPC-вызовы а значит работоспособность


службы можно проверить с помощью portmapper (он тоже должен быть
запущен на сервере где выполняются программы использующие RPC Calls).
# rpcinfo -p localhost | grep nfs
program vers proto port
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs

Как видим на моем сервере обслуживаются NFS-запросы всех версий NFS


(4-ая - последняя на данный момент).

Модуль 4. NFS. 45
Настройка
Файл конфигурации /etc/exports содержит список файловых систем которые
мы экспортируем, то есть разрешаем монтировать по протоколу NFS на
удаленных системах.
Каждая строка в файле это указание на экспортируемую ФС и режим доступа
к ней, шаблон следующий:
[файловая система] [кому разрешено получать доступ] [опциональные
ключи]

Пример /etc/exports:
/home 192.168.146.135(rw,no_root_squash)
Здесь мы разрешаем монтировать /home на сервере 192.168.146.135 в
режиме rw

Внимание! Аккуратнее с пробелами в файле. Если написать /home


192.168.146.135 (rw) то сервер 192.168.146.135 получит доступ к /home
в режиме ro, все остальные в rw. Если 192.168.146.135(rw) то сервер
192.168.146.135 получит доступ в режиме rw, всем остальным доступ будет
запрещен!

Перечитываем файл чтобы внесенные изменения начали действовать.


# exportfs -r

Проверим список экспортированных ФС


# exportfs
/home 192.168.146.135
Как видим все хорошо. Теперь на сервере 192.168.146.135 попробуем
примонтировать ФС /home экспортированную на 192.168.146.132

Создаем каталог куда будем монтировать


# mkdir /mnt/nfs

Монтируем с помощью команды mount. Ключем -t задаем тип монтируемой


ФС, далее <hostname>:<resource> <точка монтирования в локальной
системе>
# mount -t nfs 192.168.146.132:/home /mnt/nfs

46 Модуль 4. NFS.
Используя опцию -o можно указать дополнительные ключи монтирования.
По умолчанию монтирование происходит в режиме rw.
Если ФС экспортированы на сервере который работает 24 часа в сутки
то монтирование разделов можно добавить в /etc/fstab тем самым
автоматизировав процедуру при старте компьютера.
Строчка в /etc/fstab в нашем случае будет такая:
192.168.146.132:/home /mnt/nfs nfs defaults
Все готово.

Опции конфигурационного файла


Самые часто используемые опции я описал ниже.
ro Только чтение;
rw Чтение и запись;
root_squash Не разрешает пользователю root получать root-
привилегии в удаленной файловой системе, все
действия будут сделаны от лица пользователя nobody;
no_root_squash Пользователь root в локальной системе получает такие
же права в удаленной. Стоит использовать эту опцию
только в случае острой необходимости. Используется
для бездисковых клиентов;
all_squash Все запросы происходят от анонимного пользователя,
что способствует повышению безопасности. Актуально
для публичных разделов;
anonuid/anongid Позволяет задать UID и GID пользователя от лица
которого будут выполняться все запросы;
sync Синхронный режим работы, ответы на запросы
происходят только после того, как данные будут
надежно записаны на диск. Надежность выше,
производительность меньше;
async Асинхронный режим работы, ответы на запросы
происходят сразу, не дожидаясь записи на диск.
Надежность ниже, производительность выше;
insecure Разрешать запросы с портов более чем 1024;
no_subtree_check Если экспортируется подкаталог файловой системы, но
не вся файловая система, сервер, проверяет, находится
ли запрошенный файл в экспортированном подкаталоге.
Эта проверка называется проверкой подкаталога.
Отключение проверки уменьшает безопасность, но
увеличивает скорость передачи данных.

Модуль 4. NFS. 47
Указать каким хостам разрешено монтировать наши разделы можно
несколькими способами:

1. Указать hostname или просто IP-адрес;


2. Указать “*”, что означает разрешено всем. Если указать *.fasttech.ru то
будет разрешено testers.fasttech.ru но запрещено alex.testers.fasttech.ru
Чтобы этого избежать нужно написать *.*.fasttech.ru;
3. В нужных местах использовать “?”, что заменяет любой символ (не
применимо к IP-адресам);
4. Использовать маски подсетей, например 192.168.146.32/27;
5. Использовать NIS-группы, например @nisgroup2.

Дополнительная информация
Описанного выше должно хватить сполна, но если хочется больше то:
# man nfs
# man exports
# man exportfs

Не путайте exports и exportfs. exports – это конфигурационный файл, exportfs


– программа для работы с ним.

Резюме
Мы выяснили что такое NFS и как ее использовать.

Домашнее задание
Сделайте доступ к ресурсу с помощью NFS и примонтируйте его с другого
компьютера.

48 Модуль 4. NFS.
Install-сервер

В “зоопарке” системных администраторов часто попадаются сервера


без внешних CD/DVD-приводов. Время от времени на них нужно ставить
операционную систему и в этом может сильно помочь установка по сети.
Вы просто включаете сервер и начинаете установку. Сетевая карта должна
поддерживать технологию PXE. PXE – Pre-Boot Execution Environment,
позволяет осуществлять загрузку по сети.
Но PXE не достаточно для полного счастья, технология которая позволит
полностью автоматизировать установку – kickstart (разработчиком которой
является компания Red Hat). Суть ее проста, мы заранее составляем файл
содержащий значения всех опций которые могут понадобиться в ходе
установки. Более того мы можем выполнять свои скрипты до установки и
после. Тем самым задавая настройки будущей ОС. Установка с помощью
kickstart типового комплекта Linux занимает 5-7 минут.
Для Install-сервера нужно 3 службы и 1 пакет.
DHCP – предоставляет клиентам сетевые реквизиты
TFTP – простой способ предоставить доступ к файлам по сети
Syslinux – пакет содержит загрузчик pxelinux.0 и некоторые другие файлы
NFS – предоставляет доступ к файловой системе по сети

Принцип работы

Процесс установки можно разбить на этапы:


pxe – прошивка pxe начинает свою работу, когда мы в BIOS выставляем
p
установку по сети или когда на HDD не найдена MBR
DHCP фаза
ф 1 – клиент получает сетевые реквизиты и адрес tftp-сервера а
также название файла-загрузчика (pxelinux.0). По умолчанию TFTP-сервер
это DHCP-сервер.
TFTP – загрузчик pxelinux.0 обращается к TFTP-серверу и запрашивает у него
initrd.img (Initial RAM disk, временная файловая система) ядро Linux.
Kernel – передача управления ядру Linux
DHCP фаза
ф 2 – ядро Linux далет запрос к DHCP-серверу чтобы получить

Модуль 5. Install-сервер. 49
сетевые реквизиты и в дальнейшем адрес NFS-сервера
NFS – этап когда монтируется NFS-раздел
Init – происходит запуск /sbin/init и управление передается ему. Init – это
главный процесс в системе, другие процессы являются родительскими
процессами init.
В свободном изложение:
DHCP-сервер ожидает bootp-запросы в своей сети, после того как он получает
запрос он смотрит MAC-адрес источника, и если о таком MAC-адресе у него
имеется соответствующая запись он начинает с ним работать. DHCP —
сервер выдает клиенту сетевые реквизиты (ip-адрес, gateway, DNS-сервера,
...) и по протоколу TFTP, с помощью TFTP-сервера отправляет загрузочный
образ pxelinux.0. Этого образа хватает чтобы вывести меню выбора ОС.
Выбрав ОС вы начинаем загрузку ядра и начинаем инсталляцию, в процессе
выбрав источник установки — NFS-сервер. На NFS-сервер нужно выложить
подготовленный контент будущей операционной системы и убедиться, что
соответствующие каталоги экспортированы.

DHCP
Устанавливаем DHCPD и добавляем его в автозагрузку
# yum -y install dhcp
# chkconfig dhcpd on

Файл /etc/dhcpd.conf делаем такой:

ddns-update-style interim;
ignore client-updates;

subnet 192.168.146.0 netmask 255.255.255.0 {

option routers 192.168.146.2;


option subnet-mask 255.255.255.0;

option domain-name «company.ru»;


option domain-name-servers 192.168.146.2;

default-lease-time 21600;
max-lease-time 43200;

Allow bootp;
Allow booting;

50 Модуль 5. Install-сервер.
host unixbox {
hardware ethernet 00:0c:29:77:9c:9c;
fixed-address 192.168.146.129;
filename «pxelinux.0»;
option subnet-mask 255.255.255.0;
option routers 192.168.146.2;
option domain-name «company.ru»;
option host-name «unixbox»;
next-server 192.168.146.130;
}
}
Запускаем DHCPD или перезагружаем если он был запущен
# service dhcpd restart

TFTP
Устанавливаем пакет tftp-server из репозитория
# yum -y install tftp-server
Теперь необходимо включить tftp в конфигурации xinetd, для этого в файле
/etc/xinetd.d/tftp
Меняем “disable = yes” на “disable = no” и включаем xinetd
# service xinetd start
Проверяем что порт tftp-сервера прослушивается (tftp работает на порту 69)
# netstat -nlp | grep :69
udp 0 0 0.0.0.0:69 0.0.0.0:* 3105/xinetd

Syslinux
Пакет содержит набор файлов для загрузки по сети. Нам нужны pxelinux.0
который как загрузочный образ мы будем отдавать через DHCP и menu.
c32, с помощью этого файла будет рисоваться более привлекательное меню
пользователя.
# cp $(rpm -ql syslinux | grep menu.c32) /tftpboot/
# cp $(rpm -ql syslinux | grep pxelinux.0) /tftpboot/

NFS
По умолчанию в системе скорее всего есть NFS, если нету то поставьте с
помощью yum.
# chkconfig nfs on

Модуль 5. Install-сервер. 51
В файл /etc/exports добавляем запись
echo “/var/install-server/ *(ro,no_root_squash)” >> /etc/exports

Запускаем nfs-сервер
# service nfs start

Проверяем что каталог экспортирован


# exportfs
/var/install-server
<world>

Создаем структуру tftp-сервера добавляем контент на сервер


# mkdir -p /tftpboot/{pxelinux.cfg,centos52_x86}
# mkdir -p /var/install-server/centos52_x86
Монтируем наш DVD с CentOS 5.2 и закачиваем содержимое в /var/install-
server/centos52_x86
# mount /dev/cdrom /mnt/
# cp -r /mnt/* /var/install-server/centos52_x86/
#cp /var/install-server/centos52_x86/images/pxeboot/* /tftpboot/centos52_x86/

В каталоге /tftpboot/pxelinux.cfg создаем файл default и заполняем его как


ниже:
default menu.c32
menu title Linux Install Server. Please choose OS to install.
prompt 0
timeout 100

label CentOS 5.2 x86 Custom install


kernel /centos52_x86/vmlinuz
append initrd=/centos52_x86/initrd.img

label Quit
localboot 0

Устанавливаем ОС по сети
После всех сделанных манипуляций которые описаны выше, можем
приступить к установке ОС. Стартуем нашу машину с MAC-адресом
00:0c:29:77:9c:9c включив в BIOS загрузку по сети. Когда начнется установка
все делаем стандартным образом, кроме как в списке откуда будет ставить

52 Модуль 5. Install-сервер.
ОС нужно выбрать NFS, далее когда попросят, указать:
NFS server name : 192.168.146.130
CentOS directory: /var/install-server/centos52_x86
Дальше устанавливаем ОС и пользуемся на здоровье :)

Автоматизация установки с помощью Kickstart


Для автоматизации нужно создать файл содержащий всю нужную
информацию, которая может потребоваться в процесс установки. Такой
файл создается программой system-config-kickstart (GUI tool) в любой CentOS
с X Window
# yum -y install system-config-kickstart
# system-config-kickstart
После того как мы создали файл с помощью system-config-kickstart его нужно
перенести на Install-сервер и сделать доступным по одному из протоколов
– http, nfs или ftp. Поскольку в работе Install-сервера активно используется
NFS то и будем использовать ее.
В моем случае kickstart-файл лежит в /var/install-server/centos52_x86/
centos52_x86_ks.cfg
В файл /tftpboot/pxelinux.cfg/default нужно всего лишь добавить директиву
ks с указанием местоположения kickstart-файла. Пример с kickstart-файлом.
default menu.c32
menu title Linux Install Server. Please choose OS to install.
prompt 0
timeout 100

label CentOS 5.2 x86 Custom install


kernel /centos52_x86/vmlinuz
append initrd=/centos52_x86/initrd.img

label CentOS 5.2 x86 Kickstart Install


kernel /centos52_x86/vmlinuz
append initrd=/centos52_x86/initrd.img ks=nfs:192.168.146.135:/var/install-server/
centos52_x86/centos52_x86_ks.cfg

label Quit
localboot 0
Теперь выбрав «CentOS 5.2 x86 Kickstart Install» в меню выбора ОС нам
останется только подождать сервера с установленной на нем ОС.
Ниже пример моего Kickstart-файла. Мне захотелось чтобы в установленной

Модуль 5. Install-сервер. 53
ОС в настройках sshd была опция «PermitRootLogin yes». Kickstart-файл
позволяет не только задавать параметры установки ОС но и выполнять
скрипты, до инсталляции (%pre) и после (%post). Таким образом можно
написать массу скриптов по тюнингу и за 5-10 минут инсталляции получить
полностью готовую ОС.
#platform=x86, AMD64, or Intel EM64T
# System authorization information
auth --useshadow --enablemd5
# System bootloader configuration
bootloader --location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all --initlabel
# Use text mode install
text
# Firewall configuration
firewall --disabled
# Run the Setup Agent on first boot
firstboot --disable
# System keyboard
keyboard us
# System language
lang en_US
# Installation logging level
logging --level=info
# Use NFS installation media
nfs --server=192.168.146.130 --dir=/var/install-server/centos52_x86
# Network information
network --bootproto=dhcp --device=eth0 --onboot=on
#Root password
rootpw --iscrypted $1$Bz09jb2I$hfzh2vApqMjG0sEPsAwNr/

# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx
# System timezone
timezone Europe/Moscow
# Install OS instead of upgrade
install
# Disk partitioning information
part swap --bytes-per-inode=4096 --fstype=”swap” --size=512
part / --bytes-per-inode=4096 --fstype=”ext3” --grow --size=1
%post --interp /bin/bash
PATH=/somework
/bin/mkdir $PATH
/bin/sed -e ‘s/#PermitRootLogin yes/PermitRootLogin yes/g’ /etc/ssh/sshd_config >
$PATH/sshd_config_edited
/bin/cp $PATH/sshd_config_edited /etc/ssh/sshd_config
/bin/rm -rf $PATH

54 Модуль 5. Install-сервер.
%packages
@base
@mysql
@mail-server
@web-server
@system-tools
После того как процесс установки завершится нужно закомментировать
строчку “ filename “pxelinux.0”;” в /etc/dhcpd.conf, чтобы после перезагрузки
сервера снова не начался процесс установки. Я пробовал поставить“label Quit”
первым в списке меню, чтобы по таймауту делался localboot 0 (выход из меню
и загрузка ОС на сервере), но счетчик банально не отсчитывается. Очевидно
это один из багов syslinux. Скажу что в Debian все работает нормально.
Как видно секции %packages, были установлены базовые утилиты, MySQL,
MTA, Apache и системные утилиты.
Установка ОС у меня заняла 5 минут.

Диагностика
В случае возникновения неисправностей используйте tcpdump. Но его также
стоит использовать чтобы понять как все работает “изнутри”.
# tcpdump -n -i eth0 “ether host 00:0c:29:25:04:55”
Ну и на всякий случай структура каталога /tftpboot

Резюме
Мы разобрались с простым и эффективным способом быстрой установки
ОС по сети.

Домашнее задание
Сделать свой Install-сервер и используя его, установить ОС на клиент. Можно
использовать мой kickstart-файл в качестве примера, только не забудьте
изменить IP-адрес NFS-сервера и путь к дистрибутиву Linux, пароль на
систему будет 111111 (root/111111).

Модуль 5. Install-сервер. 55
Xen

Что это такое ?


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

Зачем это нужно ?


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

Типы виртуализации

Эмуляция
у ц аппаратуры
р ур

Популярный продукт в этой категории: QEMU


На хост-машине создается виртуальная машина которая эмулирует
определенную архитектуру. Способ работает медленно но полезен, когда
нужно на сервере запустить ОС другой архитектуры.

Полная виртуализация
р у ц

56 Модуль 6. Виртуализация. Xen.


Популярный продукт в этой категории: VMware
В работе этого способа используется виртуальная машина (hypervisor)
которая выступает посредником между гостевой ОС и реальным
оборудованием. Гостевая ОС может быть запущена без всяких модификаций,
но должна поддерживать аппаратную платформу.

Паравиртуализация
р р у ц

Популярный продукт в этой категории: Xen


Способ похож на полную виртуализацию – здесь тоже используется
гипервизор, но код виртуализации интегрируется в саму операционную
систему. Это конечно же минус, но паравиртуализация позволяет добиться
производительности близкой к не виртуализированной ОС.

Виртуализация
р у ц уруровня операционной
р ц системы

Популярный продукт в этой категории: Linux-VServer


Способ виртуализации, при котором виртуализируются серверы
запускаемые в самой операционной системе. В этом случае операционная
система одна и просто изолируются сервера запускаемые под ее
управлением. Необходима модификация ядра.

Модуль 6. Виртуализация. Xen. 57


Архитектура Xen

Причины по которым стоит использовать виртуализацию.


1. Сильная экономия на аппаратном оборудование при консолидации
серверов;
2. Возможность поддержки старых платформ в целях совместимости;
3. Возможность изолировать потенциально опасные окружения;
4. Возможность создания любой аппаратной конфигурации (в рамках
возможностей сервера);
5. Симуляция различного оборудования в виртуальной машине (зависит от
возможностей ПО виртуализации);
6. Возможность создания виртуальных сетей в рамках одного сервера;
7. Мобильность виртуальных машин (простота переноса между двумя
физическими серверами);
8. Повышение управляемости сервером (простота создания резервных
копий).

Настраиваем сервер виртуализации


Создадим виртуальную машину и научимся ее использовать. Также
разберемся с Xen.

58 Модуль 6. Виртуализация. Xen.


Установка Xen
Мои виртуальные машины будут располагаться в /vm. Я специально выделил
этот раздел сервера под виртуальные машины.
Устанавливаем Xen
# yum -y install xen

В процессе установки в /boot/grub/menu.lst будет добавлен блок загрузки


ядра с поддержкой Xen
title CentOS (2.6.18-92.1.22.el5xen)
root (hd0,0)
kernel /xen.gz-2.6.18-92.1.22.el5
module /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/VolGroup00/LogVol00
module /initrd-2.6.18-92.1.22.el5xen.img

Нужно сделать так чтобы именно оно загружалось в процессе загрузки


сервера. Для этого опцию ”default=1” меняем на “default=0”. Таким образом
будет загружаться ядро перечисленное первым в файле загрузчика Grub
(наше ядро с поддержкой Xen).

Перезагружаем сервер
# shutdown -r now

Убедимся что Xen удачно стартовал. В процессе загрузки сервера мы должны


увидеть что-то похожее.

Посмотрим какое ядро загрузилось в самой ОС.


# uname -r
2.6.18-92.1.22.el5xen
Отлично, как видим загрузилось ядро с поддержкой Xen.

Модуль 6. Виртуализация. Xen. 59


Создание новых виртуальных машин в Xen
Давайте посмотрим список нашим виртуальных машин.
# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 26 1 r----- 59.3
Поскольку мы только начали, никаких виртуальных машин нет. Но сейчас
мы это исправим. Установка новой ВМ можно сделать с помощью команды
virt-install.

[root@localhost ~]# virt-install


What is the name of your virtual machine? linuxbox4
How much RAM should be allocated (in megabytes)? 256
What would you like to use as the disk (file path)? /vm/linuxbox4.img
How large would you like the disk (/vm/linuxbox4.img) to be (in gigabytes)? 6
Would you like to enable graphics support? (yes or no) no
What is the install location? /mnt

Распишуу по пунктам
у о чем нас спрашивали:
р
“What is the name of your virtual machine?” - здесь мы указываем имя
виртуальной машины
“How much RAM should be allocated (in megabytes)?” - сколько оперативной
памяти выделить для новой виртуальной машины
“What would you like to use as the disk (file path)?” - путь к файлу-образу
будущей виртуальной машины
“How large would you like the disk (/vm/linuxbox4.img) to be (in gigabytes)?” -
сколько места выделить для новой ВМ в гигабайтах
“Would you like to enable graphics support? (yes or no)” - обращаю внимание,
что пункт не имеет отношения к X Window в новой системе. Здесь нас
спрашивают, в каком режиме мы хотим провести процесс инсталляции.
Ставиться мы будем из консоли без графики. В противном случае нужно
было бы использовать VNC чтобы подключиться к этой машине. Лишние
хлопоты.
“What is the install location?” - здесь указываем откуда мы будем ставить ОС, я
заблаговременно примонтировал dvd-диск в /mnt, но устанавливать можно
откуда угодно.

60 Модуль 6. Виртуализация. Xen.


После того как мы зададим все эти опции начнется стандартный процесс
инсталляции. Чтобы выйти из интерфейса виртуальной машины нажмите
Ctrl+] (наберите “xm console linuxbox4” чтобы вернуться).

Работа с виртуальными машинами


Конфигурационный файл нашей виртуальной машины находится в /etc/xen/
linuxbox4
Другие конфигурационные файлы
# /etc/sysconfig/xend*
# /etc/xen*
Чтобы ВМ автоматически загружалась при перезагрузке сервера делаем так:
# ln -s /etc/xen/linuxbox4 /etc/xen/auto/
Для обслуживания виртуальных машин есть целый список подкоманд в
программе xm. В свою очередь команда работает с сервисом xend, который
все время должен быть запушен.
xm list – вывести список виртуальных машин
# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 493 1 r----- 254.2
linuxbox4 3 255 1 -b---- 95.0
Name – это административный домен, сама хост-система. Остальные
домены – это гостевые системы;
ID – ID домена в котором находится ВМ;
Mem(MiB) – объем памяти этой ВМ;
VCPUs – сколько процессоров используется;
State – статус ВМ, ниже перечислены возможные статусы;
r – running, ВМ запущена;
b – blocked, обычное состояние когда ВМ ожидает ввода/вывода, это
нормальное состояние ВМ;
p – paused, режим паузы, режим наступает при команде xm pause;
s – shutdown, в процессе выключения или перезагрузки;
c – crashed, произошла какая-то серьезная ошибка;
d – dying, в процессе завершения своей работы, но пока не достигший
состояния shutdown или crashed;
Time(s) – как долго запущена ВМ.

Модуль 6. Виртуализация. Xen. 61


#xm console linuxbox4 - подключиться к linuxbox4 (выйти можно с помощью Ctrl+])
#xm create linuxbox4 – включить linuxbox4
# xm shutdown <имя ВМ> - выключить виртуальную машину
#xm destroy <имя ВМ> - немедленно выключить ВМ, как будто отключили
питание
#xm uptime – выводит uptime
#xm help - подсказка

Производительность виртуальных машин


Посмотреть производительность можно командой ниже
# xentop

Резюме
Мы разобрали работу Xen и научились создавать и запускать виртуальные
машины.

Домашнее задание
Разверните несколько виртуальных машин и поработайте с ними,
воспользуйтесь средствами администрирования xen.

62 Модуль 6. Виртуализация. Xen.


Subversion

Subversion — это бесплатная система управления версиями с открытым


исходным кодом. Subversion позволяет управлять файлами и каталогами, а так
же сделанными в них изменениями во времени. Это позволяет восстановить
более ранние версии данных, даёт возможность изучить историю всех
изменений. Благодаря этому многие считают систему управления версиями
своего рода «машиной времени».
-Управление версиями в Subversion, Бен Коллинз-Сассман, Брайан У.
Фитцпатрик, К. Майкл Пилато, Copyright © 2002, 2003, 2004, 2005, 2006, 2007

Архитектура Subversion

Модуль 7. Subversion. 63
Протоколы работы с SVN
file:/// прямой доступ к хранилищу (на локальном диске);
http:// доступ через протокол WebDAV (если Subversion-сервер
работает через Apache);
https:// https://то же, что и http://, но с SSL-шифрованием;
svn:// доступ через собственный протокол к серверу svnserve;
svn+ssh:// то же, что и svn://, но через SSH-соединение.

Способы хранения данных


Berkley DB – старый способ хранения данных репозитория, сейчас уже не
используется
FSFS – хранение данных в специальных файлах, сейчас активно
используется

Компоненты Subversion
svn – Клиент с интерфейсом командной строки
svnversion – Программа, показывающая состояние (в пределах ревизий
существующих элементов) рабочей копии
svnlook – Инструмент прямого управления хранилищем Subversion.
svnadmin – Инструмент для создания, настройки или восстановления
хранилища Subversion.
svndumpfilter – Программа для фильтрации дамповых потоков хранилища
Subversion.
mod_dav_svn – Подключаемый модуль для HTTP-сервера Apache,
использующийся для предоставления сетевого доступа к вашему
хранилищу.
svnserve – Собственный отдельный сервер, запускаемый как процесс-
демон и доступный посредством SSH; еще один способ для предоставления
сетевого доступа к хранилищу
svnsync – Программа для последовательного зеркалирования одного
хранилища в другое через сеть
Все программы расположены в /usr/bin/ кроме mod_dav_svn который
поставляется с Apache.

Проблема одновременной работы с файлами


Всем системам контроля версий приходится ее решать. Как обеспечить

64 Модуль 7. Subversion.
одновременную работу с файлом нескольким пользователям, чтобы при
записи его в репозиторий изменения каждого из них были учтены ? Ведь
изменения сделанные каждым из пользователей могут перекрывать
изменения других людей.
Для решения этой проблемы есть две рабочих схемы.

Блокирование
р -> Изменение -> Разблокирование
р
Пользователь берет нужный файл из репозитория и ставит на него блокировку
пока с ним работает. Никто не сможет внести в него изменения пока тот, кто
его заблокировал не заблокирует. Пока файл заблокирован у остальных
будет только доступ только на чтение. Этот способ может применяться
при работе с графическим контентом или звуковыми файлами, ведь они
являются бинарными. А в свою очередь Subversion может анализировать
только текстовые файлы.
У этого способа есть свои минусы. Пользователь может просто забыть
разблокировать файл или может возникнуть неоправданная пошаговость,
ведь не всегда вносимые изменения могут пересекаться между собой.

Копирование
р -> Изменение -> Слияние
Пользователь извлекает нужные ему данные из репозитория, тем самым
создавая рабочую копию. Рабочая копия – это локальное отражение
данных из репозитория. Далее он вносит необходимые изменения в файлы
и закачивает их обратно в репозиторий (операция commit). В случае
если с момента создания его рабочей копий кто-то еще внес изменения
в репозиторий ему будет предложено обновить рабочую копию, внести в
нее поправки учтя работу других пользователей и только потом положить
в репозиторий. Ответственность за успешное разрешение конфликтов в
файлах лежит на пользователе.

Модуль 7. Subversion. 65
Рабочий цикл
Обновление рабочей копии
svn update
Внесение изменений
svn add
svn delete
svn copy
svn move
Анализ изменений
svn status
svn diff
svn revert
Слияние изменений, выполненных другими, с вашей рабочей копией
svn update
svn resolved
Фиксация изменений
svn commit

Установка
# yum -y install subversion
Все, мы получили инструмент для создания репозиториев и работы с ними.

Работаем с репозиторием
Для удобства работы я настроил работу по ключам у себя на машине, чтобы
не приходилось вводить пароль каждый раз когда его спросят.
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@localhost
Создаем каталог где будут хранится репозитории
# mkdir /svn
Создаем репозиторий
# svnadmin create /svn/myrepo
Информация по репозиторию
# svn info file:///svn/myrepo/

66 Модуль 7. Subversion.
Path: myrepo
URL: file:///svn/myrepo
Repository Root: file:///svn/myrepo
Repository UUID: 0328446d-48a7-4758-9808-7aeb55de1aea
Revision: 0
Node Kind: directory
Last Changed Rev: 0
Last Changed Date: 2009-03-07 22:52:55 +0300 (Sat, 07 Mar 2009)

Репозиторий пустой о чем говорит “Revision: 0”. С каждым новым измением в


репозитории номер ревизии будет увеличиваться на единицу.
В каталоге docs я подготовил несколько файлов которые положат начало
новому репозиторию
# svn import docs file:///svn/myrepo/ -m «start the dance»
Adding docs/file1
Adding docs/file2
Adding docs/file3

Committed revision 1.
Посмотрим изменилась ли ревизия.
# svn info file:///svn/myrepo
Path: myrepo
URL: file:///svn/myrepo
Repository Root: file:///svn/myrepo
Repository UUID: 0328446d-48a7-4758-9808-7aeb55de1aea
Revision: 1
Node Kind: directory
Last Changed Author: root
Last Changed Rev: 1
Last Changed Date: 2009-03-08 16:20:00 +0300 (Sun, 08 Mar 2009)
Посмотрим содержимое репозитория
# svn list file:///svn/myrepo/
file1
file2
file3

Модуль 7. Subversion. 67
У нас получился репозиторий с тремя файлами. Теперь мы создадим рабочую
копию этого репозитория и поработаем с ней.

# svn co file:///svn/myrepo/
A myrepo/file1
A myrepo/file2
A myrepo/file3
Checked out revision 1.

# cd myrepo
# echo «new line» >> file1
# svn commit -m «file1 has been modified»
Sending file1
Transmitting file data .
Committed revision 2.

Примерно так проходят будни SVN-пользователя.


Пока мы работали с репозиторием локально, нам было достаточно
использовать способ доступа как file:///
При удаленной работе рекомендуется использовать протоколы https если
доступ к репозиторию осуществляется через Apache, или через svn+ssh,
когда достаточно shell-пользователя в удаленной системе. Оба способа
осуществляют шифрование передаваемых данных. Доступ через Apache
применяется когда необходимо обеспечить доступ к репозиторию удаленных
разработчиков. Они не будут иметь доступ ко всей системе а только к SVN-
репозиторию. В этом варианте используется механизм аутентификации
пользователей Apache и файл паролей создаваемый с помощью htpasswd.
Использование системных пользователей оправданно когда на сервере
нужно получать доступ не только к SVN-репозиторию.

Получение копии репозитория с удаленного сервера где у вас есть аккаунт


Убедитесь, что пользователь включен в нужную группу для доступа к
репозиториям.
$ svn co svn+ssh://mybestuser@linuxbox/svn/myrepo
The authenticity of host 'linuxbox (192.168.146.132)' can't be established.
RSA key fingerprint is 18:db:9d:74:3e:f3:7a:f2:1f:e7:e5:36:33:c8:6d:2e.
Are you sure you want to continue connecting (yes/no)? yes

68 Модуль 7. Subversion.
Warning: Permanently added 'linuxbox,192.168.146.132' (RSA) to the list of
known hosts.
mybestuser@linuxbox's password:
mybestuser@linuxbox's password:
A myrepo/file1
A myrepo/file2
A myrepo/file3
Checked out revision 2.

Ограничение доступа
Subversion обладает возможностью регулировать доступ в репозиторий.
У нас уже есть репозиторий /svn/myrepo и сейчас мы разберемся с правами
доступа к нему.
Вся настройка производится в /svn/myrepo/conf/svnserve.conf, То есть <путь
к репозитарию>/conf/svnserve.conf

[general]
anon-access = none
#auth-access = write
#password-db = passwd
authz-db = authz
realm = Bunch_Of_My_Repos

anon-access = none – запрещаем анонимный доступ в репозиторий


auth-access = write – аутентифицированные пользователи могут читать и
редактировать данные в репозитории, я закомментировал это условие так
как планирую указать КАКИЕ аутентифицированные пользователи чего
получат.
#password-db = passwd – файл аккаунтов для репозитория. Файл содержащий
строки вида “пользователь = пароль” открытым текстом и используемый
в работе службы svnserve. Передаваемая информация не шифруется. Этот
способ устарел и я не рекомендую его использовать. Чтобы вы примерно
понимали что это за файл я вам приведу пример:
# cat /svn/myrepo/conf/passwd
[users]
harry = harryssecret
sally = sallyssecret

Модуль 7. Subversion. 69
В файле svnserve.conf раскоментируем строку password-db = passwd, в файл
authz добавим запись для пользователя harry если общая политика ему не
подходит.
Запустим службу svnserve
# svnserve -d
# svn list svn://harry@linuxbox/svn/myrepo
Authentication realm: <svn://linuxbox:3690> Bunch_Of_My_Repos
Password for 'root':
Authentication realm: <svn://linuxbox:3690> Bunch_Of_My_Repos
Username: harry
Password for 'harry':
file1
file2
file3
secret/

authz-db = authz – здесь указываем название файла в котором будут описаны


права доступа. В нашем случае файл называется authz
realm = MyRepo – реалм в котором находится репозиторий, это что-то типа
домена
В том же каталоге где и svnserve.conf (<путь к репозиторию>/conf/) создаем
файл authz и вносим в него конфигурацию
[groups]
agents = james, piter
[/]
*=r
[/secret]
@agents = rw
*=
[/secret/public]
* = rw
Файл описывающий права доступа умеет работать с группами. В группе
мы перечисляем пользователей а далее, в путях в которых нужно что-то
ограничить мы просто ссылаемся на группу через @ в результате не нужно
перечислять всех пользователей вручную.
r – это право на чтение
w- право на запись

70 Модуль 7. Subversion.
* = - означает что никому и нечего не разрешено
В начале перечисления путей репозитория нужно указать корень - [/]
и задать на него права, далее следуя структуре каталогов репозитория
указать нужные нам ограничения. Каталоги ниже уровнем наследуют права
от родительских. Но права на них можно переназначить, что я собственно
продемонстрировал. В каталог /secret смогут попасть только участники
группы agents, но в каталог public который находится ниже уровнем смогут
попасть все. Учитывайте эти особенности в вашей политике безопасности.
Пользователи используемые в это схеме аутентификации – это системные
пользователи. Сейчас я продемонстрирую права доступа в деле.

Системный пользователь который р не является членом группы


ру agents
g
$ svn list svn+ssh://mybestuser@linuxbox/svn/myrepo
mybestuser@linuxbox's password:
file1
file2
file3
secret/

$ svn list svn+ssh://mybestuser@linuxbox/svn/myrepo/secret


mybestuser@linuxbox's password:
svn: Authorization failed

$ svn list svn+ssh://mybestuser@linuxbox/svn/myrepo/secret/public


mybestuser@linuxbox’s password:
file3

Системный пользователь который р является членом группы


ру agents
g
$ svn list svn+ssh://james@linuxbox/svn/myrepo
james@linuxbox's password:
file1
file2
file3
secret/

$ svn list svn+ssh://james@linuxbox/svn/myrepo/secret

Модуль 7. Subversion. 71
james@linuxbox's password:
file1
file2
file3
public/

$ svn list svn+ssh://james@linuxbox/svn/myrepo/secret/public


james@linuxbox’s password:
file3

Я надеюсь все понятно. Кстати не забывайте указывать пользователя в строке


подключения перед @ иначе будет использоваться аккаунт root

Работа через Proxy


Доступ к репозиторию можно получать и через proxy-сервер. Для этого
нужно указать его в ~/.subversion/servers

Программы-клиенты
р р
Получить доступ к репозиторию можно не только через консоль. Существует
несколько известных и хороших программ. Например TortoiseSVN для ОС
Windows.

Резюме
Мы разобрали работу Subversion и освоили принцип базовой работы с этой
технологией. Subversion будет очень кстати в компаниях по разработке
программного обеспечения, для контроля исходных кодов программ. Также,
многие используют Subversion при коллективной работе с большим числом
текстовых документов.

Домашнее задание
Установить Subversion, создать репозиторий и поработать с ним с Linux-
клиента(командная строка) и Windows-клиента (программа TortoiseSVN).

72 Модуль 7. Subversion.
Apache

Apache – это самый популярный веб-сервер. Его задача как и любого другого
веб-сервера – отдавать контент на запросы клиентов. Apache обладает
большим функционалом за счет подключаемых модулей. На данный момент
есть три независимые рабочие ветки – 1.3.x, 2.0.x, 2.2.x. В репозитории CentOS
находится Apache ветки 2.2.x, его мы и будем использовать.

Установка
Установим классическую связку — Apache + PHP + MySQL. Пакет php-mysql
обеспечивает поддержку MySQL в PHP, он нужен если вы хотите работать с
СУБД через PHP.

# yum -y install httpd httpd-devel php php-mysql mysql


# chkconfig httpd on

Apache имеет большой функционал за счет подключаемых модулей. Но


чтобы была возможность их использовать в Apache core должен быть
вкомпилирован модуль mod_so, который позволяет использовать DSO-
модули (Dynamic Shared Object).

Проверить наличие mod_so можно командой httpd -l


# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

В листинге выше еще один интересный момент – это prefork.c, означающий


что наш Apache использует MPM prefork. MPM – это multi-processing module,
он описывает каким образом будут приниматься запросы и как они будут
отдаваться на обработку дочерним процессам или потокам Apache. Два
самых популярных:
worker – это поточный MPM, каждый запрос обслуживается в отдельном
потоке. Так как потоки более легкие для ОС объекты то они они используют
меньше памяти чем процессы. Однако есть и минус – поскольку каждый

Модуль 8. Apache. 73
поток имеют доступ ко всей памяти процесса то worker MPM подвержен
сбоям в большей степени, чем prefork, о котором ниже.
prefork
k – в этом случае используется несколько процессов, каждый процесс
обслуживает одно подключение. Этот MPM используетс немного больше
ресурсов но более стабилен.

Посмотреть сколько памяти в килобайтах потребляет каждый процесс


Apache можно такой командой:
# ps -ylC httpd | awk {'print $8,$13'};

Выбор MPM зависит от конкретных условий и задач, но думаю prefork по


умолчанию – это хороший выбор.
Подключение PHP к Apache осуществляться в файле /etc/httpd/conf.d/php.conf

Конфигурационный файл PHP - /etc/php.ini


LoadModule php5_module modules/libphp5.so

AddHandler php5-script .php


AddType text/html .php

Подключаем модуль и назначаем обработчик (про обработчики немного


позже).

Настройка

Файлы и каталоги Apache


/etc/httpd/conf/httpd.conf Главный конфигурационный файл;
/etc/httpd/conf.d/ Дополнительные подключаемые файлы
конфигурации;
/var/www/error/ Страницы ошибок;
/usr/lib/httpd/modules/ Каталог с модулями Apache;
/var/www/html/ DocumentRoot, каталог в котором будут
искаться файлы при попытке доступа к
веб-серверу;
/var/log/httpd Log-файлы веб-сервера;
/etc/sysconfig/httpd Здесь можно задать опции с которыми
будет стартовать Apache;
/usr/share/doc/httpd-<version>/ Документация.

74 Модуль 8. Apache.
Конфигурационный файл /etc/httpd/conf/httpd.conf

Структуру файла можно представить тремя секциями.

Главная секция Настройки этой секции влияют на работу Apache в


целом;
Секция настроек Настройки “главного” веб-сервера, или веб-сервера
“главного” веб- по умолчанию, именно к нему будут осуществляться
сервера запросы не обработанные виртуальными хостами.
Также настройки этой секции предоставляют
настройки по умолчанию для виртуальных хостов;
Секция виртуальных Секция виртуальных хостов, которая позволяет
хостов настроить поведение веб-сервера определенным
образом в зависимости от того какой hostname или
IP-адрес был запрошен;

Глобальная секция httpd.conf

ServerTokens Включать ли в поле заголовок ответа базовую


информацию об ОС сервера и версии Apache.
ServerTokens Prod — сервер отправит: Server: Apache;
ServerTokens Major — сервер отправит: Server: Apache/2;
ServerTokens Minor — сервер отправит: Server: Apache/2.0;
ServerTokens Min — сервер отправит: Server:
Apache/2.0.41;
ServerTokens OS — сервер отправит: Server: Apache/2.0.41
(Unix);
ServerTokens Full — сервер отправит: Server: Apache/2.0.41
(Unix) PHP/4.2.2 MyMod/1.2
ServerRoot Пусть к директории где располагаются log-файлы (в
CentOS это симлинки) и файлы конфигурации;
PidFile Файл в который Apache записывает свой PID (Process
ID);
Timeout Таймаут соединения;
KeepAlive Разрешать ли постоянные соединения (более одного
запроса при подключение);
MaxKeepAlive Requests Максимальное количество запросов в процессе
одного подключения (0 — неограниченные
запросы);

Модуль 8. Apache. 75
KeepAliveTimeout Период времени в течение которого ожидается
очередной запрос от клиента на том же соединение;
<IfModule> Модуль в этой секции загрузится только в случае
</IfModule> если результат выполнения теста будет истина, если
ложь то секция будет проигнорирована;
Listen Предписывает Apache принимать соединения на
выбранном IP-адресе и/или порту;
LoadModule Загрузка DSO (Dynamic Shared Object) модуля;
Include conf.d/*.conf Директива подключения дополнительных файлов
конфигурации;
ExtendedStatus Генерировать полную статистику или только
базовую, когда запрошен server-status;
User Пользователь/группа с полномочиями которых
Group работает Apache.

Секция настроек “главного” веб-сервера

ServerAdmin E-mail администратора веб-сервера, на этот адрес


будут приходить уведомления об ошибках и он
будет отображаться на некоторых страницах (error
documents);
ServerName Имя которое используется для самоидентификации
веб-сервером, обычно оно определяется
автоматически, но лучше прописать явно;
UseCanonicalName Когда директива отключена, используется hostname
и порт указанный клиентом если включена то
используется значение ServerName;
DocumentRoot Директория с файлами которую Apache будет
использовать для обслуживания запросов клиентов;
<Directory /> Данная секция позволяет описать настройки для
Options FollowSymLinks конкретногокаталога.Вданномпримеремыразрешаем
веб-серверу перемещаться по символическим ссылкам
AllowOverride None
из этого каталога и отключаем обработку файлов
</Directory> .htaccess в которых можно задать дополнительные
настройки для этого каталога;
DirectoryIndex Файл, который будет передан клиенту при запросе
каталога, файлов может быть перечислено несколько
но будет использован первый доступный;
AccessFileName Файл, в котором могут быть дополнительные
настройки для каждого каталога, по умолчанию он
называется .htaccess;

76 Модуль 8. Apache.
<Files ~ «^\.ht»> Секция <Files></Files> позволяет задать настройки
Order allow,deny для файлов по определенной маске, в данном
примере для всех файлов с расширением .ht мы
Deny from all
запрещаем доступ через веб-браузер;
</Files>
TypesConfig Директива задает расположение файла с Mime —
типами;
DefaultType Mime — тип по умолчанию text/plain, То есть
содержимое выводим на экран;
HostnameLookups В log-файлы записывать IP-адреса или имена
клиентов, если опция включена то каждый раз
производиться запрос к DNS-серверу с целью
выяснить имя клиента. Включать эту опцию не
рекомендуется так как это повлечет за собой
задержку с обработкой пользовательских запросов;
EnableMMAP Включать ли memory-mapping, включается когда
есть необходимость читать содержимое файла в
процессе его доставки. Не рекомендуется включать
при обслуживание NFS-директорий;
EnableSendfile Включать поддержку sendfile или нет. На некоторых
платформах и ОС лучше отключить;
ErrorLog Расположение log-файла для журналирования
ошибок;
LogLevel Директива задает уровень журналирования в log-
файлы. Возможны такие опции:
emerg — система полностью неработоспособна;
alert — что-то должно быть сделано немедленно;
crit — критическая ситуация;
error — журналирование ошибок;
warn — журналирование предупреждений;
notice — уровень мелких замечаний;
info — информационный уровень;
debug — максимальный уровень журналирования;
LogFormat Задает формат записи log-файла;
CustomLog Расположение основного log-файла, если для
виртуальных хостов не задан свой CustomLog то
вся информация будет записываться в CustomLog
“главного” веб-сервера;
ServerSignature Позволяет задать строку которая будет выводиться
на генерируемых страницах. Полезно при
использование цепочки прокси-серверов;

Модуль 8. Apache. 77
Alias Задание альяса в формате: Alias fakename realname.
Если в альясе есть слеш (/) то и при запросе его тоже
нужно указывать. Пример альяса (псевдонима):
Alias /icons/ “/var/www/icons/” - при запросе
http://<server_ip>/icons/ будут использоваться
картинки из каталога /var/www/icons/;
ScriptAlias Тоже самое что и Alias, только файлы расположенные
в realname каталоге будут выполняться как скрипты
а не пересылаться клиенту в виде обычных файлов
как это происходит при использование Alias;
Redirect Позволяет делать перенаправление на другой
ресурс. Например:
Redirect /service http://foo2.example.com/service
При запросе файла http://example.com/service/foo.
txt будет сделан запрос к http://foo2.example.com/
service/foo.txt
IndexOptions Позволяет задать ряд настроек для директорий,
такие как кодировка, MIME-тип, Description Width,
FancyIndexing, FoldersFirst и многие другие;
AddIconByEncoding Директивы AddIcon* указывают серверу, какие
AddIconByType иконки показывать для различных файлов, или
расширений имен файлов. Они показываются
AddIcon
только для директорий с FancyIndexing;
DefaultIcon Директива указывает какую иконку показывать для
файлов, не имеющих явно определенных иконок;
ReadmeName Задает название README файла, которое сервер
будет искать по умолчанию, затем он будет добавлен
в листинг директории;
HeaderName Задает файл который будет добавлен в начало
листинга директории;
IndexIgnore Директива задает список файлов которые должны
быть исключены из листинга;
DefaultLanguage Директивы позволяют указать язык для документов.
AddLanguage Выможете в последствиеиспользоватьдинамическое
определение содержимого (content negotiation)
для выдачи браузеру файла на языке понятном
пользователю. DefaultLanguage задает язык по
умолчанию для всех документов, AddLanguage
позволяет задать язык для конкретных;

78 Модуль 8. Apache.
LanguagePriority LanguagePriority позволяет задать порядок выбора
некоторых языков (в случае неоднозначности) при
динамическом определении содержания (content
negotiation);
ForceLanguagePriority Директива позволяет серверу выдать конкретную
страницу, вместо сообщения MULTIPLE CHOICES
(задается Prefer) или сообщения NOT ACCEPTABLE
(задается Fallback), в случае, если не один язык не
подошел;
AddDefaultCharset Директива задает кодировку по умолчанию;
AddType Позволяет задать новый MIME-тип или
переопределить старый;
AddEncoding Позволяет на ходу распаковывать данные. Не все
браузеры это поддерживают;
AddHandler Директива позволяет назначить обработчик
файлам с определенным расширением. В свою
очередь, обработчики могут уже быть встроены в
веб-серверы или определены директивой Action;
AddOutputFilter Директива позволяет назначить фильтр файлам
с определенным расширением. Фильтры
обрабатывают страницы до того как их отправить
клиенту;
ErrorDocument Позволяет задать отображаемые страницы для
различного рода ошибок;
BrowserMatch Позволяет задать поведение сервера для
конкретного веб-браузера, это полезно в случае
известных ошибок в реализации веб-браузера;
<Location /server-status> Секция описывает страницу статус веб-сервера,
SetHandler server-status на которой много интересной информации о
состояние веб-сервера. Доступ к ней можно
Order deny,allow
получить по адресу: http://<servername>/server-
Deny from all status/
Allow from 192.168.146.150
</Location>
<Location /server-info> Секция описывает страницу с конфигурацией веб-
SetHandler server-info сервера. Доступ к ней можно получить по адресу:
Order deny,allow http://<servername>/server-info/
Deny from all
Allow from 192.168.146.150
</Location>

Модуль 8. Apache. 79
<IfModule mod_proxy.c> Секция описывает прокси сервер, раскоментируйте
</IfModule> строки чтобы его включить;
<IfModule mod_disk_ Секция позволяет включить кэширование
cache.c> проксируемого контента и задать директорию где
CacheEnable disk / он будет храниться.
CacheRoot “/var/cache/mod_proxy”
</IfModule>

Секция виртуальных хостов


Виртуальные хосты позволяют обслуживать множество сайтов в рамках
одного сервера, ниже я приведу типовую конфигурацию виртуального хоста.
Наш веб-сервер помимо своего сайта (сайта “по умолчанию”), дополнительно
будет обслуживать запросы для сайта company.ru. Но вначале погорим про
виртуальные хосты. Есть несколько вариантов их использования.

Много именованных веб-сайтов на одном IP-адресе


Ситуация самая распространенная. Ее мы рассмотрим в конце, когда будем
конфигурировать виртуальный хост для company.ru

Много именованных веб-сайтов на множестве IP-адресов


В примере ниже у нас два IP-адреса. На IP-адресе 192.168.146.10 будет
обслуживаться “главный” веб-сервер, на IP 192.168.146.20 два виртуальных хоста.
Listen 80
# «Главный» сервер работает на 192.168.146.10
ServerName mainserver.com
DocumentRoot /www/mainserver
# Другой IP-адрес
NameVirtualHost 192.168.146.20
<VirtualHost 192.168.146.20>
DocumentRoot /www/example1
ServerName www.example.com
# Другие директивы
</VirtualHost>
<VirtualHost 192.168.146.20>
DocumentRoot /www/example2
ServerName www.example2.com
# Другие директивы
</VirtualHost>

80 Модуль 8. Apache.
Все запросы которые не направлены к 192.168.146.20 будут обработаны
“главным” сервером. Запросы к 192.168.146.20 с неизвестным hostname или
без заголовка Host: будут обслуживаться из /www/example1/

Обслуживание одного и того же контента на разных IP-адресах

NameVirtualHost 192.168.146.10
NameVirtualHost 217.10.20.30

<VirtualHost 192.168.146.10 217.10.20.30>


DocumentRoot /www/server1
ServerName server.example.com
ServerAlias server
</VirtualHost>

Работа на разных портах


Listen 80
Listen 8080

NameVirtualHost 192.168.146.150:80
NameVirtualHost 192.168.146.150:8080

<VirtualHost 192.168.146.150:80>
ServerName www.example.com
DocumentRoot /www/domain-80
</VirtualHost>

<VirtualHost 192.168.146.150:8080>
ServerName www.example.com
DocumentRoot /www/domain-8080
</VirtualHost>

<VirtualHost 192.168.146.150:80>
ServerName www.example.org
DocumentRoot /www/otherdomain-80
</VirtualHost>

<VirtualHost 192.168.146.150:8080>
ServerName www.example.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>

Модуль 8. Apache. 81
IP-based виртуальный хостинг
Указанные ниже IP-адреса в свою очередь резолвятся в example.com и
example2.com
Listen 80

<VirtualHost 192.168.146.10>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost 192.168.146.20>
DocumentRoot /www/example2
ServerName www.example2.com
</VirtualHost>
Также могут быть смешанные вариации, которые могут одновременно
использовать порты, IP-адреса

Добавляем виртуальный хост


Добавим виртуальный хост для домена company.ru. Сделаем альяс на
www, ведь обычно пользователи указывают www вначале каждого сайта,
так что это нужно учесть. Файлом который будет запрашиваться при
обращение к корневой директории хоста будет index2.php. Поскольку веб-
сервер установлен с поддержкой PHP то можно попробовать обработать
такую страницу. Страница будет состоять из хорошо известной функции
phpinfo(); которая генерирует информацию о настройках PHP и многое
другое. Страницу ошибки под номером 404 мы определим в файле .htaccess
предварительно включив возможность его использования с помощью
директивы AllowOverride. Log-файлы у нас будут свои. Включив Indexes для
наших каталогов – мы сможем просматривать log-файлы прямо из браузера
(http://www.company.ru/logs/). Но в целях безопасности не стоит это
использовать на рабочем сервере, или, если используете то ограничивать
доступ. Как это сделать я покажу ниже.
<Directory /var/sites/>
AllowOverride All
Options All
</Directory>

<VirtualHost *:80>
ServerAdmin support@company.ru
DocumentRoot /var/sites/company.ru/html
ServerName company.ru
ServerAlias www.company.ru

82 Модуль 8. Apache.
DirectoryIndex index2.php
ScriptAlias /cgi-bin/ /var/sites/company.ru/html/cgi-bin/
ErrorLog /var/sites/company.ru/html/logs/error_log
CustomLog /var/sites/company.ru/html/logs/access_log common
</VirtualHost>

Создаем структуру для домашнего каталога сайта


# mkdir -p /var/sites/company.ru/html/{pages,logs}
Создаем log-файлы
# touch /var/sites/company.ru/html/logs/{access_log,error_log}

Создаем файл .htaccess в каталоге /var/sites/company.ru/html/ с таким


содержанием:
ErrorDocument 404 /pages/404.html

Не забудьте создать страницу 404.html с любым сообщением. Эта страница


будет выводиться каждый раз, когда будет запрошена страница которой нет
на сервере.
А теперь создадим файл /var/sites/company.ru/html/index2.php с таким
содержанием:
<?php
phpinfo();
?>

Функция phpinfo(); позволяет сгенерировать страницу с настройками


PHP и установленными модулями. Это нам позволит убедиться, что PHP
функционирует правильно и узнаем какие модули PHP присутствуют в
системе.
В целях безопасности CGI-скрипты принято выполнять в определенной
директории. Директивой ScriptAlias мы определили каталог в котором можно
выполнять CGI-скрипты (не забудьте в файле httpd.conf раскомментировать
обработчик для CGI - “AddHandler cgi-script .cgi” ). На каталог должна быть
установлена опция Options +ExecCGI (или Options All).
Создадим тестовый файл /var/sites/company.ru/html/cgi-bin/test.cgi с таким
содержанием:

#!/usr/bin/perl
print «Content-type: text/html\n\n»;
print «Hello, World.»;

Модуль 8. Apache. 83
Устанавливаем право на исполнение для этого файла
# chmod +x test.cgi

Проверяем
http://www.company.ru/cgi-bin/test.cgi

Проверяем конфигурацию виртуальных хостов Apache на наличие ошибок.


Если Syntax OK то переходит к следующему шагу, если в конфигурации
окажется ошибка то будет показано где именно.
# httpd -S

Проверить весь конфигурационный файл можно так:


# apachectl configtest

Когда убедимся, что все ОК можно перезагрузить веб-сервер. Apachectl – это


утилита для управления веб-сервером. Можно перезагрузить веб-сервер
используя классический способ (service httpd restart) а можно этот. Опция
graceful – это аккуратная перезагрузка веб-сервера, она не завершает
принудительно текущие соединения а дожидается их завершения.
# apachectl graceful

Базовая настройка виртуального хоста закончена. Теперь можно обратиться


к веб-сайту по такому адресу. Если вы это делаете на виртуальной машине то
возможно придется в файл hosts добавить записи:
192.168.146.150 company.ru
192.168.146.150 www.company.ru

В Linux это /etc/hosts, в Windows C:\WINDOWS\system32\drivers\etc\hosts


Пишем в адресной строке веб-браузера:
http://www.company.ru/

Возможные опции в директиве Options


Options задают возможности которые будут доступны в конкретной
директории. По умолчанию значение Options установлено в All.
Синтаксис: Options [+|-]option [[+|-]option] ...
Доступны следующие опции:

84 Модуль 8. Apache.
All Доступны все опции кроме MultiViews, эту опцию
нужно указывать явно;
ExecCGI Выполнение CGI-скриптов с использованием mod_
cgi разрешено;
FollowSymLinks Разрешено переходить по символическим
ссылкам;
Includes Разрешены Server Side Includes (SSI);
IncludesNOEXEC SSI разрешены но команды #exec cmd и #exec cgi
отключены;
Indexes Если при запросе директории в ней не будет
найден файл из DirectoryIndex то mod_autoindex
вернет листинг этой директории с файлами и
каталогами;
MultiViews Разрешено Content-negotiation, когда есть
возможность отдавать контент в разных его
вариациях и клиент присылает свои пожелания;
SymLinksIfOwnerMatch Разрешен переход только по симлинкам владелец
конечного файла которых является владельцем
этого симлинка.

Определение возможных директив в .htaccess


Файл .htaccess позволяет задавать дополнительные опции поведения веб-
сервера. Директива AllowOverride может использоваться только в секции
<Directory>. Возможные значения приведены в таблице ниже.
All Разрешено использовать все;
AuthConfig Разрешено использовать директивы авторизации:
AuthDBMGroupFile, AuthDBMUserFile,
AuthGroupFile, AuthName, AuthType, AuthUserFile,
Require и т.д.
FileInfo Разрешено использовать директивы
контролирующие тип документов: DefaultType,
ErrorDocument, ForceType, LanguagePriority,
SetHandler, SetInputFilter, SetOutputFilter, и
mod_mime Add* и Remove* directives, Header,
RequestHeader, SetEnvIf, SetEnvIfNoCase,
BrowserMatch, CookieExpires, CookieDomain,
CookieStyle, CookieTracking, CookieName), mod_
rewrite directives RewriteEngine, RewriteOptions,
RewriteBase, RewriteCond, RewriteRule) и Action из
модуля mod_actions;

Модуль 8. Apache. 85
Indexes Позволяет использовать директивы отвечающие за
индексацию директории: AddDescription, AddIcon,
AddIconByEncoding, AddIconByType, DefaultIcon,
DirectoryIndex, FancyIndexing, HeaderName,
IndexIgnore, IndexOptions, ReadmeName и т.д.
Limit Директивы для управления доступа к хосту: Allow,
Deny and Order;
Options Позволяет использовать специфичные опции для
директорий;
None Запрещает использование .htaccess.

Аутентификация на сайте
Доступ в какой либо каталог можно ограничить списком учетных записей.
Для создания файла учетных записей используется программа htpasswd.
Когда мы создаем свой первый файл, который будет содержать список
учетных записей, программа htpasswd вызывается с ключем -c который
говорит о том, что нужно файл создать. При добавление учетных записей в
существующий файл, этот ключ использовать не нужно.

Создаем новый файл паролей и добавляем туда пользователя user1


# htpasswd -c /var/sites/company.ru/.htpasswd user1

Как видим все пароли внутри файла шифруются.


# cat /var/sites/company.ru/.htpasswd
user1:rZ.NmkqrKJLCc

Добавим еще пару пользователей


# htpasswd /var/sites/company.ru/.htpasswd user2
# htpasswd /var/sites/company.ru/.htpasswd user3

Теперь нужно сообщить веб-серверу, что при запросе каталога logs доступ
туда будет разрешен только определенному списку пользователей. Для
этого в файл /var/sites/company.ru/logs/.htaccess добавим такие директивы.
AuthType Basic
AuthName «Restricted Area»
AuthBasicProvider file
AuthUserFile /var/sites/company.ru/.htpasswd
Require valid-user

86 Модуль 8. Apache.
Проверяем
http://www.company.ru/logs/

В таблице перечислены использованные нами директивы.


AuthType Тип аутентификации. Basic – базовый, все передается
открытым текстом, Digest – все передается в
зашифрованном виде. Для создания digest-файлов
есть программа htdigest (AuthType Digest);
AuthName Реалм и текст, который будет выведен в диалоговом
окне ввода логина и пароля. Суть реалма - если клиент
уже проходил аутентификацию на сайте где реалм был
“Restricted Area”, то для еще одного каталога с таким же
реалмом будет отослан такой же пароль и диалоговое
окно ввода логина/пароля не будет выведено на
экран;
AuthBasicProvider Директива указывает каким способом будет проходить
аутентификация;
AuthUserFile Указывает расположение файла с паролями;
Require Условия прохождения аутентификации.
Require valid-user – доступ будет выдан любому
пользователю указанному в аккаунте, успешно
прошедшему аутентификацию;
Require user user3 – здесь доступ разрешается только
user3, соответственно доступ для user1 и user2 будет
запрещен.
Еще один способ ограничения доступа - это указать с каким IP-адресов
можно попадать в директорию, например вот так:
Order deny,allow
Deny from all
Allow from 192.168.146.1

Мы запрещаем доступ всем разрешив только с нашего IP-адреса (можно


перечислить IP-адреса через пробел, или указывать сети, например так
192.168.146.0/24). Директива Order задает порядок проверки, То есть сначала
блокируем всех а потом разрешаем избранным.

Включение SSL
SSL (Secure Sockets Layer) – криптографический протокол обеспечивающий
безопасную передачу данных. Для реализации SSL в Apache есть

Модуль 8. Apache. 87
специальный модуль – mod_ssl, который предоставляет интерфейс
к библиотеки OpenSSL, предоставляющею сильное шифрование с
использованием протоколов SSL и TLS (Transport Layer Security). Для работы
с SSL необходимо сгенерировать два файла – ключ, который хранится на
сервере и сертификат, этот сертификат будет предлагаться всем желающим
когда они запросят любую информацию по адресу https://ваш_сервер/ и
т.д.
Сертификаты могут быть выданы специальными службами, - CA –
Certificate Authority, это будет стоит определенных денег. А можно
сделать самоподписанный, тогда при запросе страниц по https клиенту
будет выдаваться предупреждение, что сертификат выдан неизвестным
источником. Но как показывает практика, большинство организаций именно
такими и пользуются.
Устанавливаем mod_ssl
# yum -y install mod_ssl
После установки mod_ssl он будет подключен к Apache с помощью файла /
etc/httpd/conf.d/ssl.conf
Все что нам нужно сделать – это добавить новую секцию VirtualHost для 443
порта, именно на этом порту обслуживаются https соединения и директиву
NameVirtualHost.
NameVirtualHost *:443

<VirtualHost *:443>
SSLEngine on
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

ServerAdmin support@company.ru
DocumentRoot /var/sites/company.ru/html
ServerName company.ru
ServerAlias www.company.ru
DirectoryIndex index2.php
ErrorLog /var/sites/company.ru/html/logs/error_log
CustomLog /var/sites/company.ru/html/logs/access_log common

RewriteLog /var/sites/company.ru/rewrite.log
RewriteLogLevel 1
</VirtualHost>
SSLEngine позволяет включить SSL для сайта а директивы SSLCertificateKeyFile
и SSLCertificateFile указывают на расположение ключа и файла сертификата.
По умолчанию сертификат выдан на localhost.localdomain, что не очень
красиво. Давайте создадим новый самоподписанный сертификат для

88 Модуль 8. Apache.
company.ru Для этого понадобится библиотека OpenSSL (если не установлена
то yum -y install openssl).
Еще одна особенность SSL - для каждого сертификата нужен отдельный IP-
адрес. Наш сервер работает с IP 192.168.146.150 и все размещенные сайты
делят его между собой. Самый главный сайт на сервере – это конечно
корпоративный сайт и именно для него мы сделаем сертификат а другие
сайты также будут его использовать.
Переходим в директорию httpd
# cd /etc/httpd/conf.d/
Генерируем сертификат и ключ
# openssl req -new -x509 -nodes -out server.crt -keyout server.key
Generating a 1024 bit RSA private key
.....................++++++
..................................++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:RU
State or Province Name (full name) [Berkshire]:Moscow
Locality Name (eg, city) [Newbury]:Moscow
Organization Name (eg, company) [My Company Ltd]:company.ru
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server’s hostname) []:company.ru
Email Address []:support@company.ru
После запуска команды openssl, будет задано несколько простых вопросов,
после чего сгенерируются server.crt и server.key файлы. Обращаю внимание
– Common Name должно полностью соответствовать вашему доменному
имени.
В файле /etc/httpd/conf.d/ssl.conf находим директивы SSLCertificateFile и
SSLCertificateKeyFile и приводим их к такому виду:
SSLCertificateFile /etc/httpd/conf.d/server.crt
SSLCertificateKeyFile /etc/httpd/conf.d/server.key
В секции виртуального хоста в httpd.conf исправляем пути к нашим новым
файлам:

Модуль 8. Apache. 89
<VirtualHost *:443>
SSLEngine on
SSLCertificateKeyFile /etc/httpd/conf.d/server.key
SSLCertificateFile /etc/httpd/conf.d/server.crt
ServerAdmin support@company.ru
DocumentRoot /var/sites/company.ru/html
ServerName company.ru
ServerAlias www.company.ru
DirectoryIndex index2.php
ErrorLog /var/sites/company.ru/html/logs/error_log
CustomLog /var/sites/company.ru/html/logs/access_log common

RewriteLog /var/sites/company.ru/rewrite.log
RewriteLogLevel 1
</VirtualHost>

# apachectl graceful
Теперь, если у вас сохранен старый сертификат для company.ru в браузере
то его нужно удалить, иначе вы будете продолжать его использовать. Для
браузера Firefox удалить сертификат можно вот так:
Инструменты -> Настройки -> Дополнительно -> Просмотр сертификатов ->
закладка Серверы, там мы находим сертификат для company.ru и удаляем его.
Пробуем зайти на наш сайт – https://www.company.ru/
При сохранение очередного сертификата убедитесь, что теперь он выдан на
company.ru а не localhost.localdomain

server-status и server-info
Можно получить много информации о состояние вашего веб-сервера, для
этого нужно в httpd.conf внести следующие записи:
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.146.1
</Location>
<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from 192.168.146.1
</Location>

90 Модуль 8. Apache.
Директивой Allow from задайте IP-адреса с которых можно попасть на эту
страницу.

SSI
SSI (Server Side Includes) – это директивы которые могут быть помещены в
html страницу. Они позволяют генерировать динамический контент html-
страниц без применения CGI, Perl или PHP.
Для включения SSI необходимо убедиться, что в файле httpd.conf есть такие
строки:
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Теперь нужно включить возможность выполнения SSI в выбранном


каталоге,
для этого на каталоге должна быть установлена директива Options
+Includes
В моем случае (/var/sites/) установлено Options All, То есть разрешено все,
так что остается просто протестировать работоспособность.
Создаем файл test.shtml в каталоге /var/sites/company.ru/html/ с таким
содержанием:
<!--#echo var=»DATE_LOCAL» -->

В браузере пишем – http://www.company.ru/test.shtml


На странице должно отобразиться текущее время на сервере.
Еще полезный пример – отображение даты последней модификации
документа
This file last modified <!--#echo var=»LAST_MODIFIED» -->

Использование mod_rewrite
Описание работы Apache не может быть полным без описания модуля mod_
rewrite. Он является одним из самых популярных среди веб-разработчиков,
позволяя на лету модифицировать запрошенный URL. Для простого
перенаправления достаточно директивы Redirect, но mod_rewrite позволяет
решать более сложные задачи.
Ниже я приведу ряд примеров, чтобы было понятно о чем идет речь. Все эти
команды нужно указывать в вашем .htaccess

Модуль 8. Apache. 91
RewriteEngine Включаем mod_rewrite;
RewriteBase Определяем корень, / соответствует корню сайта
http://www.company.ru/
RewriteRule Само правило, их может быть много.

Все запросы к странице oldpage.html будут перенаправляться к newpage.html.


RewriteEngine on
RewriteBase /
RewriteRule ^oldpage\.html$ newpage.html [R=permanent]

Замена всех .htm файлов .html файлами.


RewriteEngine on
RewriteBase /
RewriteRule ^(.*)\.htm$ $1.html [R=permanent]

Переписывание части URL. Например у нас есть интернет-магазин и адреса


товара выглядят примерно вот так:
http://www.company.ru/catalog/shop.php?product1
http://www.company.ru/catalog/shop.php?product2
http://www.company.ru/catalog/shop.php?product3

У такого подхода есть минусы. Например поисковые машины могут не


проиндексировать страницы использующие в адресе “?”. Также не просто
будет запомнить такой адрес, ведь я привел один из самых безобидных
примеров. Чтобы улучшить ситуацию, мы перепишем часть URL чтобы все
стало проще и нагляднее. Мы сделаем возможность обращаться к продуктам
вот по такому адресу:
http://www.company.ru/shop/product1
http://www.company.ru/shop/product2
http://www.company.ru/shop/product3
и т.д.

RewriteEngine on
RewriteBase /
RewriteRule ^(.*)shop/(.*)$ $1catalog/shop.php?$2

Для записи всех действий mod_rewrite, в секции виртуального хоста можно


указать такие директивы.

92 Модуль 8. Apache.
RewriteLog /var/sites/company.ru/html/logs/rewrite.log
RewriteLogLevel 1
Если нужно больше отладочной информации то можно установить
RewriteLogLevel в положение 2 или 3.

Регулярные выражения mod_rewrite и флаги

Регулярные выражения
^ Начало строки
$ Конец строки
. Любой символ
(a|b) a или b
(...) Выбор группы;
[abc] Любой из этих символов (диапазон);
[^abc] Ни один символ из этого диапазона;
a? Буква a один раз или 0;
a* Буква а ноль или более раз;
a+ Буква а один или более раз;
a{3} Буква а три раза;
a{3,} Буква а более трех раз;
a{3,6} Буква а от 3 до 6 раз;
!(pattern) Отрицание;
Флаги RewriteRule
R[=code] Redirect, перенаправление на новый URL по
заданному коду;
F Forbidden, недоступно;
P Proxy, прокси;
L Last, последнее правило;
G Gone, больше не существует;
N Next, следующая;
C Chain, цепочка;
T=mime-type Type, задание MIME-типа;
NS NoSubreq, пропустить директиву если текущий
подзапрос является внутренним подзапросом;
NC NoCase, не учитывать регистр;
QSA QSAppend, добавлять строку запроса;
NE NoEscape, не экранировать URI при выводе;
PT PassThrough, пропускать через следующий
обработчик;

Модуль 8. Apache. 93
S=количество Skip, пропустить следующее количество правил;
E=VAR:VAL ENV, установить переменную окружения;
CO=NAME:VAL:domai Cookie, записывает cookie клиенту.
n[:lifetime[:path]] NAME – название cookie;
VAL – значение cookie;
domain – домен;
lifetime – время жизни cookie;
path – путь куда записать cookie;

Коды веб-сервера
100-199 – информационные, запрос агента принят и обрабатывается;
200-299 – запрос успешно обработан и отправлен;
300-399 – запрос изменен и нужно предпринять действия для удовлетворения
измененного запроса;
400-499 – возникли серьезные проблемы при попытке выполнить запрос;
500-599 – ошибки на сервере;
100 Продолжить;
101 Переключение протоколов;
200 OK;
201 Создан;
202 Принято;
203 Не авторская информация;
204 Нет содержимого;
205 Сбросить содержимое;
206 Частичное содержимое;
300 Множественный выбор;
301 Перемещен навсегда;
302 Найден;
303 Смотреть другой;
304 Не модифицирован;
305 Использовать прокси-сервер;
307 Временно переадресован;
400 Неправильный запрос;
401 Несанкционированно;
402 Требуется оплата;
403 Запрещено;

94 Модуль 8. Apache.
404 Ресурс не найден;
405 Метод запрещен;
406 Не приемлем;
407 Требуется аутентификация через прокси-сервер;
408 Истекло время ожидания запроса;
409 Конфликт;
410 Недоступен;
411 Требуется длина запроса;
412 Предусловие неверно;
413 Объект запроса слишком большой;
414 URI запроса слишком длинный;
415 Неподдерживаемый тип медиа;
416 Диапазон запроса неудовлетворителен;
417 Ожидание неуспешно;
500 Внутренняя ошибка веб-сервера;
501 Не реализовано;
502 Плохой шлюз;
503 Сервис недоступен;
504 Таймаут;
505 Версия протокола HTTP не поддерживается;

Файл конфигурации httpd.conf может выглядеть примерно вот так:

# === Global Section ===

ServerTokens Full
ServerRoot «/etc/httpd»
PidFile run/httpd.pid
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

Модуль 8. Apache. 95
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

Listen 80

LoadModule auth_basic_module modules/mod_auth_basic.so


LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so

96 Модуль 8. Apache.
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so

Include conf.d/*.conf

ExtendedStatus On

User apache
Group apache

# === 'Main' server section ===

ServerAdmin root@localhost

UseCanonicalName Off

DocumentRoot «/var/www/html»

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

<Directory «/var/www/html»>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

<IfModule mod_userdir.c>
UserDir disable
</IfModule>

Модуль 8. Apache. 97
DirectoryIndex index.html index.htm index.php index.php5

AccessFileName .htaccess

<Files ~ «^\.ht»>
Order allow,deny
Deny from all
</Files>

TypesConfig /etc/mime.types

DefaultType text/plain

<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>

HostnameLookups Off

ErrorLog logs/error_log

LogLevel warn

LogFormat «%h %l %u %t \»%r\» %>s %b \»%{Referer}i\» \»%{User-Agent}i\»»


combined
LogFormat «%h %l %u %t \»%r\» %>s %b» common
LogFormat «%{Referer}i -> %U» referer
LogFormat «%{User-agent}i» agent

CustomLog logs/access_log combined

ServerSignature On

Alias /icons/ «/var/www/icons/»

<Directory «/var/www/icons»>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

<IfModule mod_dav_fs.c>
DAVLockDB /var/lib/dav/lockdb
</IfModule>

ScriptAlias /cgi-bin/ «/var/www/cgi-bin/»

98 Модуль 8. Apache.
<Directory «/var/www/cgi-bin»>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*


AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe


AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

AddLanguage ca .ca
AddLanguage cs .cz .cs

Модуль 8. Apache. 99
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv


zh-CN zh-TW

ForceLanguagePriority Prefer Fallback

AddDefaultCharset UTF-8

AddType application/x-compress .Z
AddType application /x-gzip .gz .tgz

AddHandler cgi-script .cgi

AddHandler type-map var

AddType text/html .shtml


AddOutputFilter INCLUDES .shtml

Alias /error/ «/var/www/error/»

<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<Directory «/var/www/error»>

100 Модуль 8. Apache.


AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>

</IfModule>
</IfModule>

BrowserMatch «Mozilla/2» nokeepalive


BrowserMatch «MSIE 4\.0b2;» nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch «RealPlayer 4\.0» force-response-1.0
BrowserMatch «Java/1\.0» force-response-1.0
BrowserMatch «JDK/1\.0» force-response-1.0

BrowserMatch «Microsoft Data Access Internet Publishing Provider» redirect-carefully


BrowserMatch «MS FrontPage» redirect-carefully
BrowserMatch «^WebDrive» redirect-carefully
BrowserMatch «^WebDAVFS/1.[0123]» redirect-carefully
BrowserMatch «^gnome-vfs/1.0» redirect-carefully
BrowserMatch «^XML Spy» redirect-carefully
BrowserMatch «^Dreamweaver-WebDAV-SCM1» redirect-carefully

<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.146.1
</Location>

<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from 192.168.146.1
</Location>

# === Virtual Hosts section ===

NameVirtualHost *:80
NameVirtualHost *:443

Модуль 8. Apache. 101


<Directory /var/sites/>
AllowOverride All
Options All
</Directory>

<VirtualHost *:80>
ServerAdmin support@company.ru
DocumentRoot /var/sites/company.ru/html
ServerName company.ru
ServerAlias www.company.ru
DirectoryIndex index2.php
ScriptAlias /cgi-bin/ /var/sites/company.ru/html/cgi-bin/
ErrorLog /var/sites/company.ru/html/logs/error_log
CustomLog /var/sites/company.ru/html/logs/access_log common

RewriteLog /var/sites/company.ru/rewrite.log
RewriteLogLevel 1
</VirtualHost>

<VirtualHost *:443>
SSLEngine on
SSLCertificateKeyFile /etc/httpd/conf.d/server.key
SSLCertificateFile /etc/httpd/conf.d/server.crt
ServerAdmin support@company.ru
DocumentRoot /var/sites/company.ru/html
ServerName company.ru
ServerAlias www.company.ru
DirectoryIndex index2.php
ScriptAlias /cgi-bin/ /var/sites/company.ru/html/cgi-bin/
ErrorLog /var/sites/company.ru/html/logs/error_log
CustomLog /var/sites/company.ru/html/logs/access_log common

RewriteLog /var/sites/company.ru/rewrite.log
RewriteLogLevel 1
</VirtualHost>

Резюме
Мы установили и настроили наш веб-сервер. Разобрались с ключевым
моментами:
Установка Apache;
Настройка Apache;
Полностью разобрали конфигурационный файл httpd.conf;

102 Модуль 8. Apache.


Разобрались с опциями в директивах AllowOverride и Options;
Виртуальные хосты;
Аутентификация;
.htaccess
.htpasswd
SSL;
server-status и server-info;
SSI;
CGI;
mod_rewrite;
также, получили много другой полезной информации.

Домашнее задание
Домашним заданием будет установить Apache и пройтись по всему
функционалу описанному в этом модуле.

Модуль 8. Apache. 103


SAMBA

Что такое SAMBA и зачем она нужна ?


Samba – это программа позволяющая обращаться к сетевым дискам по
протоколу SMB/CIFS из разных операционных систем.

Возможности SAMBA
• обеспечение доступа к Linux-разделам Windows-клиентам;
• обеспечение доступа к Windows-разделам Linux-клиентам;
• совместное использование принтеров подключенных к Linux-системе
Windows-клиентами;
• совместное использование принтеров подключенных к Windows-системе
Linux-клиентами;
• Средства авторизации и аутентификации.
Одним словом система, которая позволит сделать файл-сервер и принт-
сервер.

Установка
Устанавливаем SAMBA
# yum -y install samba

Добавляем в автозагрузку
# chkconfig smb on

Типы аутентификации
Прежде чем мы приступим к настройке, важно будет узнать какие способы
аутентификации есть в SAMBA. Это наверно самый главный параметр в ней,
который описывает способ получения доступа к ресурсам сервера.
ADS – samba является членом домена Active Directory. Необходимо поставить
Kerberos чтобы использовать этот режим.
Domain – samba полагается на информацию от Primary или Backup Domain
Controller. Поступающие к ней пароли и логины она направляет к контроллеру
и ждет пока тот проверит, есть ли такой пользователь в домене или нет.

104 Модуль 9. SAMBA.


Server – samba пытается проверить валидность пользователя направляя его
учетные данные на проверку другому Samba-серверу. Если это невозможно
то пытается использовать режим доступа User.
Share – свободный доступ на Samba-сервер. Пароль не запрашивается пока
пользователь не попытается попасть в какую либо специфичную область
файловой системы на которую стоит ограниченный режим доступа.
User – используется по умолчанию. Аутентификация происходит на уровне
SAMBA-сервера. Нужно создать системную учетную запись а потом связать
ее с учетной записью SAMBA.

Ключевые файлы
/etc/samba/smb.conf Главный конфигурационный файл и все настройки
задаются здесь;
/etc/samba/smbusers Файл в котором можно залинковать Windows-
пользователя на UNIX-пользователя, например
чтобы понять при подключение Windows-
пользователя кто он будет на SAMBA-сервере. Еще
одно назначение – это линковка многих windows-
пользователей на одного UNIX-пользователя, в этом
случае все действия в системе будут производится
от его лица и с его правами доступа;
/etc/samba/lmhosts Похож на /etc/hosts только занимается резолвингом
NetBIOS имен;
/usr/bin/smbpasswd Программа создания учетных записей SAMBA.
Популярный ключи:
-a добавляем пользователя (он уже должен быть в
системе);
-e включаем его учетную запись (по умолчанию
отключена);
-x удаляем пользователя из базы данных SAMBA
(системный пользователь остается на месте);
/usr/bin/smbclient SAMBA-клиент, позволяет подключаться к SAMBA-
ресурсам из командной строки (после того как
подключитесь наберите help для вывода возможных
действие, help <command> - более подробное
описание команды);
/usr/bin/smbcontrol Позволяет отсылать команды smbd и nmbd;
/ u s r / s h a r e / d o c / Документация.
samba-3.0.33

Модуль 9. SAMBA. 105


Структура конфигурационного файла
Файл smb.conf состоит из нескольких секций. Первая секция – [global] в
ней описываются глобальный параметры, они указывают SAMBA-серверу
как нужно функционировать. Далее идут секции описывающие доступные
ресурсы. Графически структуру файла можно изобразить так:
[global]
...
[share1]
...
[share2]
...
[shareN]
...

Пример конфигурационного файла


В этой примере я покажу как создать типовую конфигурацию без
использования Active Directory. SAMBA-сервер будет служить файл-серверов
для Windows-клиентов. Описанные нами ресурсы будут иметь различные
способы доступа к себе, вы сможете выбрать удобные для себя. Доступ будет
ограничен определенной сетью.
[global]
workgroup = OFFICE
server string = Samba Mega Server %v
bind interfaces only = yes
interfaces = eth0 192.168.146.0/24
hosts deny = ALL
hosts allow = 192.168.146. 127.0.0.1

# --------------------------- Logging Options -----------------------------


log file = /var/log/samba/%m.log
# max 50KB per log file, then rotate
max log size = 1024

# ----------------------- Standalone Server Options ---------------------


security = user
encrypt passwords = yes
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
IPTOS_LOWDELAY

# ----------------------- Browser Control Options ------------------------


local master = yes
os level = 255
preferred master = yes

106 Модуль 9. SAMBA.


# ----------------------------- Name Resolution -----------------------------
dns proxy = yes

# ------------------------------Charsets----------------------------------------
unix charset = utf8
dos charset = cp1251
display charset = cp1251

# --------------------------- Printing Options --------------------------------


load printers = yes
cups options = raw
printcap name = /etc/printcap
printing = cups

# ----------------------------Share Definitions ------------------------------


[home]
comment = Home Directories
path = /home/%u
browseable = yes
writable = yes
[private]
comment = Private Directory
path = /home/private
browseable = yes
writable = yes
valid users = bestuser
[public]
comment = Public Stuff
path = /home/public
browseable = yes
writable = yes
guest ok = yes
[printers]
comment = All Printers
path = /var/spool/samba
browseable = yes
guest ok = yes
writable = no
printable = yes

Описание конфигурационного файла

workgroup Название рабочей группы;


server string Определяет название сервера, переменная %v
содержит версию SAMBA-сервера;
bind interfaces only В целях безопасности мы включаем режим
ограничения обработки запросов SAMBA только
определенными сетевыми интерфейсами;

Модуль 9. SAMBA. 107


interfaces Здесь мы указываем разрешенные интерфейсы и
сети;
hosts deny Запрещаем доступ всем хостам;
hosts allow Разрешаем доступ только из доверенных сетей.
Такая политика доступа используется во многих
технологиях, мы сначала запрещаем доступ всем
а потом разрешаем нужным нам сетям или IP-
адресам. Это куда проще, чем запретить доступ
всем кому мы не хотим давать доступ (по сути весь
Интернет);
log file Задает расположение log-файла;
max log size Размер log-файла в килобайтах, после достижения
максимального размера произойдет ротация;
security Способ аутентификации на SAMBA-сервере;
encrypt passwords Все пароли шифруются;
socket options Некоторые опции для тюнинга соединений;
local master Если установлено в “yes” то разрешает SAMBA-
серверу попытаться стать мастер браузером в
своей сети. Мастер браузер получает анонсы от
компьютеров и доменов, высылает browse list на
запросы клиентов;
os level Целое число до 255, чем оно больше тем больше
шансов что SAMBA-сервер станет мастер
браузером. По умолчанию SAMBA выигрывает
“выборы” мастер браузера у всех ОС Windows
кроме Windows NT 4.0/2000 контроллера домена;
preferred master Значение “yes” дает небольшое преимущество в
“выборах” мастер браузера;
dns proxy Пытаться резолвить NetBIOS имена через DNS
или нет? Обратите внимание, что NetBIOS имя
ограничено 15 символами, так что DNS имя не
может быть более 15 символов;
unix charset Опции отвечают за нормальное перекодирование
dos charset имен файлов;
display charset
load printers Загружать ли принтеры указанные в /etc/printcap
для отображения в списке ресурсов;
cups options Здесь можно перечислить специфичные опции
CUPS, посмотреть список доступных можно с
помощью команды lpoptions -d <printername> -l

108 Модуль 9. SAMBA.


printcap name Расположение printcap-файла;
printing Используемая система печати;
[home] comment – это комментарий к ресурсу, path – это
comment = ... путь к ресурсу в файловой системе, в данном
случае мы хотим давать доступ к домашнему
path = /home/%u
каталогу пользователя, при аутентификации
browseable = yes он попадет именно в свой каталог, вместо
writable = yes переменной %u будет подставлен его логин,
browseable – отображать ли ресурс в списке
доступных ресурсов, writeable – можно ли
записывать и удалять файлы на ресурсе;
[private] Личный каталог пользователя bestuser, только он
comment = ... сюда сможет попасть;
path = /home/private
browseable = yes
writable = yes
valid users = bestuser
[public] Это общая share, сюда может попасть любой
comment = ... анонимный пользователь (guest ok = yes) из
разрешенной сети (192.168.146.0/24) Не забудьте
path = /home/public
сделать chmod 777 на публичный каталог, чтобы
browseable = yes все могли записывать в него;
writable = yes
guest ok = yes
[printers] Секция описывающая доступные принтеры,
comment = ... browseable- принтер можно увидеть в списке
доступных ресурсов, guest ok - его может
path = /var/spool/samba
использовать анонимный пользователь, writeable
browseable = yes - право на запись не нужно так как это принтер,
guest ok = yes printable - можно ли печатать на принтере;
writable = no
printable = yes
После того как файл конфигурации подготовлен его желательно проверить
на корректность командой testparm

# testparm
Load smb config files from /etc/samba/smb.conf
Processing section «[home]»
Processing section «[private]»

Модуль 9. SAMBA. 109


Processing section «[public]»
Processing section «[printers]»
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
...
Теперь нужно создать SAMBA-пользователей. Дело в том, что SAMBA
использует свою базу аккаунтов пользователей но в ее работе нужно чтобы
существовали и системные пользователи тоже. То есть чтобы завести SAMBA-
аккаунт сперва нужно создать системного пользователя командой useradd
а потом “связать” его с SAMBA. Все это сделано с целью масштабировать
SAMBA, ведь в этом случае возможно создавать достаточно сложные
конфигурации с использование стандартных механизмов UNIX, такие как
права пользователей и группы. Ладно приступим.

Создаем системного пользователя


# useradd bestuser

Задаем пароль пользователю. Внимание! Если вы создаете аккаунт только для


того чтобы он пользовался SAMBA то имеет смысл закрыть ему прямой доступ
в систему задав в качестве shell /sbin/nologin в /etc/passwd Тогда пользователь
будет ограничен только возможностью использования SAMBA
# passwd bestuser

Теперь самый животрепещущий момент! “Связываем” системный аккаунт с


аккаунтом SAMBA, который создается после выполнения этой команды
# smbpasswd -a bestuser
Включаем учетную запись SAMBA (по умолчанию отключена)
# smbpasswd -e bestuser

Теперь можно проверить работоспособность прямо из командной строки


# smbclient //192.168.146.132/home -U bestuser
Password:
Domain=[LOCALHOST] OS=[Unix] Server=[Samba 3.0.33-3.7.el5]
smb: \>
Все работает!
Теперь можно подключиться из Windows, Пуск - > Выполнить -> \\192.168.146.132

110 Модуль 9. SAMBA.


Проверим состояние с помощью smbstatus
# smbstatus -p
Samba version 3.0.33-3.7.el5
PID Username Group Machine
-------------------------------------------------------------------
11241 bestuser bestuser main (192.168.146.1)
Похоже на правду!

В public мы зайдем без паролей, так как это публичная файлопомойка, чтобы
зайти в home вводим свои учетные данные и попадаем в свой личный домашний
каталог а вот каталог private будет доступен только пользователю bestuser.
Аккаунты SAMBA-пользователей находятся в /etc/samba/smbpasswd

SWAT – веб-интерфейс к SAMBA


# yum -y install samba-swat
Редактируем /etc/xinet.d/swat
• Меняем “disable = yes” на “disable = no” тем самым включаем службу
• В строке ”only_from = 127.0.0.1.” вместо 127.0.0.1 нужно указать IP-адрес с
которого будете подключаться
Перезагружаем xinetd
# service xinetd restart
Получаем доступ к нашему веб-интерфейсу
http://192.168.146.132:901
Для входа используем учетную запись root, на закладке PASSWORD можно
добавить еще пользователей.
Через веб-интерфейс можно полностью управлять SAMBA-сервером.

Резюме
Мы выяснили что такое SAMBA и как ее использовать. Есть множество
способов аутентификации, но мы использовали классические – на базе
системных аккаунтов.

Домашнее задание
Установить и настроить SAMBA и проверить работоспособность с Windows-
клиента.

Модуль 9. SAMBA. 111


DHCPD

Dynamic Host Configuration Protocol – протокол динамической конфигурации


хоста. Протокол позволяет получать сетевые реквизиты по сети хостам из
сетей которые DHCP-сервер обслуживает. Но это не единственное на что он
способен, благодаря DHCP-серверу (в связке с дополнительным ПО) можно
осуществлять установку ОС по сети и загрузку бездисковых станций (тонких
клиентов).

Принцип работы
Принцип получения IP-адреса с помощью DHCP-сервера можно разделить
на 4 этапа:

1. Клиент выполняет широковещательный запрос в своей сети на адрес


255.255.255.255 с целью обнаружения DHCP-сервера. Запрос представляет
из себя UDP-пакет с сообщением типа DHCPDISCOVER. Адрес источника
содержит 0.0.0.0 так как клиент еще не получил IP-адрес;
2. Получив сообщение от клиента, DHCP-сервер просматривает свою
конфигурацию чтобы определить настройки для клиента. После этого
DHCP-сервер отправляет клиенту сообщение DHCPOFFER, в котором
предлагает конфигурацию. Предлагаемый клиенту IP-адрес находится
в поле yiaddr, другие опции в разделе options пакета. Сообщение
отсылается широковещательно и если в сети несколько DHCP-серверов
то клиент может выбрать наилучший ответ для себя из предложенных
вариантов;

112 Модуль 10. DHCPD.


3. Выбрав для себя конфигурацию, клиент широковещательно отправляет
сообщение DHCPREQUEST содержащим идентификатор DHCP-сервера;
4. DHCP-сервер подтверждает запрос, отправляя клиенту сообщение
DHCPACK. После этого клиент должен применить полученные настройки
к своему сетевому интерфейсу.

Установка DHCPD
# yum -y install dhcp
# chkconfig dhcpd on

Настройка DHCPD

Файлы конфигурации
/etc/dhcpd.conf Файл конфигурации DHCPD;
/usr/share/doc/dhcp-3.0.5/ Документация;
/usr/sbin/dhcpd DHCP daemon, бинарный файл;
/usr/sbin/dhcrelay DHCP Relay, предназначен для
перенаправления запросов DHCP или BOOTP
из сети где нет DHCP-сервера в сеть где он
есть;
/etc/rc.d/init.d/dhcpd Скрипты автоматизации запуска (с помощью
/etc/rc.d/init.d/dhcrelay chkconfig инсталлируются в /etc/init.d/);
/var/lib/dhcpd/dhcpd.leases Файл в котором сохраняется информация о
выданных IP-адресах;
/etc/sysconfig/dhcpd Файл аргументов.

DHCPD настраивается в файле /etc/dhcpd.conf который сразу после


установки скорее всего будет пустым. Нужно скопировать файл-шаблон на
его место и отредактировать под свои задачи.
# cp /usr/sha re/doc/dhcp-3.0.5/dhcpd.conf.sample /etc/dhcpd.conf

Конфигурационный
ф ур ц файл /etc/dhcpd.conf
ф p
ddns-update-style interim;
ignore client-updates;
authoritative;

subnet 192.168.146.0 netmask 255.255.255.0 {

range 192.168.146.140 192.168.146.160;

Модуль 10. DHCPD. 113


option routers 192.168.146.2;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.146.255;
option ntp-servers 192.168.146.2;
option domain-name «fasttech.ru»;
option domain-name-servers 192.168.146.2;

option ip-forwarding off;

default-lease-time 86400;
max-lease-time 86400;

Allow bootp;
Allow booting;

host linuxbox {
hardware ethernet 00:0C:29:77:9C:9C;
fixed-address 192.168.146.150;
# filename «pxelinux.0»;
option subnet-mask 255.255.255.0;
option routers 192.168.146.2;
option domain-name «fasttech.ru»;
option host-name «dhcphost»;
# next-server 192.168.146.130;
}
}

# service dhcpd start

Описание опций из dhcpd.conf


ddns-update-style interim; Рекомендуемая схема обновления DNS;
ignore client-updates; Игнорировать все клиентские запросы DDNS
обновлений (Dynamic DNS). DDNS позволяет
в реальном времени изменять доменную
запись для хоста IP-адрес которого постоянно
изменяется;
authoritative; Обычно DHCP сервер предполагает что
конфигурационная информация описывающая
сегмент сети правильна и “авторитетна”. Так
что если клиент запрашивает IP адрес и сервер
знает что этот адрес не правилен, то сервер
ответит клиенту сообщением DHCPNAK, что
является предложением клиенту отказаться от
этого адреса и запросить новый;

114 Модуль 10. DHCPD.


subnet 192.168.146.0 Начало секции настроек для определенной
netmask 255.255.255.0 {...}подсети;
range 192.168.146.140 IP-адреса будут динамически выделяться из
192.168.146.160; этого диапазона;
option routers Шлюз по умолчанию который будет назначаться
клиентским компьютерам;
option subnet-mask Маска назначаемая клиентам;
option broadcast-address Broadcast-адрес который будет назначаться
клиентским компьютерам;
option ntp-servers NTP-сервер (Network Time Protocol) для
клиента;
option domain-name Домен в котором будут расположены
клиентские компьютеры (если домен - fasttech.
ru а hostname - dhcphost то полное имя (FQDN)
будет dhcphost.fasttech.ru);
option domain-name- DNS-сервера которые будут предоставлены
servers клиентам для резолвинга;
option ip-forwarding off ; Не перенаправлять DHCP запросы с одного
сетевого интерфейса на другой;
default-lease-time 86400; Время на которое выдается IP-адрес если
клиент не указал другое. Время указывается в
секундах;
max-lease-time 86400; Максимальное время на которое может
выдаваться IP-адрес;
Allow bootp; Разрешать обрабатывать запросы BOOTP
(протокол который позволяет получить IP-
адрес клиенту, сегодня на его смену пришел
DHCP предоставляющий больше возможностей
и более сложный сам по себе). По умолчанию
разрешено;
Allow booting; Разрешать обрабатывать запросы конкретного
клиента. По умолчанию разрешено;
Host linuxbox {...} Секция описывающая настройки конкретного
хоста;
hardware ethernet MAC-адрес сетевой карты клиента;
fixed-address Какой IP-адрес назначить сетевой карте с
указанным выше MAC-адресом, IP-адрес будет
постоянно закреплен за этим MAC`ом;
filename «pxelinux.0»; Файл начальной загрузки, используется для
сетевой загрузки и установки по сети, приведен
для примера. Подробнее в модуле “Install-server”;

Модуль 10. DHCPD. 115


option host-name Указание имени клиента, его hostname;
next-server Указание TFTP-сервера, что нужно при загрузке
по сети (тонкие клиенты, установка по сети).

В файле конфигурации есть два типа операторов – параметры и объявления.


Как понятно из названия, параметры – это параметры задаваемые для
клиентов. Некоторые параметры начинаются с option, что означает что они
не обязательные. Про объявления давайте поговорим подробнее.

Секции-объявления
Структуру конфигурационного файла dhcpd.conf можно представить как
набор секций. Каждая секция несет в себе определенную роль. Секции
могут быть вложенными. Задаваемые параметры могут быть глобальными
или приватными, для одного хоста или группы хостов.

shared-network
Секция shared-network сообщает серверу DHCP, что несколько IP-подсетей
используют один физический сегмент. Каждая подсеть в такой сети
объявляется внутри секции shared-network.

shared-network имя {
[ параметры ]
[ объявления ]
}

Пример:
shared-network MyBigNetwork {
shared-network-specific parameters...
subnet 192.168.146.0 netmask 255.255.255.224 {
subnet-specific parameters...
range 192.168.146.10 192.168.146.20;
}
subnet 192.168.146.32 netmask 255.255.255.224 {
subnet-specific parameters...
range 192.168.146.35 192.168.146.60;
}
}

116 Модуль 10. DHCPD.


subnet
Секция используется для предоставления информации DHCP-серверу о
том, принадлежит ли данный IP-адрес указанной подсети или нет. Также она
позволяет задать специфичные параметры для подсети.

subnet subnet-number netmask netmask {


[ параметры ]
[ объявления ]
}

Пример:
subnet 192.168.146.0 netmask 255.255.255.0 {

range 192.168.146.140 192.168.146.160;

option routers 192.168.146.2;


option subnet-mask 255.255.255.0;
option broadcast-address 192.168.146.255;
option domain-name «fasttech.ru»;
}

range
g
Для любой подсети адреса которой присваиваются динамически, должен
быть указан хотя бы один диапазон с помощью секции range. В параметрах
указывается начальный и конечный адреса диапазона. Все IP адреса
в диапазоне должны принадлежать той подсети к описанию которой
относится секция range. Параметр dynamic-bootp указывается в случае,
если предполагается назначать адреса из диапазона клиентам по протоколу
BOOTP. Если указан только один адрес, то параметр конец диапазона может
быть опущен.

range [ dynamic-bootp ] начало_диапазона [ конец_диапазона];

Пример:

range 192.168.146.35 192.168.146.60;

Модуль 10. DHCPD. 117


host
Секция host позволяет назначить индивидуальные параметры хосту. Если
необходимо за каждым хостов закрепить определенный IP-адрес то секция
host как раз для этого.

host имя_хоста {
[ параметры ]
[ объявления ]
}

Пример:
host linuxbox {
hardware ethernet 00:0C:29:77:9C:9C;
fixed-address 192.168.146.150;
}

g p
group
Секция group используется для присвоения одного или нескольких
параметров группе объявлений. Параметры могут быть одновременно
присвоены группе секций hosts, shared networks, subnets, или даже group.

group {
[ параметры ]
[ объявления ]
}

Пример:
group {
filename «pxelinux.0»;
next-server 192.168.146.132;

host thinclient1 { hardware ethernet 0:f0:a3:49:2b:27; }


host thinclient2 { hardware ethernet 0:f0:a3:30:fc:22; }
host thinclient3 { hardware ethernet 0:f0:a3:12:46:61; }
}

118 Модуль 10. DHCPD.


Типы пакетов протокола DHCP

DHCPDISCOVER Широковещательный запрос клиента при первоначальном


поиске сервера, может содержать желаемый для
получения IP адрес и время аренды;

DHCPREQUEST Широковещательный ответ на DHCPOFFER (должен


содержать идентификатор сервера), либо запрос на
возобновление аренды адреса после перезагрузки
клиента или истечения предыдущего интервала аренды;
DHCPDECLINE Ответ на DHCPOFFER с отказом принять адрес (например,
клиент выяснил с помощью ARP или ICMP, что адрес занят),
клиент начинает всё с начала;
DHCPRELEASE Освобождение адреса;
DHCPINFORM Клиент получил адрес с помощью другого механизма и
нуждается только в параметрах;
DHCPOFFER Ответ на DHCPDISCOVER, поле yiaddr содержит
предлагаемый адрес (он пока не зарезервирован!);
DHCPACK Согласие на выделение адреса по DHCPREQUEST или
DHCPINFORM (в этом случае сервер не проверяет
допустимость адреса), клиент может пользоваться им
оговоренное время;
DHCPNAK Отказ на выделение адреса по DHCPREQUEST (например,
в промежутке между DHCPOFFER и DHCPREQUEST адрес
был выделен другому), клиент начинает всё с начала.

Используемые порты
DHCP server ожидает запросы на порту 67 UDP
DHCP client ожидает ответы на порту 68 UDP

DHCP-клиент
Для того чтобы получать сетевые настройки с помощью DHCP-сервера
необходимо убедиться, что в настройках сетевого интерфейса есть
следующее:
# cat /etc/sysconfig/network-scripts/ifcfg-eth0

Модуль 10. DHCPD. 119


DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

Резюме
Мы разобрали работу DHCP. Как видно настройка является простой и нечто
большее требуется очень редко. DHCP-сервер также будет использоваться в
модуле посвященном Install-серверу.

Домашнее задание
Настроить свой DHCP-сервер и попробовать динамически получить сетевые
реквизиты для какого-нибудь клиента в той же сети.

120 Модуль 10. DHCPD.


MySQL

MySQL – самая известная и популярная СУБД (Система управления базами


данных). Высокая популярность тесно взаимосвязана с бесплатностью
продукта. Но по возможностям она не уступает платным аналогам, таким
как Oracle или IBM DB2. Я даже знаю многие компании где помимо Oracle для
менее официальных задач используют MySQL и она отлично справляется!
На позиции системного администратора/инженера знать MySQL никто
не заставляет. Для этого есть целых две должности — разработчик БД и
администратор БД. Чем занимается и первый, и второй я думаю понятно из
названия. Но если все же освоить эту тему то это будет только ощутимым
плюсом в вашем резюме. Меня очень часто спрашивали на собеседованиях,
знаю ли я MySQL. Причем обычно требовалось знание только основ и опыт
написания простых запросов. В большинстве случаев этого достаточно.
Помните закон Парето ? Вот-вот, 20% знаний о MySQL покроют 80% ваших
потребностей в этой технологии. Так давайте получим их.

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

MySQL — это клиент-серверное приложение. То есть где-то запущена


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

Данные в базе хранятся в двухмерном массиве, примерно вот так, как в


примере ниже.
Имя Фамилия Телефон
Александр Иванов 111-22-33
Федор Емельянин 222-33-11
Сергей Петров 333-22-11
И подобных данных может быть очень много. Запросы к базе осуществляются
с помощью SQL-запросов.

Модуль 11. MySQL. 121


SQL(Structured Query Language) — язык структурированных запросов, не
путать с СУБД.
Принцип работы с БД прост. Создается база данных, в ней создаются таблицы
с нужными типами данных и размерами. Таблицы заполняются данными.
Далее к ним делают запросы, чтобы извлечь, добавить, модифицировать
или удалить данные.
Для однозначного определения строки в таблице используется так
называемый первичный ключ. Обычно это номер, который уникален для
каждой записи. Обозначается он как PRIMARY KEY.
Команды принято набирать заглавными буквами.

Пример роли MySQL в информационном пространстве

СИС – это справочно-информационная система, по сути это обычно веб-


сайт, данные которого хранятся в базе MySQL.

Типы данных
Все данные хранятся в определенном формате, который принято называть
типом данных. Типы данных бывают разные, числовые – хранят числа,
строковые – хранят наборы символов (слова, целые предложения) и

122 Модуль 11. MySQL.


бинарные – хранят бинарные данные, такие как графические картинки. Тип
данных нужно выбирать исходя из своих потребностей.

Числа
TINYINT – очень маленькое целое число, может быть от -128 до 127 или от 0
до 255
SMALLINT – малое целое число, может быть от -32768 до 32767 или от 0 до
65535
MEDIUMINT – целое число среднего размера, может быть от -8388608 до
8388607 или от 0 до 16777215
INT – целое число нормального размера, может быть от -2147483648 до
2147483647 или от 0 до 4294967295
BIGINT – большое целое число, может быть от -9223372036854775808 до
9223372036854775807 или от 0 до 18446744073709551615
FLOAT – малое число с плавающей точкой обычной точности. Может
быть от -3.402823466E+38 до -1.175494351E-38, 0, и от 1.175494351E-38 до
3.402823466E+38.
DOUBLE - число с плавающей точкой удвоенной точности нормального
размера. Может быть от -1,7976931348623157E+308 до -2,2250738585072014E-
308, 0, и от 2,2250738585072014E-308 до 1,7976931348623157E+308

Символы
CHAR – до 255 символов, пустота заполняется пробелами
VARCHAR – строка переменной длины, для хранения величин типа VARCHAR
используется только то количество символов, которое нужно + 1 байт для
хранения информации о длине

Бинарные
р данные
BLOB – этот тип данных содержит бинарные данные, например графические
картинки. Максимальная размер BLOB – 65535 байт.
MEDIUMBLOB – тоже самое что и BLOB, только максимальный размер -
16,777,215 байт (16 МБ)
LONGBLOB – бинарный тип, размер до 4 Гб.

Тип данных для хранения


р даты и времени
р
DATE – поддерживает диапазон от '1000-01-01' до '9999-12-31'

Модуль 11. MySQL. 123


DATETIME – содержит комбинацию даты и времени. Может быть от '1000-01-
01 00:00:00' до '9999-12-31 23:59:59'
TIMESTAMP – содержит время в секундах начиная с 1970-01-01. Может быть
от '1970-01-01 00:00:01' UTC до '2038-01-09 03:14:07' UTC
TIME – Время. Диапазон от '-838:59:59' до '838:59:59'
YEAR[(2|4)] – год в двухзначном или четырехзначном формате. В
четырехзначном может быть от 1901 до 2155, и 0000. В двухзначном может
быть от 70 до 69, воспроизводя даты от 1970 до 2069.

Сколько нужно места под хранение типа данных ?

Числа
Тип дданных Сколько нужно
у места д
для хранения
р
TINYINT 1 байт
SMALLINT 2 байта
MEDIUMINT 3 байта
INT, INTEGER 4 байта
BIGINT 8 байт
4 байта если 0 <= p <= 24, 8 байт если 25
FLOAT(p)
<= p <= 53
FLOAT 4 байта
DOUBLE [PRECISION], REAL 8 байт

Даты и время
Д р
Тип данных Сколько нужно места
DATE 3 байта
TIME 3 байта
DATETIME 8 байт
TIMESTAMP 4 байта
YEAR 1 байт

Строки
р и бинарный
р тип
Тип данных Сколько нужно места
CHAR M × w байт, 0 <= M <= 255, где w – нужное число байт
для объекта
VARCHAR L + 1 байт если значение требует до 255 байт, L + 2
байт если требуется больше чем 255 байт

124 Модуль 11. MySQL.


BLOB L + 2 байт, где L < 216
MEDIUMBLOB L + 3 байт, где L < 224
LONGBLOB L + 4 байт, где L < 232
M – декларированная длина ячейки, L – актуальная длина ячейки
Лучший источник о типах данных в MySQL 5.0 – это конечно же официальная
документация: http://dev.mysql.com/doc/refman/5.0/en/data-types.html

Практика
Начнем осваивать MySQL но для начала поставим нужное ПО.

# yum -y install mysql-server

Теперь проверим статус базы

# /etc/init.d/mysqld status
mysqld is stopped

База в выключенном состояние. Давайте ее запустим в первый раз.

# chkconfig mysqld on
# /etc/init.d/mysqld start
Initializing MySQL database: Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy


support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !


To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h centos52 password 'new-password'
See the manual for more instructions.

Модуль 11. MySQL. 125


You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl


cd mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available on the web at


http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
[ OK ]
Starting MySQL: [ OK ]

Запуская впервые БД мы увидели предупреждение о необходимости


установить административный пароль. Попробуем получить доступ в
интерфейс mysql без пароля.

# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Мы без проблем попали внутрь и можем делать что хотим! Думаю вам не
захочется чтобы кто-то еще получил доступ к Вашим данным. Поэтому мы
сейчас поставим административный пароль.

# /usr/bin/mysqladmin -u root password ‘the_secret’

Готово. Проверяем что изменилось.


# mysql

126 Модуль 11. MySQL.


ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Ошибка доступа! Это хорошо, это означает что уже не любой сможет попасть
в базу. Теперь зададим команду mysql с ключом -p, То есть запросим строку
ввода пароля, ключ -u позволяет задать пользователя под которым мы хотим
зайти. Но если ключ не задан будет использован root, То есть администратор
сервера.

# mysql -p
<вводим наш пароль на MySQL, который мы ввели выше>
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Выполним команду status, ее можно ввести сокращенно, То есть так: \s


Она нам покажет различную информацию о MySQL.

mysql> \s
--------------
mysql Ver 14.12 Distrib 5.0.45, for redhat-linux-gnu (i686) using readline 5.0

Connection id: 12
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.45 Source distribution
Protocol version: 10

Модуль 11. MySQL. 127


Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 19 min 51 sec

Threads: 1 Questions: 26 Slow queries: 0 Opens: 12 Flush tables: 1 Open tab


les: 6 Queries per second avg: 0.022
--------------

mysql>

Выход из монитора MySQL выполняется командой quite или просто \q


Справка по командам — команда help или просто \h

Посмотрим какие базы данных у нас есть

mysql> show databases;


+-------------------------+
| Database |
+-------------------------+
| information_schema |
| mysql |
| test |
+-------------------------+
3 rows in set (0.00 sec)

Эти три базы стандартные, они всегда есть в новой инсталляции MySQL. Базу
test можно удалить, это делается командой DROP DATABASE

mysql> DROP DATABASE test;


Query OK, 0 rows affected (0.00 sec)

128 Модуль 11. MySQL.


Отлично мы поставили MySQL, задали на нее административный пароль,
научились заходить и поняли как выполнять там команды. Продолжим.

Лучше всего обучение происходит на практике. Давайте поставим задачу.


Создадим базу данных, создадим в ней две таблицы, занесем в них данные,
создадим пользователя и сделаем его владельцем этой базы. Ну и в конце
сделаем несколько SQL-запросов.

Создаем базу данных company, это делается командой CREATE DATABASE

mysql> CREATE DATABASE company;


Query OK, 1 row affected (0.00 sec)

Воспользовавшись командой \s мы заметим что поле Current database:


является пустым. В этом поле отображается текущая база данных. Выбрав
какую-то базу мы можем производить в ней манипуляции, например
просматривать структуру таблиц и делать запросы.

Выберем нашу базу данных в качестве текущей, это делается командой USE

mysql> USE company;


Database changed

Просмотрим содержимое базы а именно ее таблицы

mysql> show tables;


Empty set (0.00 sec)

Пока пусто, исправим это. Создадим таблицу с сотрудниками нашей


компании

mysql> CREATE TABLE users ( id INT(5) AUTO_INCREMENT PRIMARY KEY, name


VARCHAR(64), surname VARCHAR(64), age TINYINT(3), email VARCHAR(64), status
VARCHAR(128)) DEFAULT CHARACTER SET UTF8;
Query OK, 0 rows affected (0.01 sec)
Отлично. Проверим, действительно ли таблица была создана.

Модуль 11. MySQL. 129


Проверим, правильно ли описана наша таблица. Структуру таблицы можно
посмотреть командой DESCRIBE

Таблица готова, теперь ее нужно заполнить.

mysql> INSERT INTO users VALUES('', 'Ivan', 'Petrov', '25', 'petrov@company.ru', 'work');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO users VALUES('', 'Sergey', 'Malevin', '29', 'serg@company.ru',


'tourism');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO users VALUES('', 'Fyodor', 'Karpin', '27', 'fyodor@company.ru', 'work');
Query OK, 1 row affected, 1 warning (0.01 sec)

Файл как источник запросов


Внимание! Вы можете все свои запросы к базе поместить в файл а потом
выполнить его в помощью команды SOURCE. Создадим файл sourcefile.sql и
поместим туда все наши запросы INSERT. Сам файл расположен в /root.
mysql>USE company;

130 Модуль 11. MySQL.


mysql> SOURCE /root/sourcefile.sql;
Query OK, 1 row affected, 1 warning (0.00 sec)

Query OK, 1 row affected, 1 warning (0.00 sec)

Query OK, 1 row affected, 1 warning (0.00 sec)

Мы добавили три записи в таблицу, теперь давайте посмотрим что


получилось. Выборку из базы данных можно сделать командой SELECT <что
нам нужно> FROM <название таблицы>. Мы сделаем выборку всего что есть
в таблице.

То, что нужно! Мы создали поле id и поставили на него AUTO_INCREMENT, то


есть при вводе каждой новой записи значение id будет увеличиваться на
единицу.
Сделаем запрос с условием. Нам нужно узнать кто сейчас работает. Условие
можно задать командой WHERE.

Сегодня наш коллега Сергей вернулся из отпуска, нужно это отобразить в БД.

Модифицировать данные можно командой UPDATE. Мы указываем в какой


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

Модуль 11. MySQL. 131


mysql> UPDATE users SET status='work' WHERE surname='Malevin';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

Все получилось. Теперь удалим запись из таблицы. К примеру Федор Карпин


больше не работает в нашей компании.

mysql> DELETE from users WHERE surname='Karpin';


Query OK, 1 row affected (0.00 sec)

Вернем пока что Федора на место, все таки 3 – хорошее число и посчитаем
количество записей в нашей таблице, это бывает необходимым.

Пользователи и привилегии
Теперь про пользователей и права. До этого момента мы работали из под
root.
Создадим обычного пользователя (admin) и дадим ему некоторые права на
базу company и все таблицы в ней (company.*).

132 Модуль 11. MySQL.


mysql> GRANT SELECT, INSERT, DELETE, UPDATE ON company.* TO
'admin'@'localhost' IDENTIFIED BY 'secret';
Query OK, 0 rows affected (0.00 sec)

Теперь можно заходить из под него и работать с базой.

# mysql -u admin -p

mysql> SHOW GRANTS FOR 'admin'@'localhost';

Убрать права можно с помощью команды REVOKE. Убираем возможность


удалять записи.

mysql> REVOKE DELETE ON company.* FROM 'admin'@'localhost';


Query OK, 0 rows affected (0.00 sec)

Замечу, даже если отобрать все права у пользователя он все равно будет в
MySQL. Полностью удалить пользователя из базы можно так.

# mysql -p
mysql> DELETE FROM mysql.user WHERE USER=’admin@localhost’;
Query OK, 0 rows affected (0.00 sec)

Саммари по командам и принципу работы


Наша база данных расположена в /var/lib/mysql/<название БД>

# ls -lh /var/lib/mysql/company/
total 40K
-rw-rw---- 1 mysql mysql 65 Feb 21 12:05 db.opt
-rw-rw---- 1 mysql mysql 8.6K Feb 21 19:26 users.frm
-rw-rw---- 1 mysql mysql 168 Feb 21 20:40 users.MYD
-rw-rw---- 1 mysql mysql 2.0K Feb 21 20:40 users.MYI

Файлы в бинарном формате и нечего с ними напрямую делать не нужно.

Модуль 11. MySQL. 133


Как работать с БД

Создаем базу данных с помощью CREATE DATABASE


Делаем её текущей с помощью USE
Создаем в ней таблицу с помощью CREATE TABLE
Заполняем данными с помощью INSERT INTO
Работаем с БД

Запросы

SELECT – делаем выборку


INSERT – заносим данные
UPDATE – модифицируем данные
DELETE – удаляем
GRANT – даем привилегии пользователю
REVOKE – убираем привилегии у пользователя
DROP – удаляет базу или таблицу (DROP DATABASE <название базы> или
DROP TABLE <название таблицы>)

Команды в мониторе MySQL


HELP – хорошая справка по MySQL
STATUS – текущий статус MySQL
SHOW DATABASES; - вывести весь список БД
SHOW TABLES; - вывести список всех таблиц в базе (перед этим делаем базу
активной с помощью USE)
SHOW PROSESSLIST; - текущие процессы в базе

Условие WHERE поможет, когда нужно работать с записями попадающими


под конкретное условие

Конфигурационный файл my.cnf


До этого момента мы плодотворно поработали с MySQL но даже не
притронулись к конфигурационному файлу. Типового файла конфигурации
хватает для решения малых и средних задач бизнеса. Как производительность
различных баз данных, так и опции в этом файле (связанные с
производительностью) не играют роли до определенного момента. Обычно

134 Модуль 11. MySQL.


возникает две ситуации. Малые/средние нагрузки когда вы обслуживаете
MySQL. При таком раскладе приходится делать несложные запросы,
резервное копирование баз, подключение веб-проектов использующих БД.
Настройки не сильно влияют на производительность. И вторая ситуация
– большие базы данных и большие нагрузки, скорее всего в этом случае в
компании будут специалисты по БД.

Вместе с MySQL поставляется пять файлов типовой конфигурации, начать


лучше с них и далее корректировать под свои нужды.

# find / -name my*.cnf


/usr/share/doc/mysql-server-5.0.45/my-huge.cnf
/usr/share/doc/mysql-server-5.0.45/my-large.cnf
/usr/share/doc/mysql-server-5.0.45/my-small.cnf
/usr/share/doc/mysql-server-5.0.45/my-innodb-heavy-4G.cnf
/usr/share/doc/mysql-server-5.0.45/my-medium.cnf
/usr/share/mysql/my-huge.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-small.cnf
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-medium.cnf
/etc/my.cnf

Рабочий файл конфигурации MySQL – это /etc/my.cnf, все остальные это


шаблоны которые можно использовать вместо my.cnf

Пожалуй самое главное что стоит сделать – это отключить возможность


подключения к БД по сети. Для этого нужно добавить строку skip-networking
в /etc/my.cnf

Если захочется сделать кодировку в базе cp1251 то в my.cf в секцию [mysqld]


добавляем такое:

[mysqld]
default-character-set=cp1251
init-connect='SET NAMES cp1251'

Модуль 11. MySQL. 135


Забытый пароль администратора
Чтобы сбросить пароль администратора выключаем MySQL-сервер и
перезапускаем его с опцией --skip-grant-tables
#service mysqld stop
# mysqld_safe --skip-grant-tables &
# mysql
mysql>UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE
user='root';
mysql>FLUSH PRIVILEGES;
# service mysqld restart
Вместо newpwd укажите желаемый пароль.

Резервное копирование
Резервное копирование можно делать с помощью mysqldump. Скопируем
нашу базу company в файл company.sql

# mysqldump --opt -p company > company.sql

--opt – Тоже самое, что и перечисление --add-drop-table --add-locks –create-


options --disable-keys --extended-insert --lock-tables --quick –set-charset.
Рекомендуется использовать.

-p – запрашивает строку пароля для пользователя root, можно указать


другого пользователя ключом -u

company – название нашей базы в MySQL

> company.sql – куда записать дамп базы, мы это сделали в company.sql,


принято дампам MySQL давать имена с расширением sql

Комментарий: вообще в последних версиях mysqldump опции –add-drop-*


добавлять необходимости нет, это происходит автоматически.

136 Модуль 11. MySQL.


Удалим нашу базу, создадим пустую и попробуем восстановить из резервной
копии.

Удаляем базу

mysql> DROP DATABASE company;


Query OK, 1 row affected (0.06 sec)

Создаем её заново

mysql> CREATE DATABASE company;


Query OK, 1 row affected (0.00 sec)

Закачиваем

# mysql -p company < company.sql


# mysql -p

mysql>USE company;

Все как мы хотели.

Проверка целостности таблиц с помощью myisamchk


Иногда база отказывается грузится указывая на ошибки в таблице. Самое
время запустить myisamchk. Программа предназначена для профилактики
таблиц и послеаварийного восстановления. В качестве аргумента, программе
нужно передать MyISAM-таблицу (*.MYI) которую мы хотим проверить.

Модуль 11. MySQL. 137


# myisamchk /var/lib/mysql/company/users.MYI
Checking MyISAM file: /var/lib/mysql/company/users.MYI
Data records: 3 Deleted blocks: 0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
- check record links

Ключ -r или --recover может исправить практически все, кроме уникальных


ключей, в которых есть повторения (ошибка, вероятность которой мизерна
для таблиц ISAM/MyISAM).

Ключ -o или --safe-recover это старый метод восстановления (читаются


подряд все строки и обновляются все деревья индексов на основе
найденных строк) метод весьма медлителен, но справляется с несколькими
редкими случаями, непосильными для -r

Саммари по myisamchk
Ключи -r или -o используются для восстановления таблиц. Рекомендуется
использовать ключ -r и если он не помог, использовать -o, который на
порядок медленнее работает.

Резюме
Мы познакомились с СУБД MySQL, поняли как все устроено и работает.
Изучили популярные SQL-запросы, которые наверно используются в
90% случаев если не больше. Это конечно только вершина айсберга, но
полученных знаний и навыком достаточно чтобы решать почти любые
задачи, которые могут встретиться у владельца сайта или системного
администратора. Для более сложных вещей существуют администраторы
БД и разработчики БД.

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

138 Модуль 11. MySQL.


Система мониторинга Nagios

Nagios – это система мониторинга, позволяющая отслеживать работу не


только сетевых но и системных служб. Работа Nagios основывается на
многочисленных плагинах, которые добавляют в программу практически
безграничный функционал.
Основные возможности Nagios:
– мониторинг сетевых служб (HTTP/S, SMTP, POP3, IMAP, DNS, FTP, SNMP и
т.д.);
– мониторинг системных служб и параметров (нагрузка на CPU, использование
памяти, использование диска и т.д.);
– возможность построения распределенной системы мониторинга;
– легкость в построение своих плагинов;
– гибкость конфигурирования;
– удобный веб-интерфейс.
В Nagios есть два режима проверки хоста, активный и пассивный. Активный
– это когда сама система мониторинга посылает запросы к удаленному
хосту и получает информацию. Пассивный – это когда специальная внешняя
программа присылают всю необходимую информацию в Nagios. Пассивные
проверки полезны в случае блокирования файрволом прямого доступа в
нужную нам сеть. Внешние пользователи не могут попасть во внутреннею
сеть а вот из внутренний сети обратиться во внешнею можно. Unix-программа
которая занимается обслуживанием пассивных проверок – NSCA. Принцип
ее работы показан на рисунке ниже.

Со стороны сервера мониторинга запускается служба NSCA которая


принимает все пассивные запросы со стороны клиентов и передает их в
Nagios. NSCA можно скачать на www.nagios.org
В мониторинге сетевых служб используется обращение на определенный
порт в зависимости от службы. Яркий пример такого же принципа работы
это программа telnet. В случае проверки системных служб на хосте где
работает Nagios все просто, информация сразу поступает в Nagios. В случае
удаленных хостов на них нужно поставить специальный агент, который

Модуль 12. Система мониторинга Nagios. 139


соберет информацию о локальных службах и отправит ее в Nagios. Агент для
linux называется NRPE, для Windows NSClient++

Как мы видим, Nagios способен без проблем обслуживать гетерогенные


сети.

Установка и настройка Nagios


Убедитесь что репозиторий EPEL подключен
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-
5-3.noarch.rpm

далее набираем
# yum -y install nagios nagios-plugins-all

Добавляем сервисы Nagios и Apache в автозагрузку


# chkconfig nagios on
# chkconfig httpd on

Каталоги с ключевыми файлами Nagios:


/etc/nagios/ Конфигурационные файлы Nagios;
/usr/bin/nagiostats Программа показывающая статистику работы Nagios;
/etc/init.d/nagios Скрипт запуска/выключения сервиса;
/etc/httpd/conf.d/ Файл подключения к Apache;
nagios.conf
/usr/share/doc/ Документация;
/usr/lib/nagios/ Движок Nagios;
/usr/share/nagios/
/var/log/nagios/ Логи.

140 Модуль 12. Система мониторинга Nagios.


Конфигурационные файлы Nagios (все они расположены в /etc/nagios/)
cgi.conf Задаем права доступа пользователям, некоторые
другие опции;
commands.cfg С какими параметрами выполняются команды,
команды используем в localhost.cfg в директиве
check_command;
localhost.cfg Файл описывающий какие сервера и как мониторим.
Описываем режим проверки хостов и уведомления
персонала;
nagios.cfg Файл настройки самого сервера Nagios. Файл задает
параметры как Nagios будет функционировать;
passwd Файл с логинами и паролями пользователей Nagios
(заполняем с помощью htpasswd);
private/resource.cfg В переменной $USER1 сохраняем путь к каталогу с
нашими плагинами. Переменная активно используется
в commands.cfg Все это для того чтобы напрямую не
давать доступ CGI-программам.

Файл /etc/httpd/conf.d/nagios.conf
p g
ScriptAlias /nagios/cgi-bin/ /usr/lib/nagios/cgi-bin/

<Directory /usr/lib/nagios/cgi-bin/>
Options ExecCGI
Order Allow,Deny
Allow From All
AuthType Basic
AuthUserFile /etc/nagios/passwd
AuthName «nagios»
Require valid-user
</Directory>

Alias /nagios/ /usr/share/nagios/html/

<Directory /usr/share/nagios/html/>
Options None
Order Allow,Deny
Allow From All
AuthType Basic
AuthUserFile /etc/nagios/passwd
AuthName «nagios»
Require valid-user
</Directory>

Модуль 12. Система мониторинга Nagios. 141


Примеры настройки для SSL-сервера есть в том же файле, отредактируйте
их по аналогии с обычным режимом работы Apache.
Заведем пользователя nagiosadmin, используя этот аккаунт мы будем
попадать в веб-интерфейс Nagios
# htpasswd -c /etc/nagios/passwd nagiosadmin

Конфигурационный
ф ур ц файл
ф /etc/nagios/cgi.cfg
g g g
# CGI.CFG - Sample CGI Configuration File for Nagios 2.12

# MAIN CONFIGURATION FILE


# Здесь указываем где искать главный конфигурационный файл

main_config_file=/etc/nagios/nagios.cfg

# HTML PATH
# Здесь указываем где расположены html-файлы Nagios

physical_html_path=/usr/share/nagios/share

# URL HTML PATH


# Значение используется CGI для поиска документации и графики. Если в
#Nagios вы попадаете как http://fasttech.ru/nagios то HTML PATH должен
#быть /nagios

url_html_path=/nagios

# CONTEXT-SENSITIVE HELP
# Выводить ли контекстную подсказку или нет

show_context_help=0

# NAGIOS PROCESS CHECK COMMAND


# Полный путь и имя программы используемой для проверки самого процесса
#Nagios. Хотя если Nagios упадет вы сразу это заметите :)

#nagios_check_command=/usr/lib/nagios/plugins/check_nagios
#/var/log/nagios/status.dat 5 ‘/usr/sbin/nagios’

# AUTHENTICATION USAGE
# Использовать ли аутентификацию для доступа в интерфейс. Однозначно
#рекомендуется ее использовать!

use_authentication=1

# DEFAULT USER

142 Модуль 12. Система мониторинга Nagios.


# Пользователи которые могут просматривать статистику без аутентификации
# лучше избегать всех неконтролируемых событий в жизни серверов
#default_user_name=guest

# SYSTEM/PROCESS INFORMATION ACCESS


# Каким пользователям разрешено получать статистику по этим параметрам

authorized_for_system_information=nagiosadmin

# CONFIGURATION INFORMATION ACCESS


# Каким пользователям разрешено получать статистику по этим параметрам

authorized_for_configuration_information=nagiosadmin

# SYSTEM/PROCESS COMMAND ACCESS


# Каким пользователям разрешено выполнять команды в интерфейсе Nagios

authorized_for_system_commands=nagiosadmin

# GLOBAL HOST/SERVICE VIEW ACCESS


# Каким пользователям разрешено получать статистику по этим параметрам

authorized_for_all_services=nagiosadmin
authorized_for_all_hosts=nagiosadmin

# GLOBAL HOST/SERVICE COMMAND ACCESS


# Каким пользователям разрешено получать статистику по этим параметрам

authorized_for_all_service_commands=nagiosadmin
authorized_for_all_host_commands=nagiosadmin

# STATUSMAP BACKGROUND IMAGE


# Опция позволяет задать изображения в качестве бекграунда для Status Map
#Предполагается что изображение находится в images path (
#/usr/share/nagios/html/images/). Поддерживаются следующие форматы
#изображения - GIF, PNG, JPEG, или GD2 format.

#statusmap_background_image=smbackground.gd2

# DEFAULT STATUSMAP LAYOUT METHOD


# Опция задает формат отображения Status Map. Возможные значения:
# 0 = User-defined coordinates
# 1 = Depth layers
# 2 = Collapsed tree
# 3 = Balanced tree
# 4 = Circular
# 5 = Circular (Marked Up)

Модуль 12. Система мониторинга Nagios. 143


# Попробуйте разные и решите что вам больше нравится

default_statusmap_layout=5

# DEFAULT STATUSWRL LAYOUT METHOD


# Формат отображения STATUSWRL.
# Возможные значения:
# 0 = User-defined coordinates
# 2 = Collapsed tree
# 3 = Balanced tree
# 4 = Circular
# Для просмотра 3-D Status Map необходим браузер с поддержкой VRML.
#Информацию о них можно найти в google. Сама по себе технология используется редко.

default_statuswrl_layout=4

# STATUSWRL INCLUDE
# Опция позволяет подключать собственные объекты в генерируемый VRML
#world. Предполагается что файл расположен в HTML PATH
#(/usr/share/nagios/html/).

#statuswrl_include=myworld.wrl

# PING SYNTAX
# С какими параметрами нужно пинговать удаленный хост из WAP
#интерфейса (используя statuswml cgi). В переменную $HOSTADDRESS$
#будет помещен адрес хоста.

ping_syntax=/bin/ping -n -U -c 5 $HOSTADDRESS$

# REFRESH RATE
# Интервал обновления страниц в секундах различных CGI-страниц (status,
#statusmap, extinfo, and outages)

refresh_rate=90

# SOUND OPTIONS
# Здесь можно задать звуковые файлы которые будут проигрываться если в
#сети что-то происходит. Компьютеры операторов Nagios должны быть
#оборудованы акустикой. Звуковые файлы я бы заменил, больно они
#неприятные на слух. Файлы расположены в /usr/share/nagios/html/media/

#host_unreachable_sound=hostdown.wav
#host_down_sound=hostdown.wav
#service_critical_sound=critical.wav
#service_warning_sound=warning.wav
#service_unknown_sound=warning.wav
#normal_sound=noproblem.wav

144 Модуль 12. Система мониторинга Nagios.


Конфигурационный
ф ур ц файл
ф /etc/nagios/commands.cfg
g g
Я не буду приводить весь его листинг, все команды описаны по общим
правилам о которых я здесь напишу.
# Sample command definitions for Nagios 2.12

# Синтаксис:
#
# define command{
# template <templatename>
# name <objectname>
# command_name <commandname>
# command_line <commandline>
# }
#
# Где:
#
# <templatename> = Имя с описанием другой команды которая будет шаблоном
# для текущей (опционально)
# <objectname> = Объектное имя с описанием другой команды которая будет
#шаблоном для текущей (опционально)
# <commandname> = имя команды которое будет использоваться в Nagios
# <commandline> = путь к выполняемой команде и аргументы

# Пример рабочей команды

define command{
command_name check_http
command_line $USER1$/check_http -H $HOSTADDRESS$
}

Конфигурационный
ф ур ц файл
ф /etc/nagios/localhost.cfg
g g
# LOCALHOST.CFG - SAMPLE OBJECT CONFIG FILE FOR MONITORING #THIS
MACHINE
#
# Для удобства администрирования файл разбит на несколько частей а именно:
# TIME PERIODS
# COMMANDS
# CONTACTS
# CONTACT GROUPS
# HOSTS
# HOST GROUPS
# SERVICES
#
#

Модуль 12. Система мониторинга Nagios. 145


# TIME PERIODS
# В начале файла описаны различные временные периоды – 24x7, workhours,
#nonworkhours. В дальнейшем вы их будете использовать для того чтобы
#сообщить Nagios, в какие часы отсылать уведомления если хост или сервис на
#нем стали недоступны. Отредактируйте их под свои нужды и политику
#мониторинга/уведомлений вашей компании.

define timeperiod{
timeperiod_name 24x7
alias 24 Hours A Day, 7 Days A Week
sunday 00:00-24:00
monday 00:00-24:00
tuesday 00:00-24:00
wednesday 00:00-24:00
thursday 00:00-24:00
friday 00:00-24:00
saturday 00:00-24:00
}

# ‘workhours’ timeperiod definition


define timeperiod{
timeperiod_name workhours
alias “Normal” Working Hours
monday 09:00-17:00
tuesday 09:00-17:00
wednesday 09:00-17:00
thursday 09:00-17:00
friday 09:00-17:00
}

# ‘nonworkhours’ timeperiod definition


define timeperiod{
timeperiod_name nonworkhours
alias Non-Work Hours
sunday 00:00-24:00
monday 00:00-09:00,17:00-24:00
tuesday 00:00-09:00,17:00-24:00
wednesday 00:00-09:00,17:00-24:00
thursday 00:00-09:00,17:00-24:00
friday 00:00-09:00,17:00-24:00
saturday 00:00-24:00
}

# ‘none’ timeperiod definition


define timeperiod{
timeperiod_name none
alias No Time Is A Good Time
}

146 Модуль 12. Система мониторинга Nagios.


# COMMANDS
# Секция COMMANDS будет пустой потому что, все что нужно уже описано в
# файле commands.cfg

# CONTACTS
# В этой секции мы указываем свои контакты. Куда отсылать уведомления о
# проблемах с сервисами.

define contact{
contact_name nagios-admin
alias Nagios Admin
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email nagios-admin@fasttech.ru
}

# CONTACT GROUPS
# При отправке уведомления в контактную группу, все ее участники получат
# сообщение. Можно удобно распределять администраторов по проектам.

define contactgroup{
contactgroup_name admins
alias Nagios Administrators
members nagios-admin
}

# HOSTS
# Базовый хост шаблон. В конце его описания стоит register = 0, что означает
#не использовать его в Nagios

define host{
name generic-host ; название host шаблона
notifications_enabled 1 ; Включать уведомления ?
event_handler_enabled 1 ; Включать ли event_handler, который
; отлавливает происходящие события

flap_detection_enabled 1 ; Включать ли Flap detection ?


; Flap Detection наступает в случае частой
; смены состояния хоста

failure_prediction_enabled 1 ; используется в распределенном


; мониторинге

Модуль 12. Система мониторинга Nagios. 147


process_perf_data 1 ; Обрабатывать информацию о произ-
; водительности

retain_status_information 1 ; Сохранять статусную информацию в


; момент перезагрузки Nagios или нет.
; Опция работает только если задана другая
; опция – retain_state_information=1

retain_nonstatus_information 1 ; Сохранять ли не статусную информацию


; в момент перезагрузки Nagios
; нужна опция retain_state_information=1

notification_period 24x7 ; Период уведомлений по хостам

register 0 ; Не регистрировать активность этого блока


; команд, это всего лишь шаблон для
; других хостов, чтобы не нужно было
; описывать весь этот список команд 100
; раз :) примеры использования будут ниже
}

# Linux шаблон, будем использовать его для всех наших Linux-серверов

define host{
name linux-server ; название шаблона
use generic-host ; шаблон наследует параметры generic-
; host который мы описали выше

check_period 24x7 ; период проверки


max_check_attempts 10 ; пытаться получить информацию о
; сервере не более 10 раз

check_command check-host-alive ; команда по умолчанию для


; проверки статуса Linux-сервера

notification_period workhours ; по Linux-серверам нас будут


; уведомлять только в рабочее
; время. Поскольку этот шаблон
; наследует все опции от generic-
;host а родительские опции пере-
;крывают собственные, то
;notification_period будет
; использован из generic-host,
;То есть 24x7! Имейте это ввиду.

notification_interval 120 ; отсылать уведомления заново


; каждые 2 часа

148 Модуль 12. Система мониторинга Nagios.


notification_options d,u,r ; отслылать уведомления только по
; конкретным статусам хоста
; d – down state (сервер упал), u -
; UNREACHABLE state (не удается
; выяснить состояние сервера так как
; он не достижим), r – recovery state
; (восстановление после падения)

contact_groups admins ; кому отсылать уведомления

register 0 ; не регистрировать в Nagios, это


; только шаблон
}

# А теперь рабочий пример

define host{
use linux-server ; название шаблона в качестве базовых
; опций для хоста. Шаблон linux-server, в
; свою очередь унаследовал все опции
; generic-host

host_name localhost
alias localhost
address 127.0.0.1
}

# HOST GROUPS
# Группы хостов объединеных по каким либо признакам, например Linux-
#сервера, Windows-сервера, сервера по проектам

define hostgroup{
hostgroup_name test
alias Test Servers
members localhost
}

# SERVICES

# Базовый шаблон сервиса

define service{
name generic-service ; название шаблона
active_checks_enabled 1 ; включение активной проверки
passive_checks_enabled 1 ; включение пассивной проверки
parallelize_check 1 ; проверка сервисов в
; параллельном режиме

Модуль 12. Система мониторинга Nagios. 149


; (отключение может повлечь за
; собой сильное понижение
; производительности)

obsess_over_service 1 ; разрешать ли ocsp_command


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

check_freshness 0 ; по умолчанию не проверяем


; “свежесть сервиса”. Это полезно
; при пассивных проверках
; сервисов, если мы хотим
; выяснить, так ли часто
; пассивный хост доставляет нам
; информацию о себе как мы хотим

notifications_enabled 1 ; уведомление о сервисах включено

event_handler_enabled 1 ; event handler сервисов включен

flap_detection_enabled 1 ; Flap detection (частая смена


; статуса сервиса) включен

failure_prediction_enabled 1 ; используется в распределенном


; мониторинге
process_perf_data 1 ; Обрабатывать информацию о
; производительности

retain_status_information 1 ; Сохранять статусную информацию в


; момент перезагрузки Nagios или нет.
; Опция работает только если задана другая
; опция – retain_state_information=1

retain_nonstatus_information 1 ; Сохранять ли не статусную информацию


; в момент перезагрузки Nagios ?
; нужна опция retain_state_information=1

is_volatile 0 ; изменчивый ли сервис по своей природе ?


register 0 ; не регистрировать активность, это
;всего лишь шаблон для других сервисов
}

# По аналогии с linux-server этот шаблон уже “боевой”, его мы будем


#использовать для конкретных хостов

150 Модуль 12. Система мониторинга Nagios.


define service{
name local-service ; название шаблона
use generic-service ; наследуем значения generic-
; service

check_period 24x7 ; период проверки

max_check_attempts 4 ; запрашивать статус сервиса до 4


; раз

normal_check_interval 5 ; в нормальном состояние


; сервис проверять каждые 5
; минут

retry_check_interval 1 ; перепроверка сервиса каждую


; минуты

contact_groups admins ; контактная группа

notification_options w,u,c,r ; уведомления отправлять


; только в случае w – Warning
; state, u – Unknown state, c –
; Critical state и r – Recovery state
; (события наступающее в
; момент восстановления
; работоспособности сервиса)

notification_interval 60 ; отправлять заново уведомление


; о проблеме с сервисами каждый час

notification_period 24x7 ; период уведомления,


; круглосуточно

register 0 ; этот блок команд - шаблон


}

# в конце описаны сервисы для мониторинга

# пингуем локальную машину, занятие конечно бесполезное но здесь это в


# качестве примера

define service{
use local-service ; используемый шаблон
host_name localhost
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}

Модуль 12. Система мониторинга Nagios. 151


# проверяем свободное место в корне (/) локальной машины, если свободно
#менее 20% то сервис устанавливаем в Warning state, если менее 10% то
#Critical state

define service{
use local-service ; используемый шаблон
host_name localhost ; какой хост проверяем
service_description Root Partition ; название сервиса в Nagios
check_command check_local_disk!20%!10%!/ ; команда
}

# мониторинг подключенных пользователей в локальной системе, если


#подключено более 20 то сервис переходит в режим Warning state, если более
#50 то Critical state

define service{
use local-service ; используемый шаблон
host_name localhost ; какой хост проверяем
service_description Current Users ; название сервиса в Nagios
check_command check_local_users!20!50 ; команда
}

# мониторинг локальных процессов, если запущено более 250 то наступает


#Warning state, если более 400 наступает Critical state

define service{
use local-service ; используемый шаблон
host_name localhost ; какой хост проверяем
service_description Total Processes ; название сервиса в Nagios
check_command check_local_procs!250!400!RSZDT ; команда
}

# проверяем нагрузку на локальной машине


define service{
use local-service ; используемый шаблон
host_name localhost ; какой хост проверяем
service_description Current Load ; название сервиса в Nagios
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0 ; команда
}

Конфигурационный
ф ур ц файл
ф /etc/nagios/nagios.cfg
g g g

# NAGIOS.CFG - Sample Main Config File for Nagios 2.12


# LOG FILE
# Log-файл куда пишутся все события хостов и сервисов

152 Модуль 12. Система мониторинга Nagios.


# NAGIOS.CFG - Sample Main Config File for Nagios 2.12

# LOG FILE
# Log-файл куда пишутся все события хостов и сервисов
# эта опция должна быть первой в конфигурационном файле!

log_file=/var/log/nagios/nagios.log

# OBJECT CONFIGURATION FILE(S)


# Объектные файлы — это файлы в которых описываются хосты, хост группы,
#контакты, группы контактов, сервисы и т.д.
# все эти секции могут быть описаны в разных файлах, для этого нужно
#использовать директиву cfg_file

# Команды описаны в этом файле


cfg_file=/etc/nagios/commands.cfg

# localhost и его сервисы описаны в этом файле


cfg_file=/etc/nagios/localhost.cfg

# Ниже представлен пример разделения секций по разным файлам

#cfg_file=/etc/nagios/contactgroups.cfg
#cfg_file=/etc/nagios/contacts.cfg
#cfg_file=/etc/nagios/dependencies.cfg
#cfg_file=/etc/nagios/escalations.cfg
#cfg_file=/etc/nagios/hostgroups.cfg
#cfg_file=/etc/nagios/hosts.cfg
#cfg_file=/etc/nagios/services.cfg
#cfg_file=/etc/nagios/timeperiods.cfg

# Nagios умеет обрабатывать все файлы с расширением .cfg в каком либо


#каталоге, для этого используется директива cfg_dir

#cfg_dir=/etc/nagios/servers
#cfg_dir=/etc/nagios/printers
#cfg_dir=/etc/nagios/switches
#cfg_dir=/etc/nagios/routers

# OBJECT CACHE FILE


# Cache-файл Nagios. CGI — программы получают конфигурацию из него а не
#напрямую из объектных файлов. Это защищает от несогласованности
#конфигурации в случае, если она изменялась после старта Nagios.

object_cache_file=/var/log/nagios/objects.cache

# RESOURCE FILE

Модуль 12. Система мониторинга Nagios. 153


# Файл содержащий $USERx$ макросы
# CGI-программы будут использовать указанный вами макрос но они не будут
#знать что внутри этого макроса. Макросы стоит использовать при указание в
#команде логинов/паролей и другой конфиденциальной информации.
# на файл /etc/nagios/private/resource.cfg установлены права 640

resource_file=/etc/nagios/private/resource.cfg

# STATUS FILE
# Файл в котором сохранен текущий статус всех сервисов и хостов, он
#очищается при перезагрузке Nagios

status_file=/var/log/nagios/status.dat

# NAGIOS USER
# От какого пользователя запускать процесс Nagios в операционной системе

nagios_user=nagios

# NAGIOS GROUP
# Рабочая группа Nagios

nagios_group=nagios

# EXTERNAL COMMAND OPTION


# Включать ли внешние команды. Если включим то появится возможность
#управлять хостами и сервисами через веб-интерфейс (включать/отключать
#уведомления для них, включать/выключать пассивные проверки и т.д.).

check_external_commands=0

# EXTERNAL COMMAND CHECK INTERVAL


# Интервал, через который Nagios будет проверять наличие команд для себя.
#Команды через веб-интерфейс выполняются не сразу а через определенный
#интервал. Этот интервал мы и указываем.
# Можно указать значение в секундах, например 15s а можно указать -1 что
#означает проверять наличие команд так часто, как только возможно

#command_check_interval=15s
command_check_interval=-1

# EXTERNAL COMMAND FILE


# Файл в который будут записываться команды в очередь на выполнение. Он
#должен иметь права на запись для пользователя от которого выполняется
#процесс веб-сервера

command_file=/var/spool/nagios/cmd/nagios.cmd

154 Модуль 12. Система мониторинга Nagios.


# EXTERNAL COMMAND BUFFER SLOTS
# Количество слотов для внешних команд. Значения по умолчанию более чем
#достаточно

external_command_buffer_slots=4096

# COMMENT FILE
# Файл в котором сохраняются комментарии для хостов и сервисов

comment_file=/var/log/nagios/comments.dat

# DOWNTIME FILE
# Файл в котором сохраняется информация о downtime-времени хостов и
#сервисов, То есть времени когда они не доступны

downtime_file=/var/log/nagios/downtime.dat

# LOCK FILE
# В этом файле хранится PID процесса Nagios. Используется сторонними
#программами

lock_file=/var/run/nagios.pid

# TEMP FILE
# Временный файл используется при обновление статус-лога, очистки
#комментариев и т.д.

temp_file=/var/log/nagios/nagios.tmp

# EVENT BROKER OPTIONS


# Благодря модулям, брокер может обслуживать различные происходящие
#события в Nagios
# Values: 0 = Broker nothing
# -1 = Broker everything
# <other> = See documentation

event_broker_options=-1

# EVENT BROKER MODULE(S)


# Здесь подгружаются модули брокера
# Example:
#
# broker_module=<modulepath> [moduleargs]

#broker_module=/somewhere/module1.o
#broker_module=/somewhere/module2.o arg1 arg2=3 debug=0

Модуль 12. Система мониторинга Nagios. 155


# LOG ROTATION METHOD
# Способы ротации главного лога Nagios
# n = None - don’t rotate the log
# h = Hourly rotation (top of the hour)
# d = Daily rotation (midnight every day)
# w = Weekly rotation (midnight on Saturday evening)
# m = Monthly rotation (midnight last day of month)

log_rotation_method=d

# LOG ARCHIVE PATH


# Расположение архива лог-файлов

log_archive_path=/var/log/nagios/archives

# LOGGING OPTIONS
# Используем системную службу Syslog чтобы записывать логи

use_syslog=1

# NOTIFICATION LOGGING OPTION


# Уведомления тоже записывать в лог

log_notifications=1

# SERVICE RETRY LOGGING OPTION


# Повторные проверки сервисов тоже записывать в лог

log_service_retries=1

# HOST RETRY LOGGING OPTION


# Повторные проверки хостов тоже записывать в лог

log_host_retries=1

# EVENT HANDLER LOGGING OPTION


# Записываем в логи event handlers, event handlers — это опциональные программы
# которые могут быть выполнены когда состояние хоста или сервиса изменяется

log_event_handlers=1

# INITIAL STATES LOGGING OPTION


# Записывать ли initial state в лог-файл ? Initial state — это когда хост или сервис
# проверяется в первый раз, включить — 1, выключить — 0

log_initial_states=0

156 Модуль 12. Система мониторинга Nagios.


# EXTERNAL COMMANDS LOGGING OPTION
# Записывать ли в лог активность внешних команд ?
# Опция не включает логирование пассивных проверок, для этого есть опция о
# которой ниже

log_external_commands=1

# PASSIVE CHECKS LOGGING OPTION


# Логирование пассивных проверок хостов и сервисов

log_passive_checks=1

# GLOBAL HOST AND SERVICE EVENT HANDLERS


# Опции позволяют указать команды event handler`а для хоста или сервиса,
# которые будут выполняться в случае изменения их состояния. global event
# handler выполняется немедленно, предшествуя event handler`у указанному в
# секции хоста или сервиса.

#global_host_event_handler=somecommand
#global_service_event_handler=somecommand

# SERVICE INTER-CHECK DELAY METHOD


# Метод распределения нагрузки в момент старта мониторинга. Чтобы снизить
# нагрузку на сервер мониторинга, все запросы к сервисам отсылаются не в
# один момент времени а с определенным интервалом.
# n = None - don’t use any delay between checks
# d = Use a “dumb” delay of 1 second between checks
# s = Use “smart” inter-check delay calculation
# x.xx = Use an inter-check delay of x.xx seconds

service_inter_check_delay_method=s

# MAXIMUM SERVICE CHECK SPREAD


# Временной фрейм в течение которого все первичные проверки сервисов
# должны быть завершены. По умолчанию 30 минут.

max_service_check_spread=30

# SERVICE CHECK INTERLEAVE FACTOR


# Это значение определяет метод чередования проверок хостов и сервисов,
# который позволит снизить нагрузку на удаленную машину
# s = Use “smart” interleave factor calculation
# x = Use an interleave factor of x, where x is a
# number greater than or equal to 1.

service_interleave_factor=s

Модуль 12. Система мониторинга Nagios. 157


# HOST INTER-CHECK DELAY METHOD
# Метод распределения нагрузки в момент старта мониторинга. Чтобы снизить
# нагрузку на сервер мониторинга, все запросы к хостам отсылаются не в один
# момент времени а с определенным интервалом.
# n = None - don’t use any delay between checks
# d = Use a “dumb” delay of 1 second between checks
# s = Use “smart” inter-check delay calculation
# x.xx = Use an inter-check delay of x.xx seconds

host_inter_check_delay_method=s

# MAXIMUM HOST CHECK SPREAD


# Временной фрейм в течение которого все первичные проверки сервисов
# должны быть завершены. По умолчанию 30 минут.

max_host_check_spread=30

# MAXIMUM CONCURRENT SERVICE CHECKS


# Опция позволяет задать максимальное число сервисов, проверяемых
# параллельно в определенный момент времени. 1 — запрещает проверку
# сервисов в параллельном режиме, 0 — не ограничивает число одновременных
# проверок

max_concurrent_checks=0

# SERVICE CHECK REAPER FREQUENCY


# Частота с которой Nagios обрабатывает результаты проверки сервисов.
# Указывается в секундах.

service_reaper_frequency=10

# CHECK RESULT BUFFER SLOTS


# Задает число слотов для хранения результатов проверки сервисов, после
# обработки результата слот освобождается. Значения по умолчанию более чем
# достаточно.

check_result_buffer_slots=4096

# AUTO-RESCHEDULING OPTION
# Опция может помочь сбалансировать нагрузку на сервер мониторинга
# автоматически переназначив проверку хостов и сервисов, распределяя
# нагрузку во времени. Опция эксперементальная и ее использование на свой
# страх и риск.

auto_reschedule_checks=0

# AUTO-RESCHEDULING INTERVAL

158 Модуль 12. Система мониторинга Nagios.


# Интервал переназначения в секундах.

auto_rescheduling_interval=30

# AUTO-RESCHEDULING WINDOW
# Размер «окна» в секундах. Проверки хостов и сервисов назначенные в
# следующие X секунд (размер окна) будут переназначены.

auto_rescheduling_window=180

# SLEEP TIME
# Время «сна» между которыми проверяются системные события и проверки
# сервисов которые должны быть выполнены

sleep_time=0.25

# TIMEOUT VALUES
# Как много времени давать на выполнение команде, после истечения которого
# она будет принудительно завершена. Значение указывается в секундах.

service_check_timeout=60
host_check_timeout=30
event_handler_timeout=30
notification_timeout=30
ocsp_timeout=5
perfdata_timeout=5

# RETAIN STATE INFORMATION


# Сохранять ли статусную информацию для хостов и сервисов в случае
# выключения Nagios. После рестарта Nagios вся сохраненная информация
# будет обратно загружена.

retain_state_information=1

# STATE RETENTION FILE


# Файл в котором сохраняется информация о статусе хостов и сервисов перед
# выключение Nagios. Файл используется только если preserve_state_information
# равен 1

state_retention_file=/var/log/nagios/retention.dat

# RETENTION DATA UPDATE INTERVAL


# Как часто сохранять в файл информацию о статусе хостов и сервисов пока
# Nagios нормально работает. Указывается в минутах.

retention_update_interval=60

Модуль 12. Система мониторинга Nagios. 159


# USE RETAINED PROGRAM STATE
# Восстанавливать ли статус для хостов и сервисов из retention file. 1 —
# восстанавливать, 0 - нет

use_retained_program_state=1

# USE RETAINED SCHEDULING INFO


# Восстанавливать ли информацию о запланированной следующей проверке из
# retention file или нет.

use_retained_scheduling_info=0

# INTERVAL LENGTH
# Интервал проверки

interval_length=60

# AGGRESSIVE HOST CHECKING OPTION


# Включать ли агресивную проверку хостов. Это может занять больше времени
# чем обычная. 1 — включить, 0 - выключить

use_aggressive_host_checking=0

# SERVICE CHECK EXECUTION OPTION


# Выполнять ли активно проверки сервисов когда они стартуют первый раз
# 1 — включать активные проверки, 0 — не включать

execute_service_checks=1

# PASSIVE SERVICE CHECK ACCEPTANCE OPTION


# Принимать ли результаты пассивных проверок когда сервисы только
# стартуют или рестартуют
# 1 — принимать пассивные проверки, 0 — не принимать

accept_passive_service_checks=1

# HOST CHECK EXECUTION OPTION


# Выполнять ли активно проверки хостов когда они стартуют первый раз
# 1 — включать активные проверки, 0 — не включать

execute_host_checks=1

# PASSIVE HOST CHECK ACCEPTANCE OPTION


# Принимать ли результаты пассивных проверок когда хосты только стартуют
# или рестартуют

accept_passive_host_checks=1

160 Модуль 12. Система мониторинга Nagios.


# NOTIFICATIONS OPTION
# Уведомлять когда хост или сервис стартуют первый раз ?
# 1 — да, 0 — нет

enable_notifications=1

# EVENT HANDLER USE OPTION


# Запускать ли event handler для только что запущенного хоста или сервиса
# 1 — запускать, 0 — не запускать

enable_event_handlers=1

# PROCESS PERFORMANCE DATA OPTION


# Обрабатывать ли информацию о производительности полученную от хостов и
# сервисов. Информация может содержать в себе задержку в проверке (разницу
# с запланированной проверкой), сколько проверка заняла времени и т.д.
# Проверка производительности осуществляется командами
# host_perfdata_command (о ней ниже) и service_perfdata_command (о ней ниже).
# 1 — обрабатывать данные о производительности, 0 — не обрабатывать

process_performance_data=0

# HOST AND SERVICE PERFORMANCE DATA PROCESSING COMMANDS


# Команды запускаются после того, как проверка хостов и сервисов
# завершится. Команды выполняются только если enable_performance_data
# равняется 1. Командный аргумент — короткое имя команды которое указано в
# host configuration file

#host_perfdata_command=process-host-perfdata
#service_perfdata_command=process-service-perfdata

# HOST AND SERVICE PERFORMANCE DATA FILES


# Файлы в которые сохраняется информация о производительности хостов и
# сервисов. Должна быть включена опция enable_performance_data

#host_perfdata_file=/tmp/host-perfdata
#service_perfdata_file=/tmp/service-perfdata

# HOST AND SERVICE PERFORMANCE DATA FILE TEMPLATES


# Шаблон для файлов содержащих информацию о производительности. Здесь
# описаны правила по которым нужно писать информацию в файлы. Шаблоны
# могут содержать макросы, специальные символы (\t — табуляция, \r —
# перевод каретки, \n — новая строка) и обычный текст. Новая строка
# автоматически добавляется после каждой записи в файл. Пара примеров дана
# ниже.

#host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t

Модуль 12. Система мониторинга Nagios. 161


#$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$

#service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t
#$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t
#$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$

# HOST AND SERVICE PERFORMANCE DATA FILE MODES


# Режим работы с файлами
# a — append (дописывать в файл), w — write (записывать). Режим по
# умолчанию вполне всем хорош.

#host_perfdata_file_mode=a
#service_perfdata_file_mode=a

# HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING #INTERVAL


# Как часто обрабатывать performance files командами которых указаны ниже.
# Значение указывается в секундах. 0 означает что обрабатывать не нужно.

#host_perfdata_file_processing_interval=0
#service_perfdata_file_processing_interval=0

# HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING #COMMANDS


# Используемые команды для обработки performance data files

#host_perfdata_file_processing_command=process-host-perfdata-file
#service_perfdata_file_processing_command=process-service-perfdata-file

# OBSESS OVER SERVICE CHECKS OPTION


# Если не планируется система распределенного мониторинга то опцию лучше
# не включать

obsess_over_services=0

# OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND


# Команда запускаемая для каждого сервиса. Работает только если
# obsess_over_services равняется 1

#ocsp_command=somecommand

# ORPHANED SERVICE CHECK OPTION


# Опция призвана решать редкую проблему, когда сервис не может быть
# перезапущен.

check_for_orphaned_services=1

# SERVICE FRESHNESS CHECK OPTION


# Проверять ли «свежесть» сервисов, это полезно при пассивных проверках

162 Модуль 12. Система мониторинга Nagios.


# когда нужно убедится что информация о сервисах поступает с нормальной
# переодичностью.
# 1 — включить проверку, 0 — отключить

check_service_freshness=1

# SERVICE FRESHNESS CHECK INTERVAL


# Интервал проверки «свежести» сервисов в секундах.

service_freshness_check_interval=60

# HOST FRESHNESS CHECK OPTION


# Проверять ли «свежесть» хостов, это полезно при пассивных проверках
# когда нужно убедится что информация о хостах поступает с нормальной
# переодичностью.
# 1 — включить проверку, 0 — отключить

check_host_freshness=0

# HOST FRESHNESS CHECK INTERVAL


# Интервал проверки «свежести» хостов в секундах.

host_freshness_check_interval=60

# AGGREGATED STATUS UPDATES


# Объединять обновления хостов, сервисов и данные состояния программ или
# нет. Обычно результаты обновляются моментально, что может создать
# большую нагрузку на сервер мониторинга.
# 1 — включить объединение результатов, 0 — не включать

aggregate_status_updates=1

# AGGREGATED STATUS UPDATE INTERVAL


# Интервал в секундах объединенного обновления статуса хостов и сервисов

status_update_interval=15

# FLAP DETECTION OPTION


# Влючать или нет обнаружение частой смены состояния хоста или сервиса.
# 1 — включить, 0 — выключить

enable_flap_detection=0

# FLAP DETECTION THRESHOLDS FOR HOSTS AND SERVICES


# Пороговые значения для flapping`а
# Подробнее про это написано здесь - #http://nagios.sourceforge.net/docs/2_0/flapping.html

Модуль 12. Система мониторинга Nagios. 163


low_service_flap_threshold=5.0
high_service_flap_threshold=20.0
low_host_flap_threshold=5.0
high_host_flap_threshold=20.0

# DATE FORMAT OPTION


# Формам отображения даты
# us (MM-DD-YYYY HH:MM:SS)
# euro (DD-MM-YYYY HH:MM:SS)
# iso8601 (YYYY-MM-DD HH:MM:SS)
# strict-iso8601 (YYYY-MM-DDTHH:MM:SS)

date_format=euro

# P1.PL FILE LOCATION


# Путь к скрипту p1.pl который используется встроенными Perl интерпретатором

p1_file=/usr/sbin/p1.pl

# ILLEGAL OBJECT NAME CHARACTERS


# Здесь можно указать символы которые не могут быть использованы в
# название хостов, описание сервисов или в название других типах объектов

illegal_object_name_chars=`~!$%^&*|’”<>?,()=

# ILLEGAL MACRO OUTPUT CHARACTERS


# Здесь можно указать символы которые будут убраны из макросов до того как
# будут использованы в уведомлениях и т.д. Это не распространяется на макросы
# используемые в командах проверки хостов и сервисов

illegal_macro_output_chars=`~$&|’”<>

# REGULAR EXPRESSION MATCHING


# Использовать регулярные выражения или нет
# 1 — включить, 0 — выключить

use_regexp_matching=0

# “TRUE” REGULAR EXPRESSION MATCHING


# Опция используется только если use_regexp_matching равняется 1. При
# отключенной опции совпадение происходит только на основание маски (*
# и ?), при включенной это происходит всегда, что может раздражать.
# 0 — отключить, 1 — включить

use_true_regexp_matching=0

# ADMINISTRATOR EMAIL ADDRESS

164 Модуль 12. Система мониторинга Nagios.


# Почтовый адрес администратора этого сервера

admin_email=nagios

# ADMINISTRATOR PAGER NUMBER/ADDRESS


# Номер пейджера администратора этого сервера. Определенно устаревшая опция.

admin_pager=pagenagios

# DAEMON CORE DUMP OPTION


# Разрешать создавать core dump или нет. Может использоваться для отладки.
# 1 — разрешать создавать, 0 — не разрешать

daemon_dumps_core=0

Конфигурационный
ф ур ц файл
ф /etc/nagios/private/resource.cfg
g p g
# RESOURCE.CFG - Sample Resource File for Nagios 2.12
# Этот файл содержит различные макросы, CGI-программы будут обращаться
# именно к ним а не к этому файлу напрямую. Поэтому здесь можно
# использовать все возвожные пароли и логины и не бояться утечки информации.
# Макрос $USER1$ будет содержать путь к плагинам

$USER1$=/usr/lib/nagios/plugins

# Макрос $USER2$ будет содержать путь к event handlers

#$USER2$=/usr/lib/nagios/plugins/eventhandlers

# Store some usernames and passwords (hidden from the CGIs)


#$USER3$=someuser
#$USER4$=somepassword

# service httpd start


# service nagios start

Собственно все. Теперь у нас есть полнофункциональный сервер


мониторинга. В файлы конфигурации можете внести изменения по своему
вкусу, но опции по умолчанию вполне нормальные. Пока в нашей системе
мониторинга только localhost. Допустим появилась необходимость добавить
на мониторинг еще один сервер, сделать это очень легко и сейчас я это
продемонстрирую.

Модуль 12. Система мониторинга Nagios. 165


Добавление хостов и сервисов на мониторинг

Есть linux-сервер с IP 192.168.146.135 и на нем работает веб-сервер,


DHCP-сервер и SMTP-сервер.

Добавим проверку этих трех служб и обычную доступность сервера

Мне повезло, все нужные мне плагины поставляются с Nagios и их не


пришлось искать в Интернет

Добавляем в файл /etc/nagios/localhost.cfg


# Чтобы поставить на мониторинг новый сервер необходимо описать секцию
# host с его участием. Здесь указываем какой шаблон настроек будем
# использовать, хостнейм который должен резолвится с помощью DNS или
# быть указанным в /etc/hosts, альяс и IP-адрес сервера

define host{
use linux-server
host_name mylinuxbox
alias mylinuxbox
address 192.168.146.135
}

# А теперь опишим сервисы которые хотим поставить на мониторинг на этом


# сервере

define service{
use local-service
host_name mylinuxbox
service_description PING
check_command check_ping!100.0,10%!200.0,60%
}

define service{
use local-service
host_name mylinuxbox
service_description SMTP
check_command check_smtp
}

define service{
use local-service
host_name mylinuxbox
service_description Apache
check_command check_http
}

166 Модуль 12. Система мониторинга Nagios.


define service{
use local-service
host_name mylinuxbox
service_description DHCPD
check_command check_dhcp
}

Чтобы узнать какие опции можно применить к командам check_* делаем


следующее

# /usr/lib/nagios/plugins/check_<название плагина> -h, например

# /usr/lib/nagios/plugins/check_http -h

Плагин check_dhcp есть в /usr/lib/nagios/plugins но не описан в /etc/nagios/


commands.cfg поэтому внесем соответствующию запись

define command{
command_name check_dhcp
command_line $USER1$/check_dhcp -s $HOSTADDRESS$
}

Проверить ошибки в конфигурации можно командой


#/usr/sbin/nagios -v /etc/nagios/nagios.cfg

Перезагружаем Nagios
# service nagios restart

Все должно заработать.

Мониторинг различных параметров сервера


Ниже я привел некоторые способы мониторинга основных системных
параметров и служб. Думаю пригодится.

Мониторинг
р свободного места
Выведем список 5 пользователей занимающих наибольшее количество
дискового пространства в своем домашнем каталоге.
# du -cms /home/* | sort -rn | head -6

Модуль 12. Система мониторинга Nagios. 167


8200 total
6100 /home/james
900 /home/ronaldo
570 /home/neo
420 /home/tester
210 /home/mybestuser
Как видим пользователь james занимает 6.1 Гб места и т.д.

Защита
щ системы от пользовательских процессов
р ц
Пользовательские процессы без проблеммогутзанятьвседисковоепространство
и тем самым положить сервер. Чтобы этого избежать воспользуемся командой
ulimit и ограничим возможный размер файла до 10Мб.
# ulimit -f 10000
# yes 'some shit' > shit.txt
File size limit exceeded

# ls -l
total 10016
-rw-r--r-- 1 root root 10240000 Mar 14 21:36 shit.txt

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

Просмотреть все возможные параметры


# ulimit -a

Ограничение в 10 Мб конечно врядли подойдет, а вот ограничить в 10 Гб уже


можно. Защита от дурака так сказать.

Мониторинг
р S.M.A.R.T. - параметров
р р жесткого диска
# smartctl -a /dev/sda
Напомню, S.M.A.R.T. - это Self-Monitoring, Analysis and Reporting Technology.
Технология самоконтроля и анализа, которой снабжены все современные
диски. Она позволяет отслеживать основные параметры жестких дисков и
прогнозировать потенциальный отказ.

168 Модуль 12. Система мониторинга Nagios.


Один из способов выяснить как ваш HDD называется в системе это выполнить
команду fdisk -l, значение без цифры и будет нужным устройством.

Мониторинг
р сетевых портов
р в Linux
Просмотреть конкретный сетевой порт можно вот так
# netstat -nlp | grep :8080
tcp 0 0 :::8080 :::* LISTEN 2697/httpd

Как видим на порту 8080 выполняется веб-сервер Apache


Весь список активных портов
# netstat -tlnp

Мониторинг
р открытых
р ф
файлов и сокетов
Для этих целей хорошо подойдет lsof.
Вывод всех открытых файлов
# lsof

Смотрим открытые файлы работающие с сетью по IPv4


# lsof -i 4
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
portmap 2341 rpc 3u IPv4 6692 UDP *:sunrpc
rpc.statd 2366 root 7u IPv4 6748 TCP *:852 (LISTEN)
cupsd 2657 root 3u IPv4 7392 TCP localhost.localdomain:ipp (LISTEN)
cupsd 2657 root 5u IPv4 7395 UDP *:ipp
php-cgi 2662 nginx 0u IPv4 7415 TCP localhost.localdomain:cslistener (LISTEN)
nginx 3915 nginx 5u IPv4 10864 TCP *:https (LISTEN)
nginx 3915 nginx 6u IPv4 10865 TCP *:http (LISTEN)

Список открытых файлов по NFS


# lsof -N

Список открытых файлов в /var/log/


Опция +d покажет открытые файлы только в этом каталоге а +D и во
вложенных

Модуль 12. Система мониторинга Nagios. 169


# lsof +d /var/log
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslogd 2289 root 1w REG 253,0 382311 3047763 /var/log/messages
syslogd 2289 root 2w REG 253,0 25939 3047764 /var/log/secure
syslogd 2289 root 3w REG 253,0 6285 3047765 /var/log/maillog
syslogd 2289 root 4w REG 253,0 7348 3047768 /var/log/cron
syslogd 2289 root 5w REG 253,0 0 3047766 /var/log/spooler
syslogd 2289 root 6w REG 253,0 1532 3047767 /var/log/boot.log
acpid 2590 root 2w REG 253,0 3374 3047640 /var/log/acpid
nginx 3914 root 2u REG 253,0 3398 3047715 /var/log/nginx.error_log

Список открытых файлов для конкретного пользователя


# lsof -u james

Мониторинг
р запущенных
ущ процессов
р ц
Все процессы
# ps -eF
Вывести дерево процессов
# ps -ejH

Мониторинг
р системных рресурсов
ур
# top
или, если хочется чтобы все было красиво (не забудьте подключить
репозиторий EPEL)
# yum -y install htop
# htop

Мониторинг
р свободного места в рразделах
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
23G 2.4G 20G 11% /

170 Модуль 12. Система мониторинга Nagios.


/dev/sda1 99M 19M 75M 21% /boot
tmpfs 352M 0 352M 0% /dev/shm

Мониторинг
р сетевой подсистемы в реальном
р времени
р
В этом нам отлично поможет пакет ntop.
Убедитесь что репозиторий EPEL подключен. Далее набираем команду:
# yum -y install ntop

Инициализируем ntop, нужно будет задать пароль для админа.


# ntop -A u ntop -P /etc/ntop/

В файл /etc/ntop.conf добавляем наш IP-адрес в опциях --http-server и --https-server


Запускаем ntop как службу
# service ntop start

Теперь через браузер можно получить доступ к статистики ntop.


По умолчанию ntop работает на порту 3000.
Пример
http://192.168.146.132:3000/

Есть и консольная программа для просмотра статистики по сетевому


интерфейсу.
# yum -y install iftop
# iftop

Мониторинг
р рработы DNS-сервера
р р в реальном
р времени
р
Ставим пакет dnstop на том же сервере где и dns-сервер.
# wget http://dag.wieers.com/rpm/packages/dnstop/dnstop-0.0.20070510-1.
el5.rf.i386.rpm
# rpm -Uvh dnstop-0.0.20070510-1.el5.rf.i386.rpm

Далее запускаем dnstop и смотрим за статистикой.


# dnstop eth0

Модуль 12. Система мониторинга Nagios. 171


В момент когда dnstop запущен можно нажимать на специальные клавиши и
смотреть статистику различного рода.
Основные кнопки:
s — показать таблицу с адресами источников запросов;
d — показать таблицу с пунктами назначения запросов, куда они передаются;
t — показывать статистику по типам запросов;
Другие опции в документации dnstop
# man dnstop

Мониторинг
р соединений proftpd
p p в рреальном времени
р
# ftptop

Статистика по виртуальной
р у памяти
# vmstat

Статистика по процессору
р ц ру и устройствам
у р ввода-вывода
Ставим пакет sysstat (содержит в себе программы sa, mpstat, iostat, sar)
# yum -y install sysstat

Информация по вводу-выводу
# iostat
Информация по процессору
# mpstat

Резюме
Мы разобрали систему мониторинга Nagios, это одна из самых
популярных систем для мониторинга большего количества серверов.
Также познакомились с различными инструментами, которые помогут в
администрирование вашего сервера.

Домашнее задание
Настройте систему мониторинга Nagios и поставьте на мониторинг пару
серверов.

172 Модуль 12. Система мониторинга Nagios.


BIND

BIND – это пакет содержащий программное обеспечение для построения


DNS-сервера.
DNS-сервер позволяет преобразовывать доменные имена к IP-адресам и
наоборот.
Работа в компьютерных сетях происходит с IP-адресами (уникальный
идентификатор) но запомнить все нужные IP-адреса не представляется
возможным и здесь на помощь приходит DNS-сервер, который позволяет
обращаться к хосту по имени.

Установка
Пакет bind-chroot содержит необходимую структуру каталогов для chroot-
окружения, пакет caching-nameserver содержит все необходимые файлы. Все
остальное, что понадобится в работе будет установлено как зависимости.

Ставим нужные пакеты


# yum -y install bind-chroot caching-nameserver

Добавляем автозагрузку при старте сервера


# chkconfig named on

Инструменты
Для отладки своих DNS-серверов будут очень полезны следующие утилиты.

nslookup Позволяет производить запросы к DNS-серверу и


запрашивать любые записи. По умолчанию запрашивается
только запись A, чтобы запросить все записи для ya.ru
наберите:
# nslookup -type=any ya.ru

dig Схожая по работе с nslookup утилита. Что бы запросить все


записи для ya.ru у DNS-сервера ns1.yandex.ru наберите:
# dig ya.ru @ns1.yandex.ru any

Модуль 13. DNS-сервер. BIND. 173


Базовые понятия
Зона – логический узел в системе доменных имен. Файл-зоны содержит всю
информацию по какому либо домену и его записям. Управление зоной можно
передать другому человеку, такой процесс называется делегированием.
Домен – это название зоны в системе доменных имен. Название домена
Д
читается слева направо, от младших доменов к старшим.
Поддомен
дд – это имя подчиненной зоны. Например mail.example545.com
является поддоменом example545.com. example545.com – это домен второго
уровня, mail.example545.com – домен третьего уровня.
Относительное имя домена
д – к имени этой записи будет добавлен основной
домен в которой она находится.
FQDN
Q – полностью определенное доменное имя. В файле зоны это запись
с точкой в конце доменного имени, которая говорит что имя полностью
описано и нечего с ним делать больше не нужно.
resolver – программа-клиент. Она вступает в работу когда пользователь
пытается получить информацию от DNS-сервера. Файл конфигурации
резолвера - /etc/resolv.conf
р (query) – запрос от клиента к серверу. Существует два типа
DNS-запрос
запросов.

1. Рекурсивный – при получение рекурсивного запроса сервер должен


опросить другие сервера (если нужной информации нет в своем кэше) и
вернуть клиенту уже готовый ответ. С использованием рекурсивных запросов
достигается лучшая производительность. Так как количество запросов к DNS-
серверу заметно снижается. В свою очередь обработка запросов к другим
DNS-серверам происходит вдали от вашей сети и никаких мощностей от
вашего DNS-сервера не требует (трафик, процессорное время);
2. Итеративный – в случае получения такого запроса, DNS-сервер
просматривает свой кэш и выдает наилучший ответ из имеющихся у
него. Это может быть ссылка на другой DNS-сервер. Далее клиент сам
продолжает резолвинг нужного доменного имени. Не знаю точно как
сейчас, но раньше не все веб-браузеры умели обрабатывать итеративные
запросы.

Правила построения DNS-системы


При построение своей DNS-системы вам будет необходимо придерживаться
некоторого набора правил.

174 Модуль 13. DNS-сервер. BIND.


1. Для каждой зоны должны быть не менее двух DNS-серверов, один master-
сервер и один slave-сервер;
2. DNS-сервера должны быть в разных сетях класса C, что должно
гарантировать работоспособность сервиса в случае потери связи одного
из сегментов сети в котором находится DNS-сервер.

Режимы работы ДНС-серверов


Существует несколько режимов в которых может работать DNS-сервер.
Конечно самая распространенная связка – это Master/Slave.
Master DNS-сервер
р р – главный DNS-сервер для зоны, только он имеет право
вносить в нее изменения, другие могут получать и хранить у себя, отдавая на
запросы клиентов. Здесь ключевое отличие в возможности редактировать
файл зоны, изменять список NS-серверов для нее и прочие записи.
Slave DNS-сервер
р р – вторичный DNS-сервер для зоны, их может
быть несколько. Основное предназначение вторичного сервера –
подстраховывать первичный (Master server) сервер (в случае, если он станет
временно недоступен) и снижать нагрузку обрабатывая часть запросов.
Он обслуживает запросы наравне с первичным сервером, также являясь
авторитативным для зоны и пользователю должно быть все равно с какого
DNS-сервера получать информацию. Slave-сервер не может вносить
изменения в конфигурацию зоны.
Кэширующий
ру щ DNS-сервер
р р – такой сервер не является авторитативным
для какой либо зоны. Серверы данного вида используют для организации
централизованного кэширования соответствий доменных имен и IP-
адресов. Идея организации кэширующего сервера состоит в том, чтобы не
искать соответствие доменного имени и IP-адреса в сети, а накапливать их в
своем локальном кэше и обслуживать оттуда запросы клиентов.

# nslookup www.ru
Server: 192.168.146.2
Address: 192.168.146.2#53
Non-authoritative answer:
Name: www.ru
Address: 194.87.0.50

Строка “Non-authoritative answer” говорит о том, что ответ мы получили из


кэша неавторитативного сервера.

Модуль 13. DNS-сервер. BIND. 175


Корневые
р DNS-сервера
р р - сервера, которые обслуживают корневую зону (Root
servers). Их место в получении отклика на запрос к системе доменных имен
ключевое. Именно к одному из корневых серверов обращается локальный
сервер доменных имен, если не находит в зоне своей ответственности или в
своем кэше соответствия между доменным именем и IP-адресом.

Посмотреть корневые сервера можно вот так:


# dig . ns @198.41.0.4
; <<>> DiG 9.3.4-P1 <<>> . ns @198.41.0.4
; (1 server found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51497
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14

;; QUESTION SECTION:
;. IN NS

;; ANSWER SECTION:
. 518400 IN NS K.ROOT-SERVERS.NET.
. 518400 IN NS B.ROOT-SERVERS.NET.
. 518400 IN NS D.ROOT-SERVERS.NET.
. 518400 IN NS A.ROOT-SERVERS.NET.
. 518400 IN NS M.ROOT-SERVERS.NET.
. 518400 IN NS G.ROOT-SERVERS.NET.
. 518400 IN NS C.ROOT-SERVERS.NET.
. 518400 IN NS E.ROOT-SERVERS.NET.
. 518400 IN NS J.ROOT-SERVERS.NET.
. 518400 IN NS L.ROOT-SERVERS.NET.
. 518400 IN NS I.ROOT-SERVERS.NET.
. 518400 IN NS F.ROOT-SERVERS.NET.
. 518400 IN NS H.ROOT-SERVERS.NET.

;; ADDITIONAL SECTION:
A.ROOT-SERVERS.NET. 3600000 IN A 198.41.0.4
A.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:503:ba3e::2:30
B.ROOT-SERVERS.NET. 3600000 IN A 192.228.79.201
C.ROOT-SERVERS.NET. 3600000 IN A 192.33.4.12
D.ROOT-SERVERS.NET. 3600000 IN A 128.8.10.90
E.ROOT-SERVERS.NET. 3600000 IN A 192.203.230.10
F.ROOT-SERVERS.NET. 3600000 IN A 192.5.5.241
F.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:500:2f::f
G.ROOT-SERVERS.NET. 3600000 IN A 192.112.36.4
H.ROOT-SERVERS.NET. 3600000 IN A 128.63.2.53
H.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:500:1::803f:235

176 Модуль 13. DNS-сервер. BIND.


I.ROOT-SERVERS.NET. 3600000 IN A 192.36.148.17
J.ROOT-SERVERS.NET. 3600000 IN A 192.58.128.30
J.ROOT-SERVERS.NET. 3600000 IN AAAA 2001:503:c27::2:30

;; Query time: 233 msec


;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Apr 8 10:51:26 2009
;; MSG SIZE rcvd: 500

Stealth DNS-сервер
р р (невидимый DNS-сервер) – такой DNS-сервер не
упоминается в описание зоны. Информацию о нем нельзя получить прямыми
запросами или копированием описания зоны. Данный тип сервера может
быть полезен для внесения изменений в зону находясь за файрволом. В
этом случае primary master можно сделать невидимым, а все остальные, в
том числе и заявленные при регистрации домена, slave-серверами зоны.
Это позволяет нейтрализовать атаки на зону, т.к. обновление всегда будет
производиться с “невидимого” primary master.

Типы ответов DNS-серверов


Авторитативный ответ (authoritative response ) - такой ответ возвращают
сервера которые являются ответственными за зону.
Неавторитативный ответ (non authoritative response) - возвращают серверы,
которые не отвечают за зону. Необходимую информацию они получают из
своего кэша или после нерекурсивного запроса к авторитативному DNS-
серверу.

Виды запросов к DNS-серверу


Прямой запрос (forward) – это запрос на преобразование имени хоста в IP-
адрес. Думаю это самый распространенный запрос.
Обратный запрос (reverse) – это запрос на преобразование IP-адреса хоста
в доменное имя. Почтовые сервера любят проверять наличие этой записи,
что в свою очередь помогает бороться со спамом.

Способы копирования зоны с master-сервера


Slave-сервер сам по себе не вносит какие либо изменения в файл-зоны,
он просто копирует ее с master-сервера по истечению интервала жизни
зоны (значение TTL) или когда получает уведомление о том, что были
внесены изменения на master-сервере и нужно обновить ее у себя, чтобы

Модуль 13. DNS-сервер. BIND. 177


оперировать с актуальной копией. Так вот существует два механизма
получения обновлений с master-сервера.

AXFR - полное копирование зоны.

IXFR – инкрементальное копирование зоны, когда копируются только


измененные данные а не весь файл целиком.

Перед продолжение хочу обратить внимание на некоторые моменты. Как


уже говорилось slave-сервер копирует зону с master-сервера, То есть с
сервера который является авторитативным для зоны. Но slave-сервер и сам
может являться авторитативным и в этом случае он будет выступать master-
сервером для того кто с него копирует зону. Для того чтобы точно описать
сервер, который является авторитативным для зоны и который больше не
получает обновлений для нее, был введен термин primary master. Primary
master находится в корне всех процедур копирования и именно на нем
происходит ручное изменение зоны. Такой сервер может быть только один
для зоны.

За своевременное информирование slave-серверов о необходимости


обновить свои данные отвечает механизм DNS NOTIFY. Принцип его работы
не сложный.

1. Мы вносим изменения в зону на primary master увеличив значение поля


serial на единицу;
2. После перезагрузки конфигурации primary master-сервера, он оповещает
все свои slave-сервера об изменениях;
3. Slave-сервер запрашивает описание зоны с primary master-сервера и
смотрит версию описания зоны, если версия отличается от его (больше)
то он инициирует процесс обновления зоны;
4. После завершения обновления, slave-сервер посылает оповещение на
все ему известные авторитативные сервера для этой зоны.

178 Модуль 13. DNS-сервер. BIND.


Виды записей
SOA Start of Authority. Начальная запись зоны, здесь указывают
административный контакт и рабочие параметры зоны.
# nslookup -type=SOA ya.ru
Server: 127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
ya.ru
origin = ns1.yandex.ru
mail addr = sysadmin.yandex.ru
serial = 2009040300
refresh = 10800
retry = 900
expire = 2592000
minimum = 900

Authoritative answers can be found from:


ya.ru nameserver = ns1.yandex.ru.
ya.ru nameserver = ns5.yandex.ru.

origin – первичный сервер зоны, ее primary master;


mail addr – e-mail администратора зоны, обращаю внимание
что вместо @ нужно указывать точку;
serial – номер версии зоны, с каждым внесением изменений
в зону не забывайте увеличивать это число на еденицу!
Тогда slave-сервер сразу обновить ее у себя. Чтобы проще
было ориентироваться используйте номер в таком формате
<год><месяц><день><какое по счету изменение за день>,
таким образом номер всегда будет только возрастать;
refresh – интервал в секундах, через который вторичный
сервер будет проверять необходимость обновления зоны;
retry – интервал в секундах, через который вторичный
сервер будет повторять обращения в случае неудачи;
expire – интервал в секундах, через который вторичный
сервер будет считать информацию о зоне устаревшей и
перестанет ее использовать;
minimum – значение времени жизни записи на кэширующих
серверах.

Модуль 13. DNS-сервер. BIND. 179


NS Name server. Указывает на DNS-сервер для данного
домена;
А Запись связывает имя хоста с IP-адресом;
AAAA Запись связывает имя хоста с IP-адресом протокола IPv6;
MX Mail Exchange. Адрес почтового сервера для этого домена.
# nslookup -type=MX ya.ru
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
ya.ru mail exchanger = 10 mx1.yandex.ru.
ya.ru mail exchanger = 10 mx2.yandex.ru.
10 – это приоритет использования почтового сервера. Чем меньше
цифра, тем больше шансов что будет выбран именно этот сервер.
PTR Pointer. Указать служит для обратного преобразования,
То есть по IP-адресу узнаем доменное имя. Для обратного
преобразования используется зона in-addr.arpa а IP-адрес
записывается справа налево. Скорее всего данный тип
записи пропишет для вас провайдер. Рекомендуется для
нормальной работы почтовых серверов.
# nslookup -type=PTR 213.180.204.8
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
8.204.180.213.in-addr.arpa name = ya.ru.
CNAME Canonical Name. Псевдоним который ссылается на другую
запись.
# nslookup -type=CNAME ns1.ya.ru
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
ns1.ya.ru canonical name = corba-http5.yandex.ru.
TXT Текст, который содержит любую информацию. Используется редко;
HINFO Может содержать некоторую информацию о хосте,
например тип процессора и ОС. Используется редко;
RP В этой записи указывается ответственная персона (его
e-mail). Используется редко.

180 Модуль 13. DNS-сервер. BIND.


Структура конфигурационного файла
Структуру конфигурационного можно представить как набор секций. В
таблице ниже я расскажу какие секции бывают и для чего они нужны.
options Секция описывает глобальное поведение DNS-сервера,
значения можно переназначить внутри других секций;
logging Секция описывает режим журналирования, если на сервере
используется syslog то эта секция должна присутствовать;
zone Секция описывает зону которую данный DNS-сервер будет
поддерживать;
acl Access Control Lists, позволяет описать какую либо группу
хостов а далее, при конфигурирование, уже ссылаться на эту
группу;
controls Описывает доступ к удаленному управлению DNS-сервером
через rndc;
include Позволяет подключить дополнительный файлы
конфигурации;
key Секция описывает ключи, используемые для аутентификации
и контроля операций с Dynamic DNS и удаленного
управления;
lwres Секция описывает свойства DNS-сервера когда он запущен
как легковесный резолвер;
server Здесь описываются опции, которые DNS-сервер будет
использовать при взаимодействие с другим сервером;
view Позволяет описать поведение сервера для конкретных
хостов/сетей;
trusted-keys Описывает доверенные ключи для домена.

Ну и базовая структура может выглядеть вот так:


options
{
...
};

logging
{
...
};

acl
{
...

Модуль 13. DNS-сервер. BIND. 181


};

zone
{
...
};

Настройка
Итак, у нас есть следующее:
Сервер с IP 192.168.146.2 – шлюз во внешние сети и DNS-сервер для двух
наших сетей (192.168.146.0/24, 192.168.147.0/24);
Сервер с IP 192.168.146.132 – новый сервер со свежей Linux CentOS 5.2
который мы сделаем как master dns сервер, также этот сервер будет
перенаправлять все запросы на которые не сможет сам ответить на DNS-
сервер провайдера (192.168.146.2);
Сервер с IP 192.168.147.132 – новый сервер со свежей Linux CentOS 5.2
который мы сделаем как slave dns сервер для 192.168.146.132.
Настраивать named рекомендуется в chroot-окружение, это когда для
сервиса создана своя рабочая среда в рамках которой он работает. Он
нечего не знает о внешней системе и не может туда выбраться, и в случае
проблем с безопасностью это никак не повлияет на систему в целом. Для
этих целей мы и поставили пакет bind-chroot.
По умолчанию, если не найден файл /var/named/chroot/etc/named.conf то
будет использоваться /var/named/chroot/etc/named.caching-nameserver.conf
Я предпочел скопировать шаблон файла named.conf и на его основе сделать
свой файл.
# cp /usr/share/doc/bind-9.3.4/sample/etc/named.conf /var/named/chroot/etc/
Ключевые файлы и каталоги пакета BIND в таблице ниже.
/var/named/chroot/ Структура файловой системы и файлы которые
будут использоваться в работе chrooted-bind, все
что нужно редактируйте здесь;
/usr/sbin/named Исполняемый файл DNS-сервера;
/var/named/chroot/etc/named.conf В нормальных условиях конфигурационный файл
named.conf расположен в /etc/ но мы настраиваем
DNS-сервер в chroot-окружение и поэтому он будет
расположен здесь, чтобы named смог его найти;

182 Модуль 13. DNS-сервер. BIND.


/var/named/ Все нужные файлы для работы named
расположены здесь и в подкаталогах;
/usr/sbin/rndc Утилита для управления named;
/usr/sbin/named-checkzone Утилита для проверки корректности файла зоны;
/usr/sbin/named-checkconf Утилита для проверки корректности
конфигурационного файла;
/etc/rc.d/init.d/named Скрипт для chkconfig, при установке из
репозитория нечего с ним делать не нужно;
/etc/sysconfig/named Здесь можно задать некоторые опции с которыми
будет стартовать named;
/usr/share/doc/bind-9.3.4/ Документация.

Файл /var/named/chroot/etc/named.conf
options
{
directory «/var/named»;
dump-file «data/cache_dump.db»;
statistics-file «data/named_stats.txt»;
memstatistics-file «data/named_mem_stats.txt»;
version «Made in USSR»;
listen-on {localhost; 192.168.146.132; };
allow-transfer{192.168.147.132; };
allow-query{trusted-networks; };
allow-recursion {trusted-networks; };
forwarders {192.168.146.2; };
};

logging
{

channel default_ch {
file «data/named-base.log»;
severity info;
print-time yes;
print-category yes;
};

channel security_ch {
file «data/named-security.log»;
severity info;
print-time yes;
print-category yes;
};

category default { default_ch; };

Модуль 13. DNS-сервер. BIND. 183


category security { security_ch; };

};

acl «trusted-networks» {localhost; 192.168.146.0/24; 192.168.147.0/24; };

zone «example545.com» IN {
type master;
file «example545.com»;
};

zone «168.192.in-addr.arpa» {
type master;
file «168.192.rev»;
};

include «/etc/named.rfc1912.zones»;

Файл зоны example545.com


p
((все ф
файлы зон ррасположены в /var/named/chroot/var/named))
@ IN SOA ns1.example545.com. support.example545.com. (
1 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire
86400 ; ttl
)

IN NS ns1.example545.com.
IN NS ns2.example545.com.
IN MX 10 mail.example545.com.

@ IN A 192.168.146.132
ns1 IN A 192.168.146.132
ns2 IN A 192.168.147.132
mail IN A 192.168.146.132
www IN A 192.168.146.132

Файл обратных зон для нашей сети 192.168.146.0/24 будет таким:


@ IN SOA ns1.example545.com. support.example545.com. (
1 ; serial
28800 ; refresh
7200 ; retry
604800 ; expire

184 Модуль 13. DNS-сервер. BIND.


86400 ; ttl
)

IN NS ns1.example545.com.
IN NS ns2.example545.com.
132.146 IN PTR example545.com.

Если сервер запускаем первый раз то выполняем команду


# service named start

Если он уже работает и обслуживает зоны то будет достаточно перезагрузить


файл конфигурации.
# rndc reload

Теперь поговорим про файл зоны.


IN NS ns1.example545.com. - указываем наш NS-сервер для этого домена,
нужно указать хотя бы два сервера, IN – означает Internet;
IN MX 10 mail.example545.com. - указываем почтовый сервер для этого
домена, куда отправлять почту предназначенную для этого домена;
@ IN A – запись А для нашего домена. @ – ссылка на имя нашего домена,
можно было написать “example545.com. IN A 192.168.146.132” а можно вот
так.

Далее идут относительные записи А, относительные значит что к этому


имени прибавиться еще основная часть. В результате, например, получится
mail.example545.com и www.example545.com

Если мы не хотим чтобы к имени что либо добавлялось, нужно явно показать
что это имя является FQDN, То есть полностью описанным. Для этого после
имени нужно поставить точку. Давайте в нашем файле зоны example545.com
уберем точку в строке
“IN MX 10 mail.example545.com.”, перезагрузим конфигурационный
файл командой rndc reload и сделаем запрос к DNS-серверу:
# dig example545.com @ns1.example545.com any
;; ANSWER SECTION:
...
example545.com. 43200 IN MX 10 mail.example545.com.example545.com.
...

Модуль 13. DNS-сервер. BIND. 185


Видите, добавилась основная часть имени домена и получилось “mail.
example545.com.example545.com.”, что конечно же не правильно.

Ну и попробуем по IP-адресу получить доменное имя:


# nslookup 192.168.146.132
Server: 192.168.146.132
Address: 192.168.146.132#53
132.146.168.192.in-addr.arpa name = example545.com.

Опции конфигурационного файла


Секция options – глобальные конфигурационные опции;
directory Опция задает каталог где располагаются файлы
необходимые для работы named;
dump-file Опция задает расположение файла с кэшем DNS-
сервера;
statistics-file Опция задает расположение файла с статистикой;
memstatistics-file Опция задает расположение файла со статистикой по
использованию памяти;
version Здесь указываем значение переменной version которое будет
отдаваться клиентам в ответ на их запрос версии сервера;
listen-on Здесь указываем порты и IP-адреса на которых named
будет принимать входящие запросы;
allow-transfer Здесь указываем список IP-адресов которым разреша-
ется передавать зону, указываем здесь slave-сервера;
allow-query Здесь указываем сети запросы из которых наш DNS-
сервер будет обслуживать;
allow-recursion Здесь указываем сети рекурсивные запросы которых
наш DNS-сервер будет обслуживать;
forwarders Если наш DNS-сервер не сможет ответить на запрос
то он его перенаправит серверам, указанным в этой
опции. Обычно, запросы перенаправляют DNS-
серверам провайдера, они обслуживают сети в
которых вы работаете и всегда помогут.
Секция logging – журналирование работы DNS-сервера;
channel Указываем название канала логирования;
file Путь к файлу в который будет записываться
информация из этого канала;

186 Модуль 13. DNS-сервер. BIND.


severity это уровень важности;
print-time указывать время в логах или нет;
print-category регистрировать категории или нет;
category Какие категории в какие каналы пишем.
Секция zone – определение зоны;
zone Указываем название зоны;
type Тип зоны, на primary master пишем master, на slave-
сервере – slave;
file Расположение файла зоны.

В подключенном файле named.rfc1912.zones находятся служебные зоны,


делать с файлом нечего не нужно.

Не забываем, поскольку наш DNS-сервер будет выполняться в chroot-


окружение то его log-файлы будут расположены в
/var/named/chroot/var/named/data

DNS-сервер готов. Теперь на любом клиенте в доверенных сетях в файл /etc/


resolv.conf прописываем наш DNS-сервер и пользуемся.
# cat /etc/resolv.conf
nameserver 192.168.146.132

Slave-сервер
Slave-сервер настраивается точно также как и master за исключением пары
опций в секции zone. Ниже я приведу мою конфигурацию и пояснения.

Ставим нужные пакеты


# yum -y install bind-chroot caching-nameserver

Добавляем в автозагрузку
# chkconfig named on
/var/named/chroot/etc/named.conf
options
{
directory «/var/named»;
dump-file «data/cache_dump.db»;
statistics-file «data/named_stats.txt»;

Модуль 13. DNS-сервер. BIND. 187


memstatistics-file «data/named_mem_stats.txt»;
version «Made in USSR»;
listen-on {localhost; 192.168.147.132; };
allow-transfer{none; };
allow-query{trusted-networks; };
allow-recursion {trusted-networks; };
forwarders {192.168.146.132; };
};

logging
{

channel default_ch {
file «data/named-base.log»;
severity info;
print-time yes;
print-category yes;
};

channel security_ch {
file «data/named-security.log»;
severity info;
print-time yes;
print-category yes;
};

category default { default_ch; };


category security { security_ch; };

};

acl «trusted-networks» {localhost; 192.168.146.0/24; 192.168.147.0/24; };

zone «example545.com» IN {
type slave;
file «slaves/example545.com»;
masters {192.168.146.132; };
};

include «/etc/named.rfc1912.zones»;

Как видите все почти тоже самое. Трансфер зоны мы делать не будем,
потому что в нашей сети больше нет серверов кому ее можно передать, а
master-серверу ее передавать бессмысленно, он является primary master-
ом для зоны. Все запросы на которые не сможем ответить сами, мы
переадресуем master-серверу (он если не сможет ответить то переадресует

188 Модуль 13. DNS-сервер. BIND.


на 192.168.146.2).
Ну и ключевое:
type slave; - выполнять роль slave-сервера для этой зоны;
masters – список master-серверов с которых ее можно получить;
# rndc reload

Посмотрим наш log-файл /var/named/chroot/var/named/data/named-base.log


general: zone example545.com/IN: Transfer started.
xfer-in: transfer of 'example545.com/IN' from 192.168.146.132#53: connected using
192.168.147.132#40241
general: zone example545.com/IN: transferred serial 1
xfer-in: transfer of 'example545.com/IN' from 192.168.146.132#53: end of transfer
notify: zone example545.com/IN: sending notifies (serial 1)
Slave-сервер готов.

Неавторитативный ответ
Наш DNS-сервер не поддерживает зону ya.ru поэтому не может дать
авторитативный ответ. Он всего лишь сообщает клиенту то, что узнал
от других DNS-серверов. Такой ответ будет неавторитативным и будет
содержать строку Non-authoritative answer в своем ответе. А узнавать наш
DNS-сервер будет у тех кто перечислен в опции forwarders, То есть кому
перенаправлять запросы с которыми мы сами не справились.

# nslookup ya.ru
Server: 192.168.146.132
Address: 192.168.146.132#53

Non-authoritative answer:
Name: ya.ru
Address: 213.180.204.8

Авторитативный ответ
В этом примере ответ будет авторитативный - мы обращаемся с запросом к
нашему DNS-серверу который обслуживает эту зону.

# nslookup example545.com
Server: 192.168.146.132

Модуль 13. DNS-сервер. BIND. 189


Address: 192.168.146.132#53
Name: example545.com
Address: 192.168.146.132

Записи в /etc/resolv.conf
Файл /etc/resolv.conf служит не только для указания NS-серверов. Есть еще
пара интересных опций на мой взгляд.
domain – указав домен мы будем производить поиск хостов в этом домене
по коротким именам, это удобно. Например “domain example545.com”.
Выполнив команду “nslookup server10” мы произведем поиска хоста server10
в домене example545.com, То есть если существует хост server10.example545.
com то мы получим положительный ответ.
search – более функциональный механизм, он позволяет задать список
доменов в котором мы будем искать свой хост по короткому имени и
порядок поиска. Например:
search office.example545.com outsorcers.example545.com
Сначала ищем в office.example545.com и если не находим то переключаемся
на поиск в outsorcers.example545.com. Поиск происходит до первого
совпадения, если нечего не найдено то возвращается сообщение об
ошибке.

Статистика работы
Статистику работы можно посмотреть вот так:
# rndc status
number of zones: 7
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/1000
tcp clients: 0/100
server is up and running

number of zones – число поддерживаемых зон этим DNS-серверов;


debug level – уровень отладки debug;

190 Модуль 13. DNS-сервер. BIND.


xfers running – сколько сейчас зон передается;
xfers deffered – сколько передач зон отложено;

soa queries in progress – сколько происходит запросов soa-записей в


настоящий
момент;

query logging is OFF – журналирвоание запросов отключено;

recursive clients – число обрабатываемых рекурсивных запросов;

tcp clients – сколько клиентов;

server is up and running – сервер запущен и функционирует.

Еще один инструмент мониторинга DNS – программа dnstop. Я о ней подробнее на-
писал в модуле “Резервное копирование”. Поставить ее можно из репозитария EPEL.

Резюме
В этом модуле мы выяснили как работает DNS-сервер и как он взаимодействует
с другими серверами. Разобрались с записями в файле зоны и опциями в
конфигурационном файле named.conf. Это далеко не все опции которые
бывают, но в случае необходимости без проблем сможете “докрутить” DNS-
сервер под свои нужды, так как знаете о нем достаточно чтобы эффективно
администрировать его. По опыту скажу, что что-то большее может
потребоваться только в крупных сетях с нагруженными серверами, и даже в
этом случае чего-то сверх-ординарного от вас не потребуется.

Домашнее задание
Сделайте 4 виртуальные машины. На двух делаем DNS-сервера – master и
slave, на двух других достаточно будет просто Linux, они будут клиентам.
Пусть первый клиент выполняет запросы через master, второй через slave.
Slave работает через master, master смотрим в Интернет через вашего
провайдера. Заведите зону (а лучше несколько) на master-сервере и
убедитесь что она передана на slave. Ваши сервера могут быть из одной
сети - правило разных сетей класса C действует в публичных сетях, в своей
песочнице делайте как хотите.

Модуль 13. DNS-сервер. BIND. 191


Nginx

Nginx (engine x) — это очень быстрый HTTP сервер, который часто


используют вместо или совместно с Apache, чтобы снизить нагрузку на
сервер и увеличить скорость обработки запросов посетителей.
Что сам автор говорит о Nginx:
“Я начал разрабатывать nginx весной 2002 года, а осенью 2004 года вышел
первый публично доступный релиз. На данный момент nginx работает на
нескольких достаточно нагруженных сайтах под FreeBSD и Linux, в том числе
на большинстве серверов Рамблера, и я рассматриваю версию nginx-0.6.35
как стабильную с точки зрения надёжности. Однако функциональность
некоторых модулей будет меняться, вследствие чего, будут меняться
и директивы, поэтому обратной совместимости до версии 1.0.0 не
гарантируется.”

Преимущества Nginx
Модульная архитектура Apache предоставляет большие возможности,
однако они редко когда полностью востребованы. Ценой за большую
функциональность является большой расход системных ресурсов. В массе
своей сайты содержат больше статических объектов (HTML, изображения,
файлы стилей) для обработки которых не нужен большой функционал.
Запросы являются простыми и следовательно обрабатывать такие запросы
нужно простым и легковесным веб-сервером, таким как Nginx. К примеру, 10
000 неактивных keep-alive соединений занимают примерно 2.5 Мб памяти.

Варианты использования Nginx

standalone
Самая легкая в настройке конфигурация. Nginx и Apache работают на разных
портах или ip-адресах. Например, адрес всех картинок images.server.ru, этот
сервер в свою очередь является Nginx-серверов. Следовательно запросы
картинок и прочего статического контента направляются на Nginx-сервер.
Если запросов статического контента очень много, то имеет смысл купить
отдельный сервер под его обслуживание и поставить на него Nginx.

Frontend к Apache
p
Так называемое “акселерированное проксирование ” при котором
все запросы сначала направляются на Nginx. Если происходит запрос

192 Модуль 14. HTTP сервер: Nginx.


статического контента то Nginx сам его обрабатывает, если запрос скрипта
то он переадресовывается к Apache.

Nginx
g + FastCGI
Если скрипты сайта написаны на языке программирования интерпретатор
которого понимает технологию FastCGI то Apache нам вообще не нужен.
Примерами таких языков являются Perl, PHP и многие другие. Минус этого
способа – возможно потребуется модификация скриптов.

Установка EPEL
В базовых репозиториях CentOS 5.2 Nginx отсутствует. Для того чтобы его
поставить из пакета нам нужно подключить репозиторий EPEL.
EPEL - Extra Packages for Enterprise Linux, репозиторий поддерживаемый
добровольцами и содержащий в себе популярные и нужные пакеты. На
момент написания этих строк репозиторий содержал в себе примерно 2800
пакетов.

Посмотрим что содержит в себе rpm-пакет


# rpm -qpl http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-
5-3.noarch.rpm
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL
/etc/yum.repos.d/epel-testing.repo
/etc/yum.repos.d/epel.repo
/usr/share/doc/epel-release-5
/usr/share/doc/epel-release-5/GPL

То есть по сути просто файл .repo который содержит в себе ссылку на новый
репозиторий.

Ставим EPEL-пакет
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-
5-3.noarch.rpm

Проверяем список репозиториев


# yum repolist

Модуль 14. HTTP сервер: Nginx. 193


Установка Nginx с поддержкой PHP. Настраиваем связку Nginx + FastCGI.
Установка Nginx
g и сопутствующих
у у щ сервисов.
р
Сам по себе Nginx не умеет обрабатывать php-скрипты. Для этого нужно
запустить php в режиме FastCGI-сервер и все запросы *.php направлять на
него.

Устанавливаем Nginx
# yum -y install nginx

Добавляем в автозагрузку при старте сервера


# chkconfig nginx on

Ставим пакет php-cli который содержит в себе php-cgi. Он то и будет


обрабатывать наши php-скрипты.
# yum -y install php-cli

Устанавливаем CGI-сервер spawn-fcgi (входит в комплект поставки lighttpd)


# yum -y install spawn-fcgi

Запускаем CGI-сервер на порту 9000


# spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi

Проверяем, слушает ли CGI-сервер нужный наш порт


# netstat -nlp | grep :9000
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 6395/php-cgi

Готовим скрипт автоматизации работы spawn-fcgi


# cat /etc/rc.d/init.d/spawn-fcgi

#!/bin/bash
# chkconfig: - 80 20
# description: Starts and stops FastCGI server for Nginx
SPAWN=»/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi»
RETVAL=0
case «$1» in
start)

194 Модуль 14. HTTP сервер: Nginx.


$SPAWN
RETVAL=$?
;;
stop)
killall -9 php-cgi
RETVAL=$?
;;
*)
echo «Usage: spawn-cgi {start|stop}»
exit 1
;;
esac
exit $RETVAL

Добавляем spawn-fcgi в автозагрузку при старте сервера


# chkconfig spawn-fcgi on

Устанавливаем правильные права на скрипт


# chmod 755 /etc/init.d/spawn-fcgi

Мы настроили доступ к репозиторию EPEL, который содержит в себе массу


полезных пакетов. Установили Nginx, PHP и spawn-fcgi который будет
предоставлять FastCGI-сервис на нужном порту. Также написали скрипт
автоматизации запуска и управления spawn-fcgi. Для других пакетов в этом
нет необходимости так как все есть.

Конфигурирование Nginx + FastCGI


Файлы Nginx и их расположение.
/var/log/nginx/ логи Nginx;
/usr/sbin/nginx программа Nginx;
/usr/share/nginx файлы веб-сервера;
/etc/rc.d/init.d/nginx скрипт запуска Nginx;
/etc/logrotate.d/nginx политика ротации логов для Logwatch;
/etc/nginx/ каталог с конфигурационными файлами Nginx;
/etc/sysconfig/nginx это файл содержащий в переменной путь к
основному; конфигурационному файлу Nginx;
/etc/php.ini файл с настройками PHP;
/etc/php.d/ дополнительные файлы настроек для PHP.

Наш файл nginx.conf будет таким:

Модуль 14. HTTP сервер: Nginx. 195


# cat /etc/nginx/nginx.conf
user nginx;
worker_processes 1;

# [ debug | info | notice | warn | error | crit ]


error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
use epoll;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '


'»$status» $body_bytes_sent «$http_referer» '
'»$http_user_agent» «$http_x_forwarded_for»';

access_log /var/log/nginx/access.log main;

client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;

client_header_buffer_size 1k;
large_client_header_buffers 4 4k;

gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;

output_buffers 1 32k;
postpone_output 1460;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 60;

include /etc/nginx/conf.d/*.conf;

196 Модуль 14. HTTP сервер: Nginx.


server {
listen 80;
server_name company.ru www.company.ru;

location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
ssi on;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location /status {
stub_status on;
access_log off;
allow 192.168.146.1;
deny all;
}

error_page 404 /404.html;


location = /404.html {
root /usr/share/nginx/html;
}

error_page 500 502 503 504 /50x.html;


location = /50x.html {
root /usr/share/nginx/html;
}

location /old_dir/ {
rewrite ^/old_dir/(.*)$ /new_dir/$1 permanent;
}

location ~ /\.ht {
deny all;
}
}

# Virtual host company2.ru


server {
listen 80;
server_name company2.ru www.company2.ru;

Модуль 14. HTTP сервер: Nginx. 197


access_log /var/log/nginx/company2.access.log;
error_log /var/log/nginx/company2.error.log error;

location / {
root /home/company2.ru;
index index.html index.php;
}

error_page 404 /404.html;


location = /404.html {
root /usr/share/nginx/html;
}

error_page 500 502 503 504 /50x.html;


location = /50x.html {
root /usr/share/nginx/html;
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/company2.ru$fastcgi_script_name;
include fastcgi_params;
}
}
}

# service nginx start

Понижаем нагрузку на основной веб-сервер.


Установка Nginx как Frontend к Apache.
Принцип работы будет заключаться в следующем. Nginx работая на порту
80 будет принимать все запросы к веб-серверу. В соответствие со своим
списком расширений он будет отдавать статику, все остальные запросы
будет направлять к Apache который работает на порту 8080 (в моем случае
на том же сервере). Если Apache и Nginx работают на одном сервер то можно
писать как “Listen 127.0.0.1:8080”, в этом случае кроме Nginx доступ к веб-
серверу Apache больше никто не получит.

Устанавливаем Apache
# yum -y install httpd httpd-devel

198 Модуль 14. HTTP сервер: Nginx.


Добавляем httpd в автозагрузку
# chkconfig httpd on

В конфигурационном файле /etc/httpd/conf/httpd.conf меняем директиву


Listen 80 на Listen 127.0.0.1:8080 (или какой там у вас IP-адрес) Другие
настройки – по вашему желанию.
Listen 127.0.0.1:8080

Устанавливаем php. Настройки по вашему желанию.


# yum -y install php

Устанавливаваем Nginx
# yum -y install nginx

Добавляем Nginx в автозагрузку


# chkconfig nginx on

Конфигурирование Nginx
user nginx;
worker_processes 1;

# [ debug | info | notice | warn | error | crit ]


error_log /var/log/nginx.error_log info;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
use epoll;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '


'»$status» $body_bytes_sent «$http_referer» '
'»$http_user_agent» «$http_x_forwarded_for»';

access_log /var/log/nginx/access.log main;

Модуль 14. HTTP сервер: Nginx. 199


client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;

client_header_buffer_size 1k;
large_client_header_buffers 4 4k;

gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;

output_buffers 1 32k;
postpone_output 1460;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 60;

include /etc/nginx/conf.d/*.conf;

server {
listen 80;
server_name company.ru www.company.ru;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}

location ~* ^.+\.(jpg|gif|avi|mp3|zip|js)$ {
root /var/www/html/media;

200 Модуль 14. HTTP сервер: Nginx.


access_log off;
expires 30d;
}

error_page 404 /404.html;


location = /404.html {
root /usr/share/nginx/html;
}

error_page 500 502 503 504 /50x.html;


location = /50x.html {
root /usr/share/nginx/html;
}
}
}

Установка mod_rpaf
Запросы к Apache приходят с IP-адреса frontend-сервера, что в свою очередь
не позволяет собирать статистику и вести log-файлы по посетителям. Тут
нам на помощь приходит модуль mod_rpaf, который служит для замены
IP-адреса Frontend-сервера на адрес посетителя и мы просто не замечаем
Nginx на свое пути.

Скачиваем src-пакет mod_rpaf


# wget http://repo.redhat-club.org/redhat/5/SRPMS/mod_rpaf-0.6-el5.rhc.1.src.rpm

Устанавливаем rpm-build, так как придется пересобрать rpm-пакет.


# yum -y install rpm-build

Пересобираем пакет
# rpmbuild --rebuild mod_rpaf-0.6-el5.rhc.1.src.rpm

Устанавливаем пересобранный пакет в систему


# rpm -Uvh /usr/src/redhat/RPMS/i386/mod_rpaf-0.6-.1.i386.rpm

В /etc/httpd/conf/httpd.conf добавляем:

Модуль 14. HTTP сервер: Nginx. 201


LoadModule rpaf_module modules/mod_rpaf-2.0.so

RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1 192.168.146.132
RPAFheader X-Real-IP

# service httpd restart

Проверка работоспособности mod_rpaf

Создаем страничку index.php со следующим содержанием:


<?
echo $_SERVER['REMOTE_ADDR'];
?>

С включенным mod_rpaf переменная REMOTE_ADDR будет содержать ваш


IP-адрес. С отключенным 127.0.0.1

Работа выполнена. Теперь любые файлы с расширениями jpg,gif,avi,mp3,zip


и js будут отдаваться через Nginx. Все остальные запросы будут
перенаправлены к Apache на linuxbox:8080

Включение SSL
Сейчас я покажу как подключить SSL к Nginx и настроить работу с PHP-
скриптами (тоже самое что и не у SSL-режима).
Генерируем ключ и сертификат (если нет openssl то ставим – yum -y install
openssl)
# openssl genrsa -des3 -out server.key.crypt 1024
# openssl rsa -in server.key.crypt -out server.key
# openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt
# rm -f server.key.crypt

Файлы server.key и server.crt необходимо расположить в /etc/nginx/


Файл ssl.conf должен быть таким
# cat /etc/nginx/conf.d/ssl.conf

202 Модуль 14. HTTP сервер: Nginx.


server {
listen 443;
server_name company.ru www.company.ru;

ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;

ssl_session_timeout 10m;

# ssl_protocols SSLv2 SSLv3 TLSv1;


# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;

location / {
root /usr/share/nginx/html;
index index.php index.html;
}
location ~ \.php$ {
if (!-f $request_filename) {
return 404;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# service nginx restart

Использование двух версий PHP в Nginx одновременно


Для использования двух версий PHP одновременно, например 4 и 5 делаем
следующее:
http {
index index.php;
root /usr/share/nginx/html;
# PHP 4 скрипты будут с расширением .php4
location ~ .*\.php4?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php4;
}
# PHP 5 скрипты будут с расширением .php5
location ~ .*\.php5$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php5;
}
}

Модуль 14. HTTP сервер: Nginx. 203


Ну и соответственно запускаем spawn-fcgi для PHP 4 и PHP 5
# /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u nginx -g nginx -f /usr/bin/php-cgi4
# /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9001 -u nginx -g nginx -f /usr/bin/php-cgi5

Примеры производительности с Nginx и без него.


Здесь я приведу некоторые замеры производительности систем с Nginx и
без него, чтобы стало понятно ради чего все затевалось.
Хостинг-сервер обслуживающий 150 сайтов

Средняя
р нагрузка
ру

Использование процессора
р ц р

204 Модуль 14. HTTP сервер: Nginx.


Использование памяти

Описание директив конфигурационного файла


Ниже я привел описание популярных директив конфигурационного файла.

user Директива задаёт пользователя и группу, с правами


которого будут работать рабочие процессы. Если
группа не задана, то используется группа, имя
которой совпадает с именем пользователя;
worker_processes Директива задаёт число рабочих процессов;
error_log Директива задаёт URI, который будет показываться
для указанных ошибок. Директивы наследуются с
предыдущего уровня при условии, что на данном
уровне не описаны свои директивы error_page. В URI
можно использовать переменные;
pid Директива задаёт файл, в котором хранится номер
основного процесса;
use epoll epoll- эффективный способ обработки соединений в
Linux ядра 2.6. Рекомендуется;
include Директивой подключаются дополнительные
конфигурационные файлы;
default_type MIME-тип по умолчанию;
log_format Задает формат лог-файла;
access_log Указывает на файл в котором будут сохраняться
сообщения о запросах;

Модуль 14. HTTP сервер: Nginx. 205


c l i e n t _ h e a d e r _ Директива задаёт таймаут при чтении заголовка
timeout запроса клиента. Если по истечении этого времени
клиент не передаст полностью заголовок запроса, то
ему возвращается ошибка «Request time out” (408);
client_body_timeout Директива задаёт таймаут при чтении тела запроса
клиента. Таймаут устанавливается не на всю передачу
тела запроса, а только между двумя операциями
чтения. Если по истечении этого времени клиент
ничего не передаст, то ему возвращается ошибка
«Request time out” (408);
send_timeout Директива задаёт таймаут при передаче ответа
клиенту. Таймаут устанавливается не на всю передачу
ответа, а только между двумя операциями записями.
Если по истечении этого времени клиент ничего не
примет, то nginx закрывает соединение;
c l i e n t _ h e a d e r _ Директива задаёт размер буфера для чтения
buffer_size заголовка запроса клиента. Для подавляющего
большинства запросов вполне достаточно буфера
размером в 1K. Однако если в запросе есть большие
cookies или же запрос пришёл от wap-клиента,
то он может не поместиться в 1K. Поэтому, если
строка запроса или строка заголовка запроса не
помещается полностью в этот буфер, то выделяются
большие буферы, задаваемые директивой large_
client_header_buffers;
large_client_header_ Директива задаёт максимальное число и размер
buffers буферов для чтения большого заголовка запроса
клиента. Строка запроса должна быть не больше
размера одного буфера, иначе клиенту возвращается
ошибка «Request URI too large” (414). Длинная строка
заголовка запроса также должна быть не больше
размера одного буфера, иначе клиенту возвращается
ошибка “Bad request” (400). Буферы выделяются
только по мере необходимости. По умолчанию
размер одного буфера равен размеру страницы,
в зависимости от платформы это или 4K, или 8K.
Если по окончании обработки запроса соединение
переходит в состояние keep-alive, то эти буферы
освобождаются;
gzip Разрешает или запрещает сжатие ответа методом
gzip;
gzip_min_length Устанавливает минимальную длину ответа, для которых бу-
дет выполняться сжатие ответа методом gzip. Длина опреде-
ляется только из строки “Content-Length” заголовка ответа;

206 Модуль 14. HTTP сервер: Nginx.


gzip_buffers Директива задаёт число и размер буферов, в которые будет
сжиматься ответ. По умолчанию размер одного буфера
равен размеру страницы, в зависимости от платформы
это или 4K, или 8K. До версии 0.7.28 по умолчанию
использовалось 4 буфера размером 4K или 8K;
gzip_types Разрешает сжатие ответа методом gzip для указанных
MIME-типов в дополнение к “text/html”. “text/html”
сжимается всегда;
sendfile Директива разрешает или запрещает использовать
sendfile();
tcp_nopush Директива разрешает или запрещает использовать
опции TCP_NOPUSH во FreeBSD или TCP_CORK в
Linux. Опции включаются только при использование
sendfile. Включение опции позволяет
- передавать заголовок ответа и начало файла в
одном пакете в Linux и во FreeBSD 4.x;
- передавать файл в полных пакетах.
tcp_nodelay Директива разрешает или запрещает использовать
опцию TCP_NODELAY. Опция включаются только при
переходе соединения в состояние keep-alive.
Директива задаёт таймаут, в течение которого keep-
alive соединение с клиентом не будет закрыто со
стороны сервера. Второй параметр задаёт значение
в строке “Keep-Alive: timeout=время” в заголовке
ответа. Параметры могут отличаться друг от друга.
Строку “Keep-Alive: timeout=время” понимают
Mozilla и Konqueror. MSIE сам закрывает keep-alive
соединение примерно через 60 секунд;
keepalive_timeout Директива задаёт таймаут, в течение которого keep-
alive соединение с клиентом не будет закрыто со
стороны сервера;
server {...} Директива задаёт конфигурацию для виртуального
сервера. Чёткого разделения виртуальных серверов
ip-based (на основании ip-адреса) и name-based (на
основании имени, передаваемого в строке “Host”
заголовка запроса), нет. Вместо этого директивами
listen описываются все адреса и порты, на которых
нужно принимать соединения для этого сервера, и
в директиве server_name указываются все имена
серверов. Пример конфигурации описан в примере
настройки виртуальных хостов;

Модуль 14. HTTP сервер: Nginx. 207


listen Директива задаёт адрес и порт, на которых сервер
принимает запросы. Можно указать только адрес
или только порт, кроме того, адрес может быть
именем сервера;
server_name Директива задаёт имена виртуального сервера;
location {...} Директива устанавливает конфигурацию в
зависимости от URI запроса;
proxy_pass Директива задаёт адрес проксируемого сервера и
URI, на который будет отображаться location. Адрес
может быть указан в виде доменного имени или
адреса и порта;
proxy_redirect Директива задаёт текст, который нужно изменить
в строках заголовка «Location” и “Refresh” в ответе
проксируемого сервера;
proxy_set_header Директива позволяет переопределять или
добавлять строки заголовка запроса, передаваемые
проксируемому серверу. В качестве значения можно
использовать текст, переменные и их комбинации;
client_max_body_ Директива задаёт максимально допустимый размер
size тела запроса клиента, указываемый в строке
«Content-Length” в заголовке запроса. Если размер
больше заданного, то клиенту возвращается ошибка
“Request Entity Too Large” (413). Следует иметь в виду,
что браузеры не умеют корректно показывать эту
ошибку;
client_body_buffer_ Директива задаёт размер буфера для чтения
size тела запроса клиента. Если тело запроса больше
заданного буфера, то всё тело запроса или только
его часть записывается во временный файл. По
умолчанию размер одного буфера равен двум
размерам страницы, в зависимости от платформы
это или 8K, или 16K;
proxy_connect_ Директива задаёт таймаут для соединения с
timeout проксированным сервером. Необходимо иметь в
виду, что этот таймаут не может быть больше 75
секунд;
proxy_send_timeout Директива задаёт таймаут при передаче запроса
проксированному серверу. Таймаут устанавливается
не на всю передачу запроса, а только между двумя
операциями записи. Если по истечении этого
времени проксируемый сервер не примет новых
данных, то nginx закрывает соединение;

208 Модуль 14. HTTP сервер: Nginx.


proxy_read_timeout Директива задаёт таймаут при чтении ответа прок-
сированного сервера. Таймаут устанавливается не
на всю передачу ответа, а только между двумя опе-
рациями чтения. Если по истечении этого времени
проксируемый сервер ничего не передаст, то nginx
закрывает соединение;
proxy_buffer_size Директива задаёт размер буфера, в который будет чи-
таться первая часть ответа, получаемого от проксируе-
мого сервера. В этой части ответа находится, как пра-
вило, небольшой заголовок ответа. По умолчанию раз-
мер буфера равен размеру одного буфера в директиве
proxy_buffers, однако его можно сделать меньше;
proxy_buffers Директива задаёт число и размер буферов для одно-
го соединения, в которые будет читаться ответ, по-
лучаемый от проксируемого сервера. По умолчанию
размер одного буфера равен размеру страницы, в
зависимости от платформы это или 4K, или 8K;
root Директива задаёт корневой каталог для запросов;
error_page Директива задаёт URI, который будет показывать-
ся для указанных ошибок. Директивы наследуются
с предыдущего уровня при условии, что на данном
уровне не описаны свои директивы error_page. В URI
можно использовать переменные;
access_log Директива access_log задаёт путь, формат и размер
буфера для буферизированной записи в лог. На одном
уровне может использоваться несколько логов. Пара-
метр “off ” отменяет все директивы access_log для теку-
щего уровня. Если формат не указан, то используется
предопределённый формат “combined”;
expires Разрешает или запрещает добавлять или менять
строки «Expires” и “Cache-Control” в заголовке ответа.
В качестве параметра можно задать положительное
или отрицательное время.

Резюме
Мы выяснили что такое Nginx и зачем он нужен, разобрали способы его
применения и самое главное все сами сделали на практике. Nginx может
работать сам по себе, но основное предназначение – снижать нагрузку на
Apache обрабатывая статику.

Домашнее задание
Воспользовавшись полученными знаниями настройте Nginx в двух режимах
работы. Nginx+FastCGI и Frontend/Backend.

Модуль 14. HTTP сервер: Nginx. 209


Postfix

Postfix – один из самых распространенных MTA на данный момент. MTA – это


Mail Transfer Agent, агент по доставке почты.
В этом модуле я расскажу, как настроить почтовый сервер корпоративного
уровня на базе Postfix. У нас будет весь необходимый функционал, - MTA,
POP3/IMAP-сервер, антивирус, антиспам, веб-интерфейс по управлению
почтовым сервером и веб-интерфейс для пользователей. Классно правда ?
И самое главное, что все ПО является бесплатным.
Информация в модуле будет состоять из двух частей. В первой части мы все
установим и настроим а во второй я приведу описание конфигурационных
файлов всех наших программ.

Установка и настройка
# yum -y remove sendmail

Postfix
Для построение почтового сервера нужно установить и настроить набор
программного обеспечения.
1. Postfix – MTA который отвечает за пересылку почты на другие почтовые
сервера;
2. MySQL, именно в базе данных мы будем хранить почтовые аккаунты;
3. Dovecot, предоставляет сервисы POP3/IMAP для пользователей сервера;
4. Clamd (ClamAV Daemon), отвечает за проверку почту на наличие
вирусов;
5. ClamSMTP, связывает работу Postfix и ClamAV между собой;
6. Spamassassin, отвечает за проверку почты на наличие SPAM-сообщений;
7. Postfixadmin – веб-интерфейс для управления Postfix;
8. Squirrelmail – веб-интерфейс для пользователей почтового сервера.

Настраиваем наш yum на работу с новым репозиторием – rpmforge.


Репозиторий содержит около 4000 тысяч пакетов, но нам оттуда понадобится
только clamsmtp, SMTP-фильтр для проверки писем на вирусы, в своей
работе использующий ClamAV и Spamassassin.
# rpm -Uvh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-
release-0.3.6-1.el5.rf.i386.rpm

210 Модуль 15. Postfix.


Postfix доступный в репозитории не имеет поддержки MySQL а именно там
мы собираемся хранить всю свою базу аккаунтов пользователей, поэтому
мы скачаем src-пакет, внесем в него изменения (добавим поддержку MySQL),
соберем и установим.
# mkdir -p /usr/src/redhat/{SOURCES,BUILD,SRPMS,RPMS/i386}
# rpm -Uvh http://mirror.corbina.net/pub/Linux/centos/5.2/updates/SRPMS/
postfix-2.3.3-2.1.el5_2.src.rpm
# cd /usr/src/redhat/SPECS/

В файл postfix.spec добавляем поддержку MySQL и кое какие другие опции


для успешной сборки:
меняем %define LDAP 2 на %define LDAP 0
меняем %define MySQL 0 на %define MySQL 1

В коде ниже меняем %define SASL 1 на %define SASL 2


%if %{LDAP} <= 1 && %{SASL} >= 2
%undefine SASL
%define SASL 1
%endif

# yum -y install mysql gcc rpm-build db4-devel zlib-devel openldap-devel cyrus-


sasl-devel pcre-devel mysql-devel openssl-devel
# rpmbuild -ba postfix.spec
# rpm -Uvh /usr/src/redhat/RPMS/i386/postfix-2.3.3-2.1.i386.rpm
# chkconfig postfix on
# chkconfig mysqld on

Выполняем postconf и убеждаемся что postfix собран с поддержкой mysql


# postconf -m
...
mysql
...
# useradd -r -u 1000 -g mail -d /var/vmail -s /sbin/nologin -c “Virtual Mailbox”
vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail: /var/vmail/

Модуль 15. Postfix. 211


Конфигурационный
ф ур ц файл
ф /etc/postfi
p x/main.cf
soft_bounce = no
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
myhostname = mail-server.company.ru
mydomain = company.ru
myorigin = $mydomain
inet_interfaces = all
mydestination = localhost.$myhostname, localhost
unknown_local_recipient_reject_code = 550
local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps
mynetworks = 127.0.0.0/8, 192.168.146.0/24
#relay_domains = $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mail_spool_directory = /var/spool/mail
smtpd_banner = $myhostname ESMTP
debug_peer_level = 2
debug_peer_list = 127.0.0.1
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.3.3/samples
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
config_directory = /etc/postfix

virtual_mailbox_domains = mysql:$config_directory/sql/vdomains.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:$config_directory/sql/vmailbox.cf
virtual_alias_maps = mysql:$config_directory/sql/valias.cf
virtual_minimum_uid = 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:12
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks

212 Модуль 15. Postfix.


smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unverified_recipient,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dialups.mail-abuse.org,

content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings

Конфигурационный
ф ур ц файл
ф /etc/postfi
p x/master.cf

# Postfix master process configuration file.


# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================
smtp inet n - n - - smtpd
-o content_filter=spamfilter:dummy

pickup fifo n - n 60 1 pickup


cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp

Модуль 15. Postfix. 213


-o fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache

maildrop unix - n n - - pipe


flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

old-cyrus unix - n n - - pipe


flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}

cyrus unix - n n - - pipe


user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}

uucp unix - n n - - pipe


flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)

ifmail unix - n n - - pipe


flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)

bsmtp unix - n n - - pipe


flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient)

scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes

127.0.0.1:10026 inet n - n - 16 smtpd


-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

214 Модуль 15. Postfix.


-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

spamfilter unix - n n - - pipe


flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} -- ${recipient}

# mkdir /etc/postfix/sql

Конфигурационный
ф ур ц файл
ф /etc/postfi
p x/sql/valias.cf
q

user = postfix
password = password
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Конфигурационный
ф ур ц файл
ф /etc/postfi
p x/sql/vdomains.cf
q

user = postfix
password = password
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0'
AND active='1'

Модуль 15. Postfix. 215


Конфигурационный
ф ур ц файл
ф /etc/postfi
p x/sql/vmailbox.cf
q
user = postfix
password = password
hosts = localhost
dbname = postfix
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s'
AND active = '1'

MySQL
MySQL – популярная система управления базами данных. В базе мы будет
хранить почтовые аккаунты, то есть пользователи будут виртуальными и нет
необходимости заводить их в системе.
# service mysqld start

Установите административный пароль на MySQL и некоторые другие опции


ответив на несколько вопросов.
# /usr/bin/mysql_secure_installation
...
Set root password? [Y/n] y
...
Remove anonymous users? [Y/n] y
...
Disallow root login remotely? [Y/n] y
...
Remove test database and access to it? [Y/n] y
...
Reload privilege tables now? [Y/n] y
...
Thanks for using MySQL!
# mysql -p

mysql> CREATE DATABASE postfix;

216 Модуль 15. Postfix.


Вместо password укажите свой пароль для пользователя.
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON `postfix`.* TO ‘postfix’@’localhost’;
mysql> \q

В файле /etc/my.cnf в секцию [mysqld] добавляем строку указанную ниже, она


сообщит MySQL-серверу ожидать входящие соединения на этом IP-адресе.
bind-address=127.0.0.1
# service mysqld restart

Dovecot
Dovecot – популярный POP3/IMAP-сервер, стабильный и несложный в
настройке.
# yum -y install dovecot
# chkconfig dovecot on

Конфигурационный
ф ур ц файл
ф /etc/dovecot.conf

base_dir = /var/run/dovecot/

protocols = imap pop3

protocol imap {
listen = *:143
}
protocol pop3 {
listen = *:110
}

log_timestamp = «%Y-%m-%d %H:%M:%S»

syslog_facility = mail

mail_location = maildir:/var/vmail/%d/%u

Модуль 15. Postfix. 217


mail_debug = yes

first_valid_uid = 1000
last_valid_uid = 1000

maildir_copy_with_hardlinks = yes

protocol imap {
login_executable = /usr/libexec/dovecot/imap-login
mail_executable = /usr/libexec/dovecot/imap
imap_max_line_length = 65536
}

protocol pop3 {
login_executable = /usr/libexec/dovecot/pop3-login
mail_executable = /usr/libexec/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
}

protocol lda {
postmaster_address = postmaster@company.ru
sendmail_path = /usr/lib/sendmail
auth_socket_path = /var/run/dovecot/auth-master
}

auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes

auth default {
base_dir = /var/run/dovecot/

mechanisms = plain

passdb pam {
}

218 Модуль 15. Postfix.


passdb sql {
args = /etc/dovecot-sql.conf
}

userdb passwd {
}

userdb sql {
args = /etc/dovecot-sql.conf
}

user = nobody

socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
user = vmail
group = mail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}

dict {
}

plugin {
}

Конфигурационный
ф ур ц файл
ф /etc/dovecot-sql.conf
q
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=password
default_pass_scheme = MD5

Модуль 15. Postfix. 219


user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail,
1000 AS uid, 12 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox
WHERE username = '%u' AND active = '1'

password_query = SELECT username as user, password, '/var/vmail/%d/%n' asuserdb_


home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1000 as userdb_uid, 12 asuserdb_gid
FROM mailbox WHERE username = '%u' AND active = '1'

Clamd
Clamd - Clam AntiVirus Daemon. Сервис ожидает входящие подключения
на UNIX/TCP-сокете и проверяет файлы и каталоги по запросу (например
clamdscan /var).
# yum -y install clamd
# chkconfig clamd on

Конфигурационный
ф ур ц файл
ф /etc/clamd.conf
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 0
LogTime yes
LogSyslog yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/clamav
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
MaxConnectionQueueLength 30
MaxThreads 50
ReadTimeout 300
User clamav
AllowSupplementaryGroups yes
ScanPE yes
ScanELF yes
DetectBrokenExecutables yes
ScanOLE2 yes
ScanMail yes
ScanHTML yes
ScanArchive yes
ArchiveBlockEncrypted no

220 Модуль 15. Postfix.


Популярные команды ClamAV:
clamdscan Позволяет проверять файлы и каталоги на наличие вирусов;
clamconf Конфигурационная утилита ClamSV;
clamdtop Clam AntiVirus Daemon Monitor.

ClamSMTP
ClamSMTP – это SMTP-фильтр, который позволяет взаимодействовать Postfix
и ClamAV.
# rpm -Uvh http://www.inet.lt/clamsmtp/clamsmtp-1.10-1.src.rpm
# cd /usr/src/redhat/SPECS
# yum -y install automake autoconf
# rpmbuild -ba clamsmtp.spec
# rpm -Uvh /usr/src/redhat/RPMS/i386/clamsmtp-1.10-1.i386.rpm
# chkconfig clamsmtpd on

Конфигурационный
ф ур ц файл
ф /etc/clamsmtpd.conf
p
OutAddress: 10026
TimeOut: 180
KeepAlives: 0
XClient: on
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.sock
Header: X-Virus-Scanned: ClamAV using ClamSMTP
TempDirectory: /tmp
Action: drop
Quarantine: on
User: clamav

Spamassassin
Spamassassin – самый популярный антиспам фильтр.
Настройка Spamassassin может занять у вас определенное время, прежде
чем он научится эффективно справляться со спамом.
Работа Spamassassin основана на ряде тестов через которые прогоняется
каждое входящее письмо. Каждый тест имеет свой вес – некое целое или
десятичное число, которое добавляется в общую “копилку”. Число может быть
как положительным так и отрицательным. Если к концу всех тестов письмо

Модуль 15. Postfix. 221


набирает больше заранее определенного лимита баллов (required_hits) то оно
помечается как SPAM и к нему применяются соответствующие меры. Обычно
это дописывание в тему письма сообщения о том, что это SPAM-письмо. На
основание этого, пользователи могут фильтровать входящею почту в своих
клиентских программах. В процессе своей работы Spamassassin обучается
и пополняет так называемую Bayes-базу. Bayesian классификатор пытается
определить SPAM используя bayes-базу наполненную токенами, токен –
это последовательность символов или слов которые часто встречаются в
SPAM-письмах. Например, вы скормили команде sa-learn 100 SPAM-писем
с повторяющимися словами “увеличение груди”, 101 сообщение которое
придет на почтовый сервер с текстом сообщения “увеличение” и “грудь” с
очень большой долей вероятности будет помечено как SPAM-письмо.
Не рекомендуется сразу удалять SPAM-письма, так как spamassassin тоже
иногда ошибается. Лучше помещать весь SPAM в отдельную папку и раз в
неделю разбирать ее содержимое и уже вручную с помощью sa-learn вносить
корректировки в процесс обучения spamassassin. Ну а теперь давайте
установим и настроим Spamassassin.

# yum install spamassassin


# adduser spamfilter -s /sbin/nologin

Создаем файл /usr/local/bin/spamfilter с таким содержанием:


#!/bin/bash

/usr/bin/spamc | /usr/sbin/sendmail.postfix -i «$@»

exit $?

# chown spamfilter /usr/local/bin/spamfilter


# chmod 755 /usr/local/bin/spamfilter

Конфигурационный
ф ур ц файл
ф /etc/mail/spamassassin/local.cf
p
required_hits 5
rewrite_header Subject ****SPAM****
report_safe 0
use_bayes 1

bayes_path /etc/mail/spamassassin/bayes
bayes_file_mode 0666
bayes_learn_to_journal 1

222 Модуль 15. Postfix.


bayes_min_ham_num 50
bayes_min_spam_num 50

score SUBJ_FULL_OF_8BITS 0.00


score HTML_COMMENT_8BITS 0.01
score HEADER_8BITS 0.00
score TO_NO_USER 0.01
score FORGED_MUA_OUTLOOK 0.5
score X_AUTH_WARNING 0.01
score SUBJ_HAS_UNIQ_ID 9.99
score HTTP_USERNAME_USED 9.99
score FORGED_YAHOO_RCVD 9.99
score FORGED_JUNO_RCVD 16
score UNWANTED_LANGUAGE_BODY 1.02
score MLM 5.55
score RCVD_NUMERIC_HELO 4.95

ok_locales en ru

whitelist_from root@localhost
blacklist_from *@outblaze.com

auto_whitelist_path /etc/mail/spamassassin/auto-whitelist
auto_whitelist_file_mode 0666

trusted_networks 192.168.146.0/24
# chkconfig spamassassin on
Письма бывают двух видов, ham – чистые письма и spam – незатребованная
реклама, вирусы в аттаче и т.д. Свою антиспам систему мы можем
самостоятельно обучать какие письма хорошие а какие нет. Через какое-
то время после того, как spamassassin получить достаточно информации о
типичном содержимом входящих писем, он начнет использовать полученные
знания на практике, используя их при анализе всей входящей почты. По
умолчанию требуется 200 ham-писем и 200 spam. Самостоятельно обучение
происходит командой sa-learn. Если сообщение будет по ошибке распознано
как спам мы просто запускаем команду sa-learn --ham с указанием этого
письма, и наш spamassassin учтет полученный опыт в будущем.

Хорошее
р письмо
# sa-learn --mbox --ham <письмо>

Spam-письмо
p
# sa-learn --mbox --spam <письмо>

Модуль 15. Postfix. 223


Команде sa-learn можно указать не только файл но и целый каталог.

Postfixadmin
Postfixadmin – веб-интерфейс для управления Postfix. Здесь можно завести
почтовые домены и ящики, настроить псевдонимы. Поведение самого
почтового сервера задается руками в файлах main.cf и master.cf.

# yum -y install httpd php php-imap php-mysql php-mbstring


# chkconfig httpd on
# cd /var/www/html/
# wget http://switch.dl.sourceforge.net/sourceforge/postfixadmin/
postfixadmin_2.3rc3.tar.gz
# tar xzvf postfixadmin_2.3rc3.tar.gz
# ln -s postfixadmin-2.3rc3/ postfixadmin
# service httpd start

В файле /var/www/html/postfixadmin/config.inc.php нужно внести минимум


изменений чтобы Postfixadmin начал функционировать:
$CONF['configured'] = false; поменять на $CONF['configured'] = true;

и заполнить следующие поля:


$CONF[‘database_user’] = ‘postfix’;
$CONF['database_password'] = 'password';
$CONF['database_name'] = 'postfix';

Пользователь MySQL, его пароль и название БД. Все это мы задали в разделе
MySQL.

Заходим по адресу http://192.168.146.150/postfixadmin/setup.php и создаем


суперпользователя который сможет управлять почтовым сервером через
веб-интерфейс.
# rm -f /var/www/html/postfixadmin-2.3rc3/setup.php
http://192.168.146.150/postfixadmin/login.php

Далее нужно создать почтовый домен и ящики.

224 Модуль 15. Postfix.


Squirrelmail
Squirrelmail – почтовый веб-интерфейс. Простой и надежно работающий.
# yum -y install squirrelmail
# service httpd restart
http://192.168.146.150/webmail/

Все, инсталяция ПО закончена, запускаем.


# service postfix start
# service dovecot start
# service clamd start
# service clamsmtpd start
# service spamassassin start

А теперь давайте проверим работоспособность нашей системы с антиспамом.


Отправьте письмо какому либо пользователю нашего почтового сервера с
таким содержанием:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Отправить можно прямо из командной строки, например так:

# mail -s “just test” tester@company.ru


вставляем нашу спам-строку, нажимаем [Enter]
Ctrl+D
[Enter]

Это специальный набор символов который используется для тестирования


антиспам-фильтра. Если пришедшее письмо определиться как спам, значит
все функционирует правильно. Отправлять нужно с другого сервера.

Обновить антивирусные базы ClamAV можно командой указанной ниже.


# freshclam

Модуль 15. Postfix. 225


Описание конфигурационных файлов

Postfix
Конфигурационный файл /etc/postfix/main.cf
Это главный конфигурационный файл Postfix. Практически все настраивается
здесь.
soft bounce Сообщение которое не смогло быть доставлено
сразу попадает в очередь, и через какое-то время
попытка повторяется. Если опция отключена то
отправитель сразу уведомляется что доставка
невозможна и сообщение отбрасывается;
queue_directory Директория для очереди сообщений;
command_directory Расположение административных команд;
daemon_directory Директория с дополнительными программами;
mail_owner Кому принадлежит почтовая очередь и от
какого пользователя выполняется большинство
процессов;
default_privs Права этого пользователя будут использоваться в
процессе локальной доставки сообщений внешним
командам или файлам;
myhostname Имя системы, по умолчанию используется FQDN имя
получаемое с помощью gethostname();
mydomain Доменное имя этой системы;
myorigin Значение используется в адресе отправителя почты,
если myorigin=company.ru то вся почта будет из @
company.ru
inet_interfaces На каких сетевых интерфейсах принимать почту;
mydestination Для каких доменов мы будем принимать почту;
u n k n o w n _ l o c a l _ Код ответа в случае некорректного получателя
recipient_reject_code сообщения;
local_recipient_maps Список всех локальных получателей почты;
mynetworks Список доверенных сетей, клиенты из доверенных
сетей могут перенаправлять почту через почтовый
сервер;
relay_domains Для каких доменов мы будем релеем;
alias_maps База псевдонимов используемых для локальной
alias_database доставки;
mail_spool_directory Директория где храняться почтовые ящики;
smtpd_banner Приглашение почтового сервера, код 220;

226 Модуль 15. Postfix.


debug_peer_level Уровень отладки при достижение условия в debug_
peer_list;
debug_peer_list Для этих IP-адресов будет использоваться
повышенное журналирование;
debugger_command Внешняя программа запускаемая в случае старта
Postfix с опцией -D;
sendmail_path Расположение команды sendmail которая помещает
сообщения в очередь;
newaliases_path Путь к программе newaliases;
mailq_path Путь к программе mailq, с ее помощью можно
посмотреть почтовую очередь;
setgid_group Группа владелец set-gid команд;
html_directory Директория с HTML-файлами описывающими
специфичные возможности Postfix;
manpage_directory Расположение manual pages;
sample_directory Директория с примерами;
readme_directory Директория с README файлами Postfix;
config_directory Расположение main.cf и master.cf;
virtual_mailbox_ Конечный пункт назначения для списка доменов,
domains здесь используется такой же синтаксис как в
mydestination;
virtual_mailbox_base Префикс который используется для всех результатов
из virtual_mailbox_maps;
virtual_mailbox_maps Таблица с возможными адресатами в доменах,
которые отвечают virtual_mailbox_domains;
virtual_alias_maps Таблица псевдонимов;
virtual_minimum_uid Минимальный UID для виртуальных аккаунтов;
virtual_uid_maps Поисковые таблицы с пользовательским идентифи-
катором, который используется агентом локальной
доставки при записи сообщения в почтовый ящик;
virtual_gid_maps Поисковые таблицы с идентификаторами групп
пользователей. Используется агентом локальной
доставки;
virtual_transport Транспорт для доставки почты;
dovecot_destination_ Опция Dovecot, доставлять за раз только одно
recipient_limit письмо;
smtpd_sasl_auth_ Включить ли SASL-аутентификацию;
enable
s m t p d _ s a s l _ Список сетей которым SASL AUTH предлагаться не
exceptions_networks будет;

Модуль 15. Postfix. 227


smtpd_sasl_security_ Опции для SASL-аутентификации;
options
broken_sasl_auth_ Совместимость с клиентами, которые используют
clients старую версию AUTH;
smtpd_sasl_type Плагин который будет использоваться для
аутентификации;
s m t p d _ r e c i p i e n t _ Набор ограничений почтового сервера;
restrictions
content_filter Название транспорта который фильтрует почту
после того, как она поставлена в очередь;
r e c e i v e _ o v e r r i d e _ Включение или отключение проверки правильности
options получателя.

Конфигурационный файл master.cf


Этот файл определяет как клиентская программа соединяется с сервисом и
что запускать когда происходит запрос к сервису.
Разберем только то, что мы меняли в базовой конфигурации. Структуру
файла можно представить 8-мью столбцами.

service type private unpriv chroot wakeup maxproc command + args

service Название сервиса;


type Тип сервиса, inet – сервис работает на TCP/IP-сокете, unix
– сервис слушает на UNIX-сокете, fifo – именованный
pipe, доступ только для локальный клиентов, pass –
слушает на UNIX-сокете, принимает одно открытое
подключение по запросу и доступно только для
локальных пользователей;
private Ограничен ли доступ к почтовой системе, тип сервиса
inet не может быть приватным;
unpriv Запускать от пользователя root или от mail owner в main.
cf;
chroot Сервис запускается в chroot-окружение или нет;
wakeup Через определенное количество секунд можно отсылать
запрос сервису чтобы тот “проснулся”;
maxproc Максимальное количество процессов которое этот
сервис может выполнять одновременно;
command + args Исполняемая команда и аргументы для сервиса.
Всю приходящею почту мы направляем в спам-фильтр.

228 Модуль 15. Postfix.


smtp inet n - n - - smtpd
-o content_filter=spamfilter:dummy

Доставка почты происходит через Dovecot, он выполняет роль локального


транспорта.
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient)

Вся почта уходит на проверку в антивирус а затем возвращается обратно в


postfix.
scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes

127.0.0.1:10026 inet n - n - 16 smtpd


-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

Подключаем Spamassassin.
spamfilter unix - n n - - pipe
flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} -- ${recipient}

Dovecot
Конфигурационный файл /etc/dovecot.conf
Это основной конфигурационный файл Dovecot.
base_dir Рабочая директория;
protocols Обслуживаемые протоколы;
listen Какие IP-адреса и порты слушать на входящие
соединения;
log_timestamp Формат записи логов;
syslog_facility Указываем если используем Syslog для журналирования
работы сервиса;
mail_location Расположение почтовых ящиков пользователей;
mail_debug Режим отладки;

Модуль 15. Postfix. 229


first_valid_uid Допустимые UID для пользователей;
last_valid_uid
m a i l d i r _ c o p y _ Dovecot будет пытаться копировать сообщения
with_hardlinks с использованием hard links, это повышает
производительность системы;
login_executable Расположение программы выполняемой для входа в
систему;
mail_executable Местоположение выполняемой программы доступа к
электронной почте;
imap_max_line_ Максимальная длина команды IMAP в байтах;
length
p o p 3 _ u i d l _ Формат уникального почтового идентификатора;
format
p o s t m a s t e r _ Адрес postmaster`а, сюда отправляются сообщения о
address невозможности доставки почты;
sendmail_path Расположение программы для отправки почты;
a u t h _ s o c k e t _ Расположение UNIX-сокета для аутентификации;
path
auth_verbose Если опция включена в журнал будет записываться
больше информации связанной с аутентификацией;
auth_debug Еще больше журналируемой информации, например
показываются SQL-запросы к БД;
a u t h _ d e b u g _ В случае несоответствия пароля регистрировать
passwords в журнале, включений этой опции автоматически
включает auth_debug;
passdb sql / Использование SQL в своей работе, в качестве аргумента
userdb sql используется путь к файлу с SQL конфигурацией;
user От какого пользователя выполняется процесс;
path Путь к какому либо каталогу или файлу;
mode Права доступа на файл или каталог;
group Группа владелец.

Clamd
Конфигурационный файл /etc/clamd.conf
LogFile Журналирование работы сервиса в
указанный файл;
LogFileMaxSize Максимальный размер log-файла, 0 означает
неограниченный;
LogTime Указывать время для каждого сообщения;

230 Модуль 15. Postfix.


LogSyslog Использовать Syslog (можно одновременно
использовать с LogFile);
PidFile Сохранять PID главного процесса Clamd в
этот файл;
TemporaryDirectory Временная директория;
DatabaseDirectory Путь к директории содержащей файлы БД;
LocalSocket Путь к UNIX-сокету;
FixStaleSocket Удалять сокет после некорректного
завершения работы;
TCPSocket Номер TCP-порта на котором будет работать
сервис;
TCPAddr IP-адрес на котором будет работать сервис;
MaxConnectionQueueLength Максимальная очередь подключений
ожидающих обработки;
MaxThreads Максимальное число потоков в единицу
времени;
ReadTimeout Таймаут соединения;
User Запуск Clamd от этого пользователя;
AllowSupplementaryGroups Инициализация дополнительного группового
доступа;
ScanPE Сканировать .exe файлы или нет;
ScanELF Сканировать файлы бинарного формата ELF
или нет;
DetectBrokenExecutables С этой опцией Clamd попытается обнаружить
“сломанные” PE/ELF файлы и отметить их
соответствующим флагом;
ScanOLE2 Опция позволяет задать сканирование OLE-
объектов, таких как документы Microsoft
Office и .msi файлы;
ScanMail Опция позволяет задать сканирование
почтовых файлов;
ScanHTML Сканирование HTML;
ScanArchive Сканировать содержимое архивов или нет;
ArchiveBlockEncrypted Маркировать зашифрованные архивы.

Clamsmtpp
Конфигурационный файл /etc/clamsmtpd.conf
OutAddress Порт через который возвращается письмо, после того как
оно будет проверено на вирусы;

Модуль 15. Postfix. 231


TimeOut Количество секунд, в течение которых ожидаются данные
от сетевых подключений;
KeepAlives Опция может помочь на медленных каналах связи, когда
timeout наступает быстрее чем ClamAV успевает проверить
файл на вирусы;
XClient Отправка команды Xclient принимающему серверу.
Может быть полезно при перенаправление информации
о соединение серверам, которые поддерживают эту
возможность;
Listen Здесь указываем адрес и порт для ожидания входящих
соединений;
ClamAddress Здесь указывается адрес для подключения к Clamd
(Antivirus Daemon);
Header Здесь указывается, что будет дописано в заголовок
письма;
TempDirectory Директория для временных файлов;
Action Это действие будет выполнено в случае нахождения
вируса, drop – удалить e-mail, bounce – отклонить письмо,
pass – пропустить письмо в почтовый ящик пользователя;
Quarantine Помещать ли файлы с вирусами в карантин (в директорию
TempDirectory);
User От какого пользователя запускать clamsmtpd, сначала
сервис стартует с правами root, далее сервис начинает
работать с правами указанного пользователя в этой
опции.

Spamassassin
p
Конфигурационный файл /etc/mail/spamassassin/local.cf

required_hits Необходимое количество очков чтобы письмо


было опознано как спам;
rewrite_header Переписываем заголовок если письмо опознано
как спам;
report_safe Если опция включена входящие письма
опознанные как спам не будут модифицироваться,
вместо этого будет сгенерированно новое
письмо с уведомлением о спаме и к нему будет
добавлено оригинальное сообщение;
use_bayes Использовать ли Bayes классификатор, база
bayes создается командой sa-learn --sync;

232 Модуль 15. Postfix.


bayes_path Путь к базам Bayes;
bayes_file_mode Права доступа на файлы;
bayes_learn_to_journal В процессе обучения, Bayes будет записывать
информацию в журнал а не напрямую в базу
данных;
bayes_min_ham_num Сколько ham (non-spam) и spam писем должно
bayes_min_spam_num накопиться в базе данных Bayes, прежде чем она
будет использоваться при анализе новых писем;
score Назначение определенного количества очков
какой либо тесту, это может быть положительное
или отрицательное число (целое или
десятичное);
ok_locales Какие локали считать корректными для
приходящих писем, письма не попадающие в этот
список будут помечены как возможный спам;
whitelist_from Белый список адресов. Письма с этих адресов не
будут помечены как спам;
blacklist_from Черный список адресов. Письма с этих адресов
будут помечены как спам.
auto_whitelist_path Путь к файлу auto_whitelist, auto whitelisting
вычисляет средний уровень оценки для
каждого отправителя и прибавляет его к оценке
очередного письма. Это позволяет не блокировать
“благонадежных” отправителей если оценка
отдельного письма вдруг превысит предел.
auto_whitelist_file_mode Права доступа на файл;
trusted_networks Список надежных сетей, проверки на наличие в
черных списках никогда не будет выполняться
для хостов в этих сетях.

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

Домашнее задание
Сделать почтовый сервер по данному руководству и проверить
работоспособность.

Модуль 15. Postfix. 233


OpenVPN

OpenVPN – бесплатное программное обеспечение для построения Virtual


Private Network, защищенной частной сети. VPN-сеть – это логическая сеть
создаваемая поверх другой сети.
Для обеспечения шифрования передаваемых данных используется
библиотека OpenSSL. Пользователю предоставлен выбор способов
шифрования, по умолчанию используется Blowfish.
В работе OpenVPN используется два псевдоустройства – tap (ethernet tunnel
software network interface, L2 ) который эмулирует ethernet интерфейс и tun
(tunnel software network interface, L3 ) который работает как point-to-point
интерфейс. Драйвера этих устройств присутствуют в ядре Linux и нечего
дополнительно настраивать не требуется.

Основные возможности OpenVPN:


1. Аутентификация пользователей и шифрование трафика с использованием
библиотеки OpenSSL;
2. Возможность работы VPN-туннеля через NAT (Network Address
Translation);
3. Сжатие трафика с использованием LZO real-time compression library.

Установка Linux VPN-сервера


В базовых репозиториях CentOS пакет OpenVPN отсутствует, поэтому мы
подключим дополнительный репозиторий – EPEL, откуда его и поставим.
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-
5-3.noarch.rpm

Устанавливаем OpenVPN
# yum -y install openvpn

Добавляем в автозагрузку при старте сервера

# chkconfig openvpn on

234 Модуль 16. OpenVPN.


Настройка Linux VPN-сервера
Расположение директорий и файлов OpenVPN.
/usr/sbin/openvpn Расположение бинарного файла OpenVPN;
/etc/openvpn/ Расположение конфигурационного файла и
ключей/сертификатов;
/usr/share/doc/openvpn-2.1/ Масса примеров конфигурационных файлов
OpenVPN на все случаи жизни;
/usr/share/openvpn/easy-rsa/ Расположение набора скриптов генерации
необходимых файлов для работы OpenVPN;
/var/run/openvpn/ Расположение PID-файла OpenVPN;
/usr/lib/openvpn/plugin/lib/ Несколько динамических библиотек;
/var/log/openvpn.log По умолчанию журналирование происходит
в файл /var/log/messages, для OpenVPN мы
заведем отдельный log-файл и расположен
он будет в /var/log/

В данном модуле мы рассмотрим настройку VPN-сервера и нескольких


клиентов, которые будут через него работать.
Сеть 192.168.146.0/24 является обычной незащищенной сетью. В это сети
расположен наш будущий VPN-сервер с IP-адресом 192.168.146.150 (на нем
есть DNS-сервер) и два клиента, один Linux-клиент другой Windows-клиент
(Windows XP).
Сеть 10.10.10.0/24 будет нашей VPN-сетью, весь трафик в этой сети будет
шифроваться. Это может быть сеть из частного набора сетей (10.0.0.0/8,
172.16.0.0/12 или 192.168.0.0/16, определенных в документах RFC 1918 и
RFC 4193 найти которые можно на ietf.org) и которую вы еще не используете.
Когда в настройках OpenVPN сервера мы определяем VPN-сеть то первый
IP-адрес из этой сети будет назначен VPN-серверу. Мы сделаем чтобы весь
трафик клиентов ходил через VPN-сервер.
При настройке VPN-сети мы сгенерируем несколько ключей и сертификатов,
которые будут использоваться для аутентификации. OpenVPN обладает
большим функционалом, но вполне распространенная конфигурация
может занимать 15-20 строчек для сервера и 10 строчек для клиента и вы
это немного позже увидите.
В каталог /etc/openvpn/ скопируем набор скриптов для быстрой и легкой
генерации всех необходимых ключей и сертификатов.

# cp -R /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/

Модуль 16. OpenVPN. 235


Переходим в каталог
# cd /etc/openvpn/2.0/

Открываем на редактирование файл vars и в самом его конце приводим


переменные к такому виду:
export KEY_COUNTRY=»RU»
export KEY_PROVINCE=»RU»
export KEY_CITY=»Moscow»
export KEY_ORG=»company.ru»
export KEY_EMAIL=»support@company.ru»

Инициализируем переменные
# source ./vars

Очищаем директорию keys от старых файлов


# ./clean-all

Создаем ROOT CERTIFICATE AUTHORITY (CA) сертификат/ключ (в директории


/etc/openvpn/2.0/keys/ будут созданы файлы ca.crt и ca.key)
# ./build-ca

Создаем ключ и сертификат для сервера (в директории /etc/openvpn/2.0/


keys/ будут созданы файлы server.crt, server.key и server.csr).
Формат команды: ./build-key-server ServerName – где ServerName это
название сервера.
# ./build-key-server server

Генерируем Diffie Hellman parameters для сервера. Суть алгоритма Diffie


Hellman в том, чтобы наладить защищенное соединение по незащищенным
каналам связи. По умолчанию длина файла 1024 бита, что очень даже
достаточно. После выполнения этой команды будет создан файл /etc/
openvpn/2.0/keys/dh1024.pem
# ./build-dh

С генерацией файлов для сервера закончено, теперь можно добавлять


клиентов вот такой командой (будут созданы файлы client1.crt, client1.key и
client1.csr). Благодаря тому, что мы уже отредактировали файл vars и указали
значения переменных по умолчанию, нам в большинстве запросов на ввод

236 Модуль 16. OpenVPN.


данных достаточно будет просто нажать Enter.
# ./build-key client1
Generating a 1024 bit RSA private key
......++++++
.................++++++
writing new private key to 'client1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]: [Enter]
State or Province Name (full name) [RU]: [Enter]
Locality Name (eg, city) [Moscow]: [Enter]
Organization Name (eg, company) [company.ru]: [Enter]
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server’s hostname) [client1]: [Enter]
Name []:[Enter]
Email Address [support@company.ru]: [Enter]

Please enter the following ‘extra’ attributes


to be sent with your certificate request
A challenge password []: [Enter]
An optional company name []: [Enter]
Using configuration from /etc/openvpn/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’RU’
stateOrProvinceName :PRINTABLE:’RU’
localityName :PRINTABLE:’Moscow’
organizationName :PRINTABLE:’company.ru’
organizationalUnitName :PRINTABLE:’IT Dept’
commonName :PRINTABLE:’client1’
emailAddress :IA5STRING:’support@company.ru’
Certificate is to be certified until Apr 21 11:16:28 2019 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y


Write out database with 1 new entries
Data Base Updated
Common Name должно быть уникальным для всех.

Модуль 16. OpenVPN. 237


Все необходимые файлы для VPN-сервера будут расположены в /etc/
openvpn/ поэтому скопируем их туда из директории /etc/openvpn/2.0/keys/
# cp keys/{ca.crt,ca.key,server.crt,server.key,dh1024.pem} ../

Копируем шаблон конфигурационного файла VPN-сервера в /etc/openvpn/ и


приводим его к конфигурации указанной ниже.
# cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf /etc/openvpn/
openvpn.conf

Содержание конфигурационного файла VPN-сервера (/etc/openvpn/


openvpn.conf ):
local 192.168.146.150
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.10.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push «route 0.0.0.0 255.255.255.0»
push «dhcp-option DNS 192.168.146.150»
push «redirect-gateway»
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
mute 10

Маршрут по умолчанию я переписываю удаляя старый, для этого я


использовал “redirect-gateway”, если захотите чтобы старый тоже остался то
строчка
push «redirect-gateway»
должна быть такой:
push «redirect-gateway def1»

238 Модуль 16. OpenVPN.


На VPN-сервере необходимо включить IP Forwarding, так как наш сервер
будет маршрутизировать трафик.
# echo ‘1’ > /proc/sys/net/ipv4/ip_forward

Команда выше позволит сразу же начать маршрутизировать трафик, но


состояние опции в момент перезагрузки сервера не сохраняется. Для
того чтобы IP forwarding включить на постоянной основе необходимо
отредактировать файл /etc/sysctl.conf

В файле /etc/sysctl.conf находим такую строку:


net.ipv4.ip_forward = 0

и меняем ее на:
net.ipv4.ip_forward = 1

Для того чтобы трафик VPN-клиентов достигший нашего сервера мог


попадать в другие сети и успешно возвращаться нам нужно включить
трансляцию сетевых адресов (NAT). Мы это сделаем с помощью iptables вот
такой командой:
# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

В ключе -o указан наш сетевой интерфейс во внешние сети, в ключе -s


указываем нашу VPN-сеть, у вас она может быть и другой. Также интересный
момент – для моих Linux-клиентов NAT не понадобился, а вот если у вас есть
Windows-клиенты то команда iptables необходима.
Настройка VPN-сервера закончена и мы можем его запустить.
# service openvpn start

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


машину. Крайне желательно это делать безопасным способом, чтобы файлы
не были перехвачены злоумышленниками. На Linux-клиент файлы можно
перенести с помощью команды scp, в этом случае весь передаваемые трафик
будет зашифрован. Находясь в директории /etc/openvpn/ выполните такую
команду:
# scp ca.crt 2.0/keys/client1.key 2.0/keys/client1.crt client1@192.168.146.134:~

где client1 – ваш логин на удаленной машине а 192.168.146.134 – ее IP-


адрес. В результате выполнения этой команды на удаленный компьютер мы

Модуль 16. OpenVPN. 239


скопируем файл ca.crt – сертификат CA и сертификат/ключ клиента, они ему
понадобятся чтобы подключаться к VPN-серверу.
Далее эти файлы нужно переместить в /etc/openvpn/ из под пользователя
root или другого имеющего право на запись в этом каталоге.

Linux VPN-клиент
Подключаем репозиторий EPEL откуда мы поставим OpenVPN.
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-
5-3.noarch.rpm

Устанавливаем OpenVPN
# yum -y install openvpn

Добавляем OpenVPN в автозагрузку при старте компьютера


# chkconfig openvpn on

В каталог /etc/openvpn/ копируем шаблон файла конфигурации OpenVPN-клиента


# cp /usr/share/doc/openvpn-2.1/sample-config-files/client.conf /etc/openvpn/
client.conf

И приводим его к следующему виду


Конфигурационный файл client.conf на Linux VPN-клиенте.
client
dev tun
proto tcp
remote 192.168.146.150 1194
resolv-retry infinite
user nobody
group nobody
persist-key
persist-tun

ca ca.crt
cert client1.crt
key client1.key

ns-cert-type server

log-append /var/log/openvpn.log

comp-lzo
verb 3

240 Модуль 16. OpenVPN.


Файл конфигурации подразумевает, что в каталог /etc/openvpn/ клиента
были закачены файлы ca.crt, client1.crt и client1.key с сервера. Как их можно
безопасно перенести объяснялось выше.

На этом все, настройка OpenVPN-клиента закончена. Запускаем OpenVPN.


# service openvpn start

Пингуем наш VPN-сервер:


# ping 10.10.10.1
PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=4.97 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=3.96 ms
64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=2.03 ms

--- 10.10.10.1 ping statistics ---


3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 2.036/3.658/4.978/1.222 ms

Пингуем других VPN-клиентов если они у вас уже есть (у меня есть):
# ping 10.10.10.10
PING 10.10.10.10 (10.10.10.10) 56(84) bytes of data.
64 bytes from 10.10.10.10: icmp_seq=1 ttl=64 time=0.680 ms
64 bytes from 10.10.10.10: icmp_seq=2 ttl=64 time=0.994 ms

--- 10.10.10.10 ping statistics ---


2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.680/0.837/0.994/0.157 ms

Проверяем, что весь наш трафик ходит через VPN-сервер:


# tracert www.ru
traceroute to www.ru (194.87.0.50), 30 hops max, 40 byte packets
1 10.10.10.1 (10.10.10.1) 0.769 ms 1.486 ms 40.849 ms
2 192.168.146.2 (192.168.146.2) 40.821 ms 40.791 ms 40.760 ms
3 www.ru (194.87.0.50) 40.721 ms 40.689 ms 40.659 ms

10.10.10.1 – VPN-сервер
192.168.146.2 – мой шлюз во внешние сети
www.ru – пункт назначения для наших пакетов.

Как видим весь трафик проходит через наш VPN-сервер.

Модуль 16. OpenVPN. 241


Windows VPN-клиент
Скачиваем пакет OpenVPN для Windows + OpenVPN GUI (графический
интерфейс) и устанавливаем его.
http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe

На этот клиент закачиваем его сертификат и ключ (client2.crt и client2.key) а


также сертификат сервера – ca.crt. Все эти файлы я расположил в директории
c:\vpn\
В директории C:\Program Files\OpenVPN\config\ создаем конфигурационный
файл client.ovpn с таким содержанием:
client
dev tun
proto tcp
remote 192.168.146.150 1194
resolv-retry infinite
persist-key
persist-tun

ca c:\\vpn\\ca.crt
cert c:\\vpn\\client2.crt
key c:\\vpn\\client2.key

comp-lzo
verb 3

Внимание! В путях к файлам не опечатка, так и должно быть – по два


бекслеша.

Далее, в системном трее нажимаем правой клавишей мыши на иконку с


изображением 2 компьютеров и выбираем пункт “Connect”. Windows-клиент
должен подключиться к VPN-серверу и можно работать.

Посмотреть настройки сетевого интерфейса и маршрутов на Windows-


машине можно вот так:

Пуск -> Выполнить -> пишем команду ”cmd” нажимаем Enter ->
ipconfig /all – посмотреть сетевые интерфейсы
route print – посмотреть таблицу маршрутизации
Попингуйте VPN-сервер и сделайте трасировку (tracert) до www.ru

242 Модуль 16. OpenVPN.


Добавление клиентов
На сервере заходим в директорию /etc/openvpn/2.0/
# cd /etc/openvpn/2.0/

Генерируем ключ для client3 (имя может быть другим)


# build-key client3

Далее, ca.crt и client3.crt/client3.key переносим на компьютер client3 в


директорию /etc/openvpn/ или другой если используем Windows.
Файл конфигурации как у клиентов выше в зависимости от ОС.

Таблица предназначения ключей и сертификатов


Для полноты ясности в таблице ниже приведен список всех файлов которые
мы сгенерировали. Секретные файлы держите в дали от посторонних глаз.
Файл Где используется Назначение Секретность
ca.crt Сервер + клиенты Root CA Certificate Нет
ca.key Сервер Root CA Key Да
dh1024.pem Сервер Diffie Hellman parameters Нет
server.crt Сервер Server Certificate Нет
server.key Сервер Server Key Да
client1.crt Клиент1 Client1 Certificate Нет
client1.key Клиент1 Client1 key Да

На все последующие файлы вида clientN.* распространяются такие же


условия, что и на client1.*

Конфигурационный файл openvpn.conf на Linux VPN-сервере


Самые важные и популярные опции используемые в настройке VPN-
сервера.
local Позволяет задать IP-адрес на котором нужно
слушать входящие соединения. Если эта опция
в файле не определенна то принимаются
соединения на всех интерфейсах;
port Официальный порт OpenVPN – 1194 и менять его
не стоит;
proto Какой протокол использовать, я предпочитаю tcp;

Модуль 16. OpenVPN. 243


dev Устройство которое будем использовать. tun
– создает маршрутизируемый IP-тунель, tap –
создает ethernet (L2) тунель, который может
использоваться если все клиенты в одной
подсети;
dev-node В Windows нужно указать имя адаптера;
ca Расположение SSL/TLS Root Certificate;
cert Задает расположение сертификата сервера;
key Задает расположение ключа сервера;
dh Задает расположение Diffie Hellman parameters
файла;
server Задает VPN-сеть, VPN-сервер получит самый
первый IP-адрес в этой сети;
ifconfig-pool-persist Опция определяет файл в котором будут
храниться значения client <-> VPN IP-адрес,
в случае перезагрузки VPN-сервера клиенты
получат теже самые IP-адреса которые у них
были до этого;
server-bridge Конфигурирование ethernet бриджинга.
Бриджинг позволяет на одном физическом
интерфейсе объединить несколько виртуальных
TAP интерфейсов, по сути реализуя физический
ethernet switch. При использование моста
между двумя сетями, обе сети выглядят как
одна большая, это позволяет программам
широковещательной передачи данных работать
через такой VPN-туннель;
push “route ...” Опция позволяет отправить клиенту информацию
о маршрутах. Маршрут помещается в таблицу
маршрутизации клиента;
client-config-dir ccd Задает директорию с файлами сетевых настроек
для клиентов. К примеру если мы захотим
назначить клиенту client1 (Certificate Common
Name = client1) фиксированный IP-адрес, делаем
следующее:
openvpn.conf:
client-config-dir ccd
route 10.10.10.0 255.255.255.0
ccd/client1:
ifconfig-push 10.10.10.1 10.10.10.2

244 Модуль 16. OpenVPN.


push «redirect-gateway” Опция назначает шлюз по умолчанию для
клиентов. Старый маршрут будет удален. С
опцией def1 (push «redirect-gateway def1”)
старый маршрут будет просто заменен, без
удаления из таблицы маршрутизации. Если VPN-
сервер и клиенты в одной подсети то пригодится
опция local (push «redirect-gateway local def1»);
push «dhcp-option DNS ...” Назначение DNS-сервера клиентам;
push «dhcp-option WINS ...” Назначение WINS-сервера клиентам;
client-to-client Разрешать ли видить клиентам друг друга, по
умолчанию они видят только сервер;
duplicate-cn Позволяет разрешить подключаться к VPN-
серверу клиентам с одинаковыми ключами и
сертификатами. Рекомендуется чтобы у каждого
клиента была своя пара ключ/сертификат;
keepalive 10 120 Пинговать противоположный конец туннеля
каждые 10 секунд, при отсутствие встречных
пингов в течение 120 секунд считать соединение
потерянным и запускать пересоединение;
tls-auth Для максимальной безопасности можно
воспользоваться функционалом SSL/TLS и
создать «HMAC firewall» для борьбы с DOS-
атаками и UDP port flooding. Для этого
необходимо сгенерировать ключ, которые будет
на сервере и клиенте.
# openvpn --genkey --secret ta.key
На сервере строчка в конфигурационном файле
должна быть такой:
tls-auth ta.key 0
на клиенте:
tls-auth ta.key 1
Файл является секретным.
cipher Позволяет задать криптографический шифр. По
умолчанию используется Blowfish и менять его
врядли вам захочется;
comp-lzo Включение компрессии VPN линка.
max-clients Максимальное количество клиентов на VPN-
сервере одновременно;
user Пользователь и группа от которых будет работать
group OpenVPN;

Модуль 16. OpenVPN. 245


persist-tun Не закрывать и переоткрывать TUN/TAP
устройство или запускать/отключать скрипты
через SIGUSR1 сигнал или --ping-restart (на
деле лучше использовать keepalive);
persist-key Не перечитывать файлы ключей через SIGUSR1
сигнал или --ping-restart;
status В этот файл будет сохраняться текущая
информация по статусу VPN-соединений и
обновляться каждую минуту (файл расположен
в /etc/openvpn/);
log Расположение log-файла, при старте OpenVPN
он будет очищаться от старых записей;
log-append Расположение log-файла, при старте OpenVPN
он будет пополняться свежими записями;
verb Опция задает уровень журналирования в log-
файл:
0 – только фатальные ошибки;
4 – разумно для общего использования;
5 и 6 – позволяют обнаружить проблемы с
подключениями;
9 – максимальная отладочная информация;
mute Ограничивает журналирование однотипных
сообщений в log-файл, по умолчанию не более
20 сообщений одной категории, остальные будут
отбрасываться;

Конфигурационный файл client.conf на Linux-клиентах


Опции которые можно встретить в настройках клиента. Некоторые являются
обязательными.
client Сообщает о том, что данная машина является VPN-
клиентом;
remote Задает IP-адрес VPN-сервера и порт подключения. Серверов
может быть указано много;
remote-random Позволяет случайным образом выбрать сервер для
подключения определенный в опции remote. Это сделано
для распределения нагрузки;
resolv-retry infinite Постоянно резолвить hostname VPN-сервера, это полезно
на клиентах подключенных к сети на непостоянной основе,
таких как ноутбуки;

246 Модуль 16. OpenVPN.


nobind Использовать динамический порт на клиенте, актуально
только для UDP, так как при использование TCP порт всегда
динамический;
http-proxy Позволяет задать http-proxy для подключения к VPN-серверу;
mute-replay-warnings Беспроводные сети очень много дублируют пакеты, опция
позволит ограничить это;
ns-cert-type Опция для увеличения безопасности, она позволяет гаран-
тировать что сервер, к которому происходит подключение
действительно им является. Для этого будет проверено поле
nsCertType, которое должно содержать значение “server”;

Конфигурационный файл client.ovpn на Windows-клиенте


Почти тоже самое что и на Linux-клиентах. Не будет user/group опций и пути
к файлам с учетом файловой системы Windows.
Также, для того чтобы OpenVPN-клиент заработал в Windows Vista в
конфигурационный файл клиента нужно добавить следующее:
route-method exe
route-delay 2
В процессе настройки не забывайте, что если вы используете firewall то
OpenVPN необходимо в нем разрешить. Делается это примерно вот так:
# Allow TUN interface connections to OpenVPN server
iptables -A INPUT -i tun+ -j ACCEPT
# Allow TUN interface connections to be forwarded through other interfaces
iptables -A FORWARD -i tun+ -j ACCEPT
# Allow TAP interface connections to OpenVPN server
iptables -A INPUT -i tap+ -j ACCEPT
# Allow TAP interface connections to be forwarded through other interfaces
iptables -A FORWARD -i tap+ -j ACCEPT

Резюме
Мы установили и настроили VPN-сервер и несколько VPN-клиентов. Клиент мо-
жет использовать ОС Linux или Windows, мы знаем как производить настройку
на обеих ОС. Весь трафик клиентов проходит через VPN-сервер, благодаря за-
данию опции redirect-gateway и назначению маршрута по умолчанию.

Домашнее задание
Развернуть три виртуальные машины – VPN-сервер и два клиента, Linux-
клиент и Windows-клиент. Произвести настройку виртуальных машин в
соответствие с руководством в этом модуле. Убедиться, что все работает.

Модуль 16. OpenVPN. 247


Отказоустойчивый кластер

Кластер – это группа компьютеров объединенных в одну систему для


выполнения совместных вычислений.
Есть три вида кластеров:
1. Отказоустойчивые кластеры (HA, High-availability clusters) – задача таких
кластеров обеспечивать бесприбойность работы сервисов, которые он
обслуживает. При реализации такого кластера необходимо задействовать
не менее двух серверов, каждая нода дублирует другую и в случае ее
выхода из строя сразу же берет работу на себя и обслуживает запросы;
2. Высокопроизводительные кластеры (HPC, High-performance clusters)
– задача таких кластеров увеличивать скорость вычисления. Все
вычисления разбиваются на параллельно выполняющиеся потоки.
Программное обеспечение должно поддерживать работу в таком
режиме;
3. Кластеры с распределением нагрузки (LB, Load balancing clusters) –
принцип работы таких кластеров заключается в распределение нагрузки.
Входящие запросы проходят через первичный узел (Director) который
занимается распределением нагрузки между вычислительными нодами.
В этом модуле мы сделаем отказоустойчивый кластер состоящий из двух
нод и запустим на нем веб-сервер Apache. Программное обеспечение
которое нам понадобится – это DRBD, для зеркалирования разделов между
двумя нодами, ведь при выходе одной ноды из строя вторая должна сразу
включиться в работу и начать обслуживать запросы. А значит на ней всегда
должна быть актуальная версия контента, в этом как раз DRBD нам и поможет,
он работает по принципу RAID 1, при записи данных на основной ноде,
они сразу же будут записаны и на вторую. Вторая программа – Heartbeat,
она занимается интеллектуальной работой, следит за состоянием нод и
принимает решения. Подробнее об этих программах ниже.

Принцип работы нашего кластера


Принцип работы отказоустойчивого кластера можно разбить на три этапа.
1. На постоянной основе происходит репликация данных с первичной
ноды на вторичную, в этом нам помогает DRBD. Таким образом в любой
момент времени контент приложений, на первичной ноде и вторичной
полностью идентичен;
2. Для предоставления сервиса используется специально для этого
выделенный IP-адрес, shared IP-адрес. Средствами Heartbeat он
прописывается как алиас на первичной ноде;

248 Модуль 17. Отказоустойчивый кластер.


3. В случае выхода из строя первичной ноды, вторичная нода переключается
в режим первичной и назначает себе shared IP. С этого момента все
запросы обслуживает вторичная нода (теперь став первичной).
Конечный пользователь не заметит изменений в работе сервиса, так
как переключение происходит достаточно быстро + контент является
полностью актуальным.

DRBD
DRBD (Distributed Replicated Block Device) – распределенное и
синхронизированное блочное устройство, это программное обеспечение
для зеркалирования контента блочных устройств (HDD, partitions, logical
volumes...). По своей работе, DRBD очень похож на RAID1, данные на разных
нодах также реплицируются в режиме реального времени. В свою очередь
для приложений DRBD полностью прозрачен и они даже не догадываются
о том, что фактически их данные хранятся на нескольких серверах. Запись
данных на носитель может происходит двумя способами – синхронный,
когда записывающее приложение уведомляется о том, что запись завершена
только после того как данные будут записаны на все ноды, и асинхронный
– это когда записывающее приложение уведомляется сразу после записи на
локальном носителе, не дожидаясь аналогичных действий на peer-системе.

Место DRBD в стеке ввода/вывода Linux

Модуль 17. Отказоустойчивый кластер. 249


Программы входящие в состав пакета DRBD
drbdadm Основная программа администрирования DRBD, все параметры она
получает из конфигурационного файла /etc/drbd.conf. drbdadm выступает
в качестве фронтенда для такие программ как drbdsetup и drbdmeta;
drbdsetup Программа конфигурирования модуля DRBD, параметры задаются
из командной строки что делает программу гибкой, но повышает
сложность для новичков, используется редко;
drbdmeta Программа позволяет создавать, резервировать и восстанавливать DRBD
meta data structures, используется редко.

Для описания устройства хранения (storage) используется понятие ресурса,


которое описывает все его аспекты, такие как:
Имя ресурса – имя не должно содержать пробелы, в последствие мы будет
использовать это имя чтобы ссылаться на какое либо устройство.
DRBD устройство – это виртуальное блочное устройство управляемое DRDB.
Ассоциированное блочное устройство всегда именуется как /dev/drbdm,
где m – младший номер устройства, который начинается с 0. Старший номер
устройства равняется 147.
Disk configuration – физический диск или раздел содержащий данные.
Network configuration – IP-адрес и порт дублирующей ноды.

В DRBD каждый ресурс играет свою роль, - первичную (primary) или


вторичную (secondary). В случае если DRBD устройство является primary,
оно может читать и записывать данные без ограничений, создавать и
монтировать файловые системы и т.д.
Если DRBD устройство является secondary то оно получает все обновления
данных с primary (любые добавления, изменения или удаления данных) но
не дает прямой доступ к устройству. То есть приложения не смогут читать и
писать данные на устройство. Роль ресурса может изменяться вручную или
автоматически.

DRBD поддерживает три режима репликации.


Protocol A. Протокол асинхронной репликации, данные на primary node
считаются полностью записанными тогда, когда запись завершается на
локальном носители и пакет отправлен в TCP буфер отправки. Этот режим
может повлечь за собой потерю данных, если сбой произойдет раньше чем
данные будут продублированы на вторичной ноде.
Protocol B. Протокол полусинхронной репликации (Memory synchronous),

250 Модуль 17. Отказоустойчивый кластер.


данные считаются полностью записанными тогда, когда запись завершается
на локальном носители и пакет достигает удаленной системы (peer node).
Protocol C. Протокол синхронной репликации, данные на primary node
считаются полностью записанными тогда, когда запись завершается на
локальном носителе и получено подтверждение о том, что данные успешно
записаны на удаленной ноде. Конечно и с этим протоколом возможна потеря
данных, если данные на обоих узлах будут разрушены одновременно.

Heartbeat
Heartbeat – это сервис для управления узлами кластера. Который занимается
запуском/остановом сервисов, мониторингом доступности систем в
кластере и сменой владельца общего IP-адреса если primary node приходит
в неработоспособное состояние.
Heartbeat может обслуживать веб-сервера, почтовые сервера, DNS-сервера,
сервера баз данных и т.д.

Именование серверов
Наш кластер будет состоять из двух нод, названных node1.company.ru
(192.168.146.150) и node2.company.ru (192.168.146.134).
В конфигурационных файлах DRBD и Heartbeat должны использоваться
имена нод выводимых по команде uname -n
Указать hostname для сервера можно в файле /etc/sysconfig/network в опции
HOSTNAME, после этого нужно перезагрузить сервер.
Если использование DNS не предполагается то укажите соответствие IP-
адресов к именам в файле /etc/hosts обоих серверов
# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.146.134 node2.company.ru
192.168.146.150 node1.company.ru

Установка ПО
Пару лет назад в репозиторий CentOS были включены пакеты drbd и
heartbeat, теперь установка и настройка кластера стала еще проше.
Устанавливаем HeartBeat, DRBD и модуль для DRBD - kmod-drbd, дополнительно
как зависимости будут установлены пакеты heartbeat-pils и heartbeat-stonith.
# yum -y install heartbeat drbd kmod-drbd

Модуль 17. Отказоустойчивый кластер. 251


Обращаю внимание что heartbeat может не установиться с первого раза
выдав такую ошибку:
error: %pre(heartbeat-2.1.3-3.el5.centos.i386) scriptlet failed, exit status 9
error: install: %pre scriptlet failed (2), skipping heartbeat-2.1.3-3.el5.centos

Просто повторите установку heartbeat командой


# yum -y install heartbeat

Добавляем Heartbeat в автозагрузку при старте сервера. Для DRBD это не


требуется так как добавление происходит автоматические при установке
пакета.
# chkconfig heartbeat on

Собственно на этом установка подошла к концу, веб-сервер Apache мы


установим и настроим позже, после того сделаем наш кластер.

Настройка DRBD
Первым шагом мы настроим DRBD и убедимся что он работает правильно.
В нашей системе два HDD, /dev/sda и /dev/sdb. /dev/sda – это системный диск
на котором установлена ОС, /dev/sdb мы будем использовать в качестве
устройства DRBD, постоянно реплицируя его с аналогичным диском на
другой ноде.
# fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System


/dev/sda1 * 1 978 7855753+ 83 Linux
/dev/sda2 979 1043 522112+ 82 Linux swap / Solaris

Disk /dev/sdb: 8589 MB, 8589934592 bytes


255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table


DRBD управляется с помощью одного конфигурационного файла – /etc/drbd.
conf. Структуру файла можно представить тремя секциями.
Global section – секция может быть описана только один раз и содержит в

252 Модуль 17. Отказоустойчивый кластер.


себе глобальные настройки распространяемые на все ресурсы.
Common section – секция полезна если используется несколько ресурсов и
необходимо предоставлять ряд настроек для конкретных ресурсов.
Resource section – секция описания ресурса, в ней также должна быть
подсекция on host, для каждой кластерной ноды.

Конфигурационный
ф ур ц ф
файл /etc/drbd.conf на обеих нодах
д
global { usage-count yes; }
common { syncer { rate 20M; } }
resource r0 {
protocol C;
startup {

}
disk {
on-io-error detach;
}
net {
}
on node1.company.ru {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.146.150:7789;
meta-disk internal;
}
on node2.company.ru {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.146.134:7789;
meta-disk internal;
}
}

[root@node1 ~]# drbdadm create-md r0


[root@node2 ~]# drbdadm create-md r0
v08 Magic number not found
v07 Magic number not found
v07 Magic number not found
v08 Magic number not found
Writing meta data...
initialising activity log
NOT initialized bitmap
New drbd meta data block sucessfully created.
success

Модуль 17. Отказоустойчивый кластер. 253


Не обращайте внимание на сообщения “not found”.
[root@node1 ~]# service drbd start

После запуска DRBD на первичной ноде она перейдет в режим ожидания


вторичной, и не запуститься пока не получит от нее отклик.
***************************************************************
DRBD's startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 0 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 0 seconds. [wfc-timeout]
(These values are for resource 'r0'; 0 sec -> wait forever)
To abort waiting enter 'yes' [ 58]:

[root@node2 ~]# service drbd start


[root@node1 ~]# cat /proc/drbd

version: 8.0.13 (api:86/proto:86)


GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386-
build, 2008-10-02 13:31:44
0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Если видим строку


0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
то все хорошо, продолжаем. st: означает статус, обе ноды в secondary
режиме, нам необходимо node1 перевести в primary, делается это вот такой
командой:
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary r0

После этого начнется процесс синхронизации нод.

Запустив 'watch cat /proc/drbd' на отдельной консоли можем в реальном


времени наблюдать за процессом синхронизации наших разделов.
[root@node1 ~]# watch cat /proc/drbd

254 Модуль 17. Отказоустойчивый кластер.


Every 2.0s: cat /proc/drbd Sun Apr 26 20:04:58 2009

version: 8.0.13 (api:86/proto:86)


GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386-
build, 2008-10-02 13:31:44
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:1936384 nr:0 dw:0 dr:1936384 al:0 bm:118 lo:0 pe:0 ua:0 ap:0
[===>................] sync'ed: 23.1% (6300/8191)M
finish: 0:09:28 speed: 11,304 (10,244) K/sec
resync: used:0/61 hits:120905 misses:119 starving:0 dirty:0 changed:119
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
После завершения синхронизации убедимся, что статус устройства
изменился.
[root@node1 ~]# cat /proc/drbd
version: 8.0.13 (api:86/proto:86)
GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386-
build, 2008-10-02 13:31:44
0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
ns:8388316 nr:0 dw:0 dr:8388316 al:0 bm:512 lo:0 pe:0 ua:0 ap:0
resync: used:0/61 hits:523758 misses:512 starving:0 dirty:0 changed:512
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Также, статус можно посмотреть с помощью команды drbdadm.


[root@node1 ~]# drbdadm dstate r0
UpToDate/UpToDate

[root@node2 ~]# drbdadm dstate r0


UpToDate/UpToDate

Ресурс полностью синхронизирован и готов к работе!

Создаем файловую систему на нашем диске.


[root@node1 ~]# mkfs -t ext3 /dev/drbd0

Создаем точку монтирования для нашего диска.


[root@node1 ~]# mkdir /mnt/drbd0

Монтируем диск
[root@node1 ~]# mount /dev/drbd0 /mnt/drbd0/

Модуль 17. Отказоустойчивый кластер. 255


Запросив статус DRBD мы можем выяснить смонтировано ли устройство или нет.
[root@node1 ~]# service drbd status
drbd driver loaded OK; device status:
version: 8.0.13 (api:86/proto:86)
GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386-
build, 2008-10-02 13:31:44
m:res cs st ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/drbd0 ext3

Ну а теперь давайте поработаем с нашей файловой системой. Создадим


файл.

[root@node1 ~]# echo ‘test content’ > /mnt/drbd0/testfile

Итак, мы установили DRBD, настроили, синхронизировали ноды, сделали


node1 primary node, создали там контент. Нам только осталось выяснить
происходит ли репликация, в случае выхода из строя primary node сможет
ли secondary продолжить работу?

Для того чтобы это выяснить делаем следующее.

Отмонтируем устройство

[root@node1 ~]# umount /mnt/drbd0/

Понижаем роль node1 до вторичной ноды

[root@node1 ~]# drbdadm secondary r0

Повышаем роль node2 до первичной ноды

[root@node2 ~]# drbdadm primary r0

Создаем директорию куда мы будем монтировать устройство. Очевидно раз


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

256 Модуль 17. Отказоустойчивый кластер.


[root@node2 ~]# mkdir /mnt/drbd0

Монтируем устройство
[root@node2 ~]# mount /dev/drbd0 /mnt/drbd0

Проверяем статус, как мы видим устройство успешно примонтировано.


[root@node2 ~]# service drbd status

drbd driver loaded OK; device status:


version: 8.0.13 (api:86/proto:86)
GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386-
build, 2008-10-02 13:31:44
m:res cs st ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/drbd0 ext3

Ну что там в нашем файле ? :)


[root@node2 ~]# cat /mnt/drbd0/testfile
test content

Волшебство, весь контент в самом свежем виде присутствует на node2. Все


функционирует должным образом. Теперь вернем обратно роль первичного
сервера node1 и продолжим настройку кластера, будем настраивать
Heartbeat.
[root@node2 ~]# umount /mnt/drbd0/
[root@node2 ~]# drbdadm secondary r0
[root@node1 ~]# drbdadm primary r0
[root@node1 ~]# mount /dev/drbd0 /mnt/drbd0

Активность DRBD можно наблюдать в log-файле


[root@node1 ~]# cat /var/log/messages

Настройка Heartbeat
Файлы конфигурации Heartbeat на обеих нодах должны быть идентичными.
Копируем шаблоны файлов конфигурации в /etc/ha.d/
# cp /usr/share/doc/heartbeat-2.1.3/{ha.cf,authkeys,haresources} /etc/ha.d/
Конфигурационные файлы Heartbeat.

Модуль 17. Отказоустойчивый кластер. 257


ha.cf Главный конфигурационный файл;
haresources Файл ресурсов;
authkeys Файл аутентификации.

Необходимо убедиться, что название нод указанное в конфигурационных


файлах соответствует содержимому команды uname -n.
[root@node1 ~]# uname -n
node1.company.ru
[root@node2 ~]# uname -n
node2.company.ru

Конфигурационный
ф ур ц файл
ф /etc/ha.d/authkeys
y
В файле конфигурации мы выбираем режим аутентификации и указываем
секретную фразу по которой она будет происходить. Секретная фраза
должна быть одинаковой на обеих нодах. Далее на этот файл необходимо
установить право на чтение только пользователю root, для этого выполните
команду chmod указанную ниже. Рекомендуется использовать sha1 как в
примере.
auth 2
2 sha1 NoOneKnowsIt

# chmod 600 /etc/ha.d/authkeys

Конфигурационный
ф ур ц файл
ф /etc/ha.d/ha.cf
Это главный конфигурационный файл и поведение Heartbeat задается
здесь.
logfacility local0
keepalive 2
deadtime 30
initdead 120
bcast eth0
auto_failback on
node node1.company.ru
node node2.company.ru
respawn hacluster /usr/lib/heartbeat/ipfail
use_logd yes
logfile /var/log/ha.log
debugfile /var/log/ha-debug.log

После того, как файл конфигурации готов создадим log-файлы.

258 Модуль 17. Отказоустойчивый кластер.


# touch /var/log/{ha.log,ha-debug.log}

Конфигурационный
ф ур ц файл
ф /etc/ha.d/haresources
В этом файле описываются наши ресурсы для управления с помощью
Heartbeat.
node1.company.ru IPaddr::192.168.146.140/24 drbddisk::r0 \
Filesystem::/dev/drbd0::/mnt/drbd0::ext3::defaults httpd

Содержимое файла можно прочитать вот так:

При старте Heartbeat, node1 будет primary node с shared IP-адресом


192.168.146.140, drbddisk – это диск описанный в ресурсе r0 (/etc/drbd.
conf ), устройство /dev/drbd0, файловая система /mnt/drbd0, это именно та
файловая система которая будет доступна для приложений, используется
тип файловой системы ext3 с опциями по умолчанию, после монтирования
ФС необходимо запустить сервис httpd.

Как мы видим именно здесь задается shared IP-адрес, это тот самый IP-
адрес по которому пользователи должны обращаться к вашим сервисам.
Если первичная нода станет недоступна то этот IP-адрес будет назначен
вторичной ноде которая станет первичной и начнет обрабатывать запросы.
Такой подмены пользователи не заметят и сервис будет предоставляться
без перебоев, а именно это нам и нужно. Укажите здесь любой свободный
IP-адрес из вашей сети и закрепите его за кластером.

После того как файлы конфигурации Heartbeat на обеих нодах будут готовы,
можно запускать сервис.

Наш кластер почти готов, как вы помните повышать отказоустойчивость


мы будем веб-сервера, поскольку DRBD и Heartbeat готовы к работе, самое
время установить Apache.
# yum -y install httpd

Настройки в httpd.conf по умолчанию или те, которые освещаются в модуле


про Apache. Для нас самое главное – это секция виртуального хоста, в
которой мы опишем сайт нашей компании. В конец файла /etc/httpd/conf/
httpd.conf добавляем секцию виртуального хоста

Модуль 17. Отказоустойчивый кластер. 259


<VirtualHost *:80>
ServerAdmin support@company.ru
DocumentRoot /mnt/drbd0/
ServerName company.ru
ServerAlias www.company.ru
DirectoryIndex index.html
ScriptAlias /cgi-bin/ /mnt/drbd0/cgi-bin/
ErrorLog /mnt/drbd0/logs/error_log
CustomLog /mnt/drbd0/logs/access_log common

RewriteLog /mnt/drbd0/logs//rewrite.log
RewriteLogLevel 1
</VirtualHost>

Создаем структуру папок для веб-сервера.

[root@node1 ~]# mkdir /mnt/drbd0/{logs,cgi-bin}

Создаем log-файлы

[root@node1 ~]# touch /mnt/drbd0/logs/{access.log,error.log,rewrite.log}

Создаем индексный файл

[root@node1 ~]# echo 'High-availability Page' > /mnt/drbd0/index.html

Запускаем Heartbeat, при старте он запустит Apache.

[root@node1 ~]# service heartbeat start

Starting High-Availability services:


2009/04/26_21:29:04 INFO: Resource is stopped
[ OK ]

В выводе команды ifconfig вы заметите что был создан сетевой алиас (eth0:0),
это виртуальный интерфейс с назначенным ему IP-адресом. В случае выхода
первичной ноды он будет переназначен на вторичной и она став первичной
будет обрабатывать запросы!

[root@node1 ~]# ifconfig

260 Модуль 17. Отказоустойчивый кластер.


eth0 Link encap:Ethernet HWaddr 00:0C:29:77:9C:9C
inet addr:192.168.146.150 Bcast:192.168.146.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe77:9c9c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2743855 errors:0 dropped:0 overruns:0 frame:0
TX packets:6180468 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:203601157 (194.1 MiB) TX bytes:691044303 (659.0 MiB)
Interrupt:59 Base address:0x2000

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:77:9C:9C


inet addr:192.168.146.140 Bcast:192.168.146.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:59 Base address:0x2000

lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:32 errors:0 dropped:0 overruns:0 frame:0
TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3637 (3.5 KiB) TX bytes:3637 (3.5 KiB)
[root@node2 ~]# service heartbeat start

Попробуйте в браузере обратиться к нашему веб-серверу. Чтобы веб-сервер


понял что от него хотят заголовок запроса должен содержать нужный нам
хост. Пропишете в файл hosts такую запись:
192.168.146.140 company.ru
192.168.146.140 www.company.ru

Файл hosts в Linux находится в /etc/, в Windows C:\WINDOWS\system32\


drivers\etc

Вы должны увидеть нашу страницу index.html с текстом “High-availability


Page ”. Если это так то продолжаем, если она не показывается то внимательно
перечитываем все выше написанное.

Теперь надо убедится что при недоступности одной ноды работу будет
выполнять вторая.

Берем и просто отключаем Heartbeat на node1, в свою очередь он выключит


веб-сервер и перейдет в режим secondary node.
[root@node1 ~]# service heartbeat stop
Еще раз запрашиваем страницу в браузере и замечаем что все продолжает работать.

Модуль 17. Отказоустойчивый кластер. 261


Виртуальный интерфейс переместился на Node2, там же запустился Apache
и начал сразу же обрабатывать запросы. Вторичная нода стала первичной.

[root@node2 ~]# service drbd status

drbd driver loaded OK; device status:


version: 8.0.13 (api:86/proto:86)
GIT-hash: ee3ad77563d2e87171a3da17cc002ddfd1677dbe build by buildsvn@c5-i386-
build, 2008-10-02 13:31:44
m:res cs st ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C /mnt/drbd0 ext3

[root@node2 ~]# ifconfig


eth0 Link encap:Ethernet HWaddr 00:0C:29:25:04:55
inet addr:192.168.146.134 Bcast:192.168.146.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe25:455/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6180400 errors:2 dropped:2 overruns:0 frame:0
TX packets:2742239 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:693847272 (661.7 MiB) TX bytes:200769641 (191.4 MiB)
Interrupt:59 Base address:0x2000

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:25:04:55


inet addr:192.168.146.140 Bcast:192.168.146.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:59 Base address:0x2000

lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:34 errors:0 dropped:0 overruns:0 frame:0
TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3798 (3.7 KiB) TX bytes:3798 (3.7 KiB)

После того как node1 будет починена ее можно вернуть на первичную роль.
[root@node1 ~]# service heartbeat start
[root@node2 ~]# service heartbeat stop
[root@node2 ~]# service heartbeat start

Теперь проведем более жесткий тест. Сделаем имитацию потери


подключения ноды к сети. Выдерните сетевой кабель из node1, если это

262 Модуль 17. Отказоустойчивый кластер.


физический сервер или просто наберите команду ниже:

[root@node1 ~]# ifdown eth0

В течение нескольких секунд виртуальный интерфейс должен мигрировать


на node2 и работа веб-сервера продолжится. После того, как вы это заметите,
верните подключение на node1:

[root@node1 ~]# ifup eth0

Через несколько секунд node1 опять станет primary node и начнет


обслуживать подключения, потому что “auto_fallback on”.

На этом построение отказоустойчивого кластера подошло к успешному завершению.

Конфигурационный
ф ур ц файл
ф /etc/drbd.conf
minor-count По умолчанию модуль DRBD загружается с minor-
count 32, если используется много устройств и
номеров не хватает их можно явно указать здесь;
dialog-refresh Обновление экрана каждые n секунд, может
быть полезно при подключение к серверу по
последовательному интерфейсу;
disable-ip-verification Позволяет отключить одну из проверок drbdadm;
usage-count Участвовать в глобальном подсчете пользователей
DRBD или нет;
common {...} Секция, опции которой наследуют все ресурсы;
syncer Позволяет задать пропускную способность при син-
хронизации устройств по сети, разработчики реко-
мендуют использовать 30% от возможностей сети. На-
пример, если у вас 100 Мбит сеть, то 100 * 0.3 = 30 Мб;
resource r0 {...} Секция описания ресурса;
protocol Задает протокол для DRBD, подробнее о них
написано выше;
handlers {...} Задает обработчики, например что делать в случае
потери соединения первичной ноды;
startup {...} Секция для опций используемых в процессе
загрузки DRBD;
wfc-timeout Ожидание таймаута соединения;
degr-wfc-timeout Ожидание таймаута подключения, в случае если в
кластере одна рабочая нода;

Модуль 17. Отказоустойчивый кластер. 263


wait-after-sb Ожидание после split brain, ситуация когда все ноды
могут попытаться запустить сервис одновременно,
думая что другие ноды недоступны. В свою очередь
это может повлечь за собой повреждение данных;
disk {...} Секция с настройками оповещения верхних
уровней, если замечено, что происходят I/O ошибки
при обращение к диску;
on-io-error detach Нода перестает работать с носителем данных если
на нем происходят I/O ошибки;
fencing Процесс блокировки ресурсов с нод статус которых
сомнителен;
net {...} Секция задает различные опции сети, такие как
размеры буфера, максимальное число запросов
обрабатываемых DRBD. В обычных ситуациях
значений по умолчанию достаточно;
on host {...} Секция описания нод;
device Указывает на устройство DRBD, они расположены в
/dev/ и начинаются с 0;
disk Физический диск или раздел, который будет
задействован в работе DRBD;
address IP-адрес и порт этой ноды, нужно указывать именно
ее IP-адрес а не shared IP;
meta-disk Meta данные могут храниться на отдельном разделе/
диске а могут на диске описанном в опции disk;
max-buffers Число буферов используемых для хранения данных,
пока те записываются на диск;
max-epoch-size Максимальное число запросов на запись. Должно
соответствовать max-buffers;
timeout Эти значения можно повысить если наблюдаются
ping-int обрывы связи;

Значения опций в выводе cat /proc/drbd

Информация о ресурсе
cs connection state
ro roles
ds disk states
ns network send

264 Модуль 17. Отказоустойчивый кластер.


nr network receive
dw disk write
dr disk read
al activity log
bm bit map
lo local count
pe pending
ua unacknowledged
ap application pending

Возможный статус соединения

StandAlone Не доступна сетевая конфигурация. Этот ресурс еще


не был подключен или был административно отклю-
чен (drbdadm disconnect), или сбросил сетевое под-
ключение из за не пройденной аутентификации или
split brain;
Disconnecting Временное состояние пока происходит отключение,
следующее состояние – StandAlone;
Unconnected Временное состояние до попытки подключения. Сле-
дующее возможное состояние – WFConnection или
WFReportParams;
Timeout Временное состояние после перерыва связи с peer-ом.
Следующее возможное состояние – Unconnected;
BrokenPipe Временное состояние после потери связи с peer-ом.
Следующее возможное состояние – Unconnected;
NetworkFailure Временное состояние после потери связи с пар-
тнером. Следующее возможное состояние –
Unconnected;
ProtocolError Временное состояние после потери связи с пар-
тнером. Следующее возможное состояние –
Unconnected;
TearDown Временное состояние, peer закрывает соединение.
Следующее возможное состояние – Unconnected;
WFConnection Нода ожидает пока peer станет виден в сети;
WFReportParams TCP соединение было установлено, нода ожидает
первый сетевой пакет от peer-ра;
Connected DRBD соединение установлено, зеркалирование дан-
ных активно. Это нормальное состояние;
StartingSyncS Начата полная синхронизация, выполняется адми-
нистратором. Следующее возможное состояние –
SyncSource или PausedSyncS;

Модуль 17. Отказоустойчивый кластер. 265


StartingSyncT Начата полная синхронизация, выполняется адми-
нистратором. Следующее возможное состояние –
WFSyncUUID;
WFBitMapS Частичная синхронизация начата. Следующее воз-
можное состояние – SyncSource или PausedSyncS;
WFBitMapT Частичная синхронизация начата. Следующее воз-
можное состояние – WFSyncUUID;
WFSyncUUID Синхронизация скоро начнется. Следующее возмож-
ное состояние – SyncTarget или PausedSyncT;
SyncSource Синхронизация запускается, локальная нода являет-
ся источником синхронизации;
SyncTarget Синхронизация запускается, локальная нода являет-
ся целью синхронизации;
PausedSyncS Локальная нода источник синхронизации, но синхро-
низация находится в режиме паузы;
PausedSyncT Локальная нода является целью синхронизации, но
синхронизация находится в режиме паузы;
VerifyS Запускается онлайн верификация, локальная нода
является источником верификации;
VerifyT Запускается онлайн верификация, локальная нода
является целью верификации.

Роли ресурсов

Primary Primary node;


Secondary Secondary node;
Unknown Роль ресурса неизвестна. Локальный ресурс не
бывает в этой роли. Она отображается только для
ресурса peer-ра в отключенном режиме.

Возможное состояние диска

Diskless Драйверу DRBD не назначено блочное устройство;


Attaching Переходное состояние пока считываются meta данные;
Failed Переходное состояние последовавшее за I/O ошибкой
локального блочного устройства, следующее возмож-
ное состояние – Diskless;
Negotiating Переходное состояние пока налаживается соединение;
Inconsistent Данные непоследовательны. Это статус нового ресурса;
Outdated Данные ресурса последовательны но устарели;

266 Модуль 17. Отказоустойчивый кластер.


DUnknown Статус используется для peer-ра если не доступно сете-
вое подключение;
Consistent Последовательные данные ноды без сетевого подклю-
чения. После подключения будет решено, данные явля-
ются актуальными или устаревшими;
UpToDate Все данные в актуальном состояние. Это нормально со-
стояние.

Конфигурационный
ф ур ц файл
ф /etc/ha.d/ha.cf
debugfile Задает расположение файла для записи отладочной инфор-
мации;
logfile Задает расположение файла для записи всей остальной ин-
формации;
logfacility Опция для Syslog;
keepalive Как часто проверять состояние другой ноды, указывается в
секундах;
deadtime Как быстро нужно решить, что удаленная нода вышла из
строя, указывается в секундах;
warntime Через какой промежуток времени после последнего ответа
от удаленной ноды генерировать предупреждение;
initdead На некоторых серверах и ОС, сетевой интерфейс начинает
работать правильно только после перезагрузки, для коррект-
ной обработки ситуации введен дополнительный счетчик;
udpport UDP порт для broadcast/unicast запросов;
baud Скорость для последовательного соединения;
serial Устройство для последовательного соединения;
bcast Через какой интерфейс отправлять broadcast-запросы
Heartbeat;
mcast Интерфейс для multicast-запросов, если используется;
ucast Интерфейс для unicast-запросов, если используется;
auto_failback Переключаться ли обратно на primary node после ее восста-
новления:
on – переключаться;
off – secondary node продолжит работать как primary node;
legacy – включать auto_failback в системах, где все ноды еще
не поддерживают опцию auto_failback;
stonith Опция используется только в первой версии Heartbeat;
watchdog Позволяет включить Watchdog timer, если наш собственный
Heartbeat не ответит в течение минуты то сервер будет пере-
загружен;

Модуль 17. Отказоустойчивый кластер. 267


node Задает ноду;
ping Позволяет пинговать сетевое устройство, например свой
шлюз, используется для определения работоспособности
сети;
respawn Процессы стартуют и останавливаются вместе с Heartbeat,
ipfail определяет какая нода имеет лучшее сетевое подклю-
чение, в случае если нода теряет сетевое подключение или
испытывает большие затруднения в передаче трафика, ipfail
заметит это и роль primary node может быть передана другой
ноде;
apiauth API authorization directive;
debug Задает уровень отладки;
use_logd Использовать ли logging daemon;
conn_logd_time Интервал переподключения к logd;
compression Здесь указывается модуль компрессии.

Таблица ниже позволяет оценить доступность сервиса в процентах в год.

Доступность сервиса в % в год Недоступность сервиса в мин./часах в год


99.9999% 30 сек
99.999% 5 минут
99.99% 52 минуты
99.9% 9 часов
99% 3 с половиной дня

Резюме
В этом модуле мы выяснили какие виды кластеров бывают. Подробнее
разобрали принцип работы отказоустойчивого кластера, узнали о
программном обеспечение которое нам может помочь в его построение и
удачно воспользовались им. Мы установили и настроили наш кластер на базе
DRBD и Heartbeat, далее развернули веб-сервер Apache и протестировали
его работу. Это была простая конфигурация кластера, но полученный опыт
является хорошим фундаментом для дальнейших исследований.

Домашнее задание
На двух виртуальных машинах построить отказоустойчивый кластер для
веб-сервера и убедиться, что все работает.

268 Модуль 17. Отказоустойчивый кластер.