Главная | Контакты



Главная > Операционные системы > UNIX > BSD > FreeBSD

Настройка домашнего сервера, выполняющего роли веб-сервера,
почтового сервера и фтп-сервера

Всем привет!

Сразу оговорюсь, что описанное здесь решение превосходно подойдёт и для использования в малых и средних организациях. А может, даже и в крупных...

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

Ну, а для тех, кто заинтересовался, опишу то, что имеется:

- свой домен example.com с двумя DNS-записями вида:
- www.example.com. A <ваш белый IP-адрес>
- example.com. A <ваш белый IP-адрес>
- и записью MX вида:
- example.com. MX 10 example.com.
- Также, очень желательно бы сделать ещё и PTR-запись для вашего домена у провайдера. Но мой провайдер, к сожалению, отказал мне в этом, как физическому лицу.
- Имеем небольшую квартиру, в которой не особо много места для дополнительного системника и для дополнительного источника шума.

Домен можно зарегистрировать на www.nic.ru. Там же, и сделать все нужные записи на DNS-сервере. От себя скажу, что там это всё делается очень быстро и очень удобно, даже если вы вообще в первый раз подобной процедурой занимаетесь.

Ну, а что касается железа, то оно должно было отвечать параметрам: компактный; бесшумный; непрожорливый; с некоторым запасом производительности для моих нужд. Я остановился вот на такой подборке:

http://www.nix.ru/autocatalog/motherboards_asustek/ASUS_E35M1I_E350_Hudson_M1_PCIE_DVI_SATA_MiniITX_2DDRIII_119243.html
http://www.nix.ru/autocatalog/memory_modules_corsair/Corsair_XMS3_TW3X4G1333C9A_DDRIII_4Gb_2Gb_PC310600_58601.html
http://www.nix.ru/autocatalog/ssd_kingston/SSD_SATA_6Gb_Kingston_SSDNow_V200_SV200S37A_64G_127007.html
http://www.nix.ru/autocatalog/cases_antec/DeskTop_Antec_ISK100_MiniITX_90W_115600.html

Решение действительно получилось весьма компактное и бесшумное. А также весьма сердитое для своих таких размеров. Твердотел потому, что мне хотелось получить ударостойкую систему. Потому как, это чудо будет стоять у меня на столе, и, возможно, его придётся двигать с места на место иногда. К сожалению, денег хватило лишь на 64-ёхгиговый. Но, в будущем, планирую поставить второй твердотел более внушительного объёма.

Операционную систему я для своего сервера выбрал FreeBSD. Почему именно её? Да потому, что мне так захотелось. Хотя бы из-за того, что это мой первый сервер на FreeBSD, и ему всё равно когда-то суждено было быть.

Этап 1. Установка и общая подготовка сервера

Сперва наперво, сразу хочу показать, как у меня расположен сервер, относительно домашней сети:

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

Скачиваем свежий дистрибутив FreeBSD. На мой момент, это была девяточка:

ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-amd64-disc1.iso

И приступаем к установке. На этапе, когда установщик спрашивает: Would you like to set a non-default key mapping for your keyboard? Отвечаем yes и выбираем Russian koi8-r. Затем, система попросит указать имя нашего сервера. Я указал просто example.com (имя своего зарегистрированного домена). Потом установщик спросит, какие компоненты ставить. Выбираем lib32, ports и src. Далее, установщик спросит, как будем разбивать диск на партишены - жмём Manual и видим вот такую картинку:

Здесь я нажимаю кнопку Auto, а затем - кнопку Partition. Система нам покажет, как бы она разбила диск по умолчанию:

И вот здесь то я кое-что изменю. Для начала, удалю партишины ada0p2 и ada0p3. Затем, создам заново ada0p2, выбрав свой размер. И обязательно нажму кнопку Options при её создании:

для того, чтобы выбрать опцию TRIM, поскольку накопитель у меня твердотельный стоит:

Затем, добавляю своп-партишин ada0p3, делая его всего в один гигабайт:

Объясняю, почему именно так: Во-первых, чтобы выиграть хоть несколько дополнительных гигабайт свободного места. Во-вторых, на сервере у меня 4гб ОЗУ, коих должно хватить сполна для всех сервисов, поэтому не вижу необходимости в большом свопе.

После разбиения диска на партишены, нажимаем finish, а потом commit. Система начнёт устанавливаться. После установки, система попросит ввести пароль для root и предложит сконфигурировать подключение к сети, на что я соглашаюсь и ввожу свои сетевые реквизиты:

IP-адрес 192.168.0.100
маска 255.255.255.0
шлюз 192.168.0.1
ДНС 192.168.0.1

После конфигурирования сети, установщик спросит, настроены ли наши часы в БИОСе по всемирному координированному времени (UTC). В своём случае, я нажал no, поэтому установщик попросил меня указать мой часовой пояс.

Далее будет спрашиваться, какие демоны включить в автозагрузку. Я выбрал sshd и ntpd. А на дальнейший вопрос о том, хочу ли я, чтоб система создавала крашдампы при сбоях, я ответил отрицательно, ибо места на твердотеле итак мало.

Would you like to add users to the installed system now? Отвечаю положительно и создаю одного пользователя с банальным названием admin. Важный момент! Когда система задаст вот такой вопрос, о том, хотим ли мы пользователя включить в какие-либо дополнительные группы, то пишем группу wheel:

Включать пользователя в эту группу нужно для того, чтобы он потом смог принимать обличье root через команду su в удалённой сессии ssh. После создания пользователя установщик покажет окно с названием Final configuration, в котором выбираем exit. А на последующий вопрос, хотим ли мы что-то ещё вручную сконфигурировать в консоли, отвечаем отрицательно и перезагружаем машину. Во время перезагрузки на забудем зайти в БИОС и поставить загрузку с жёсткого диска.

На этом, система установлена. Но этого нам ещё очень и очень мало. Чтобы можно было комфортно работать, нам нужно установить несколько программ. Но чтобы это сделать, надо сначала обновить и проиндексировать порты. Сразу надо отметить, что в дальнейшем подразумевается, что наша машина с FreeBSD имеет прямой и не ограниченный выход в интернет. Поэтому, прежде, чем двигаться далее, убедитесь, что так оно и есть.

Заходим в систему под root и выполняем вот такие команды:

portsnap fetch update
portsnap extract

Обновление портов займёт некоторое время. Ждём. Ну а потом, лично я, сразу же ставлю программы, без которых мне не комфортно - это midnight commander и nano. Ставим миднайт коммандер:

cd /usr/ports/misc/mc
make install clean

Опции сборки миднайт коммандера я оставляю по умолчанию (они итак почти все включены). Но! Миднайт коммандер, по зависимости, потянет установку такого важного компонента, как perl. И вот в опциях его сборки нам надо выставить вот такие опции:

Эти возможности будут нужны для нашего вэб-сервера nginx, который мы позже будем ставить. Подробнее об этом тут. Также, mc потянет за собой и ещё несколько зависимостей. Здесь я приведу скриншоты сборки лишь тех компонентов, где я менял опции сборки. Это:

После установки mc ставим консольный текстовый редактор nano:

cd /usr/ports/editors/nano
make install clean

Затем, перезагружаем систему командой reboot.

Кстати, у меня, при загрузке системы и после того, как появляется приглашение в консоль, выскакивает некая ругань, связанная с демоном ntpd. Вот сейчас, когда у нас есть mc, частично решим эту проблему. Найдём файл /etc/hosts и закомментируем в нём строчку:

# ::1 localhost localhost.my.domain

Потому как IPv6 в нашей системе всё равно не используется. Частично проблема решена потому, что мы ещё пока не отключили поддержку IPv6 в самом ядре. Этим и не только мы сейчас займёмся. Нам желательно бы оптимизировать настройки ядра на предмет отключения в нём не только IPv6, но и лишних драйверов. Также, включим в ядре поддержку фаервола, ибо какой же сервер без фаервола. Но сначала подстрахуемся и сохраним наше текущее ядро на тот случай, если тюнинг ядра не удастся. Делаем команду:

cp -Rp /boot/kernel /boot/kernel.good

Если вдруг тюнингованное ядро окажется нерабочим, то здесь описано, как загрузиться со старым ядром. Теперь, переходим в каталог /usr/src/sys/amd64/conf и находим файл GENERIC. Тут же, делаем его копию с каким-нибудь своим названием. Например, я сделал с названием mykernel. Затем, надо отредактировать свой файл. Самым первым делом находим вот эту строчку:

ident GENERIC

И меняем её на ваше имя ядра:

ident mykernel

Затем отключаем IPv6:

# options INET6

А для активации фаервола добавляем в конец файла строчки:

# включить фаервол
options IPFIREWALL

# делать логи пакетов, для которых в правилах есть опция 'log'
options IPFIREWALL_VERBOSE

# Ограничение повторяющихся логов на случай атак типа флудинга.
options IPFIREWALL_VERBOSE_LIMIT=5

# включение перенаправления (проброса) пакетов.
options IPFIREWALL_FORWARD

# включение возможности NAT
options IPDIVERT

# Включение возможности ограничивать скорость трафика.
options DUMMYNET

# Почему-то, многие эту опцию включают. Но я не стал. Эта опция означает, что во время загрузки сервер будет открыт до тех пор, пока не включится фаервол.
# options IPFIREWALL_DEFAULT_TO_ACCEPT

Что касается остальных опций, относительно поддерживаемого железа, то тут у каждого будут свои настройки. Я стараюсь отключить всё лишнее. Хотя, кое-что, я думаю, можно отключить у всех, например, всё, что связано со звуком, firewire, usb wireless, да и вообще всё беспроводное отключить можно. Также и PCMCIA карты, флоппи, лишние raid-контроллеры.

Итак, после того, как всё-таки конфиг редактировать закончили, переходим в каталог /usr/src и там делаем команды:

make buildkernel KERNCONF=mykernel
make installkernel KERNCONF=mykernel

Когда ваше ядро соберётся и установится, то пока не спешите перезагружаться. Давайте сразу всё подготовим для фаервола. Во-первых, в файл /etc/rc.conf добавим строчки:

firewall_enable="YES"
firewall_type="/etc/ipfw.rules"
ipfw_enable="YES"

Потом создадим файл /etc/ipfw.rules вот с таким содержимым:

# сброс всех правил
-f flush

# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0

# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any

# разрешить прохождение пакетов со статусом 'установлен'
add 00075 allow tcp from any to any established

# разрешить весь ICMP-трафик
add 00100 allow icmp from any to any

# разрешить серверу обмениваться любым трификом со шлюзом
add 00150 allow all from 192.168.0.1 to me via em0

# Вот в этом правиле мы перечисляем открытые порты к нашему серверу. Можно заранее прописать всё нужное.
add 00170 allow tcp from any to me 22,10000,80,443,25,465,21 via em0

# Запретить всё остальное
add 10000 deny all from any to any

Примечание: em0 - эта так моя сетевуха назвалася в системе. Вот теперь перезагружаем сервер. Если ядро получилось работоспособное, то сервер нормально загрузится, и фаервол заработает.

Далее, я предлагаю русифицировать нашу систему. В этом мне помогла вот эта статья. Там перечислено несколько методов Но я выбрал для себя один. Для начала, находим в файле /etc/rc.conf строчку: keymap="ru.koi8-r.kbd" и сразу после неё добавляем ещё четыре:

scrnmap="koi8-r2cp866"
font8x16="cp866b-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"

Сохраняем изменения. Затем, надо внести изменения ещё в два файла. Сначала находим файл /etc/profile и добавляем в него строчки:

LANG=ru_RU.KOI8-R; export LANG
MM_CHARSET=KOI8-R; export MM_CHARSET

Потом находим файл /etc/csh.login и в него добавляем:

setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R

После чего, перезагружаем систему и радуемся родному языку.

Примечание: для того, чтобы русские символы отображались корректно, вам нужно в своём ssh-клиенте, которым вы, в дальнейшем, будете подключаться к серверу, указать кодировку KOI8-R. Я, как линуховод, вначале съел собаку на этом этапе, позабыв, что в федоре у меня кодировка UTF-8. Но после того, как в konsole переключил кодировку на KOI8-R, всё стало нормально.

Продолжим. В дальнейшем нам понадобится одна наиполезнейшая программа под названием Webmin, ибо через неё многие вещи очень удобно делать. Поэтому установим webmin:

cd /usr/ports/sysutils/webmin
make install clean

После установки, запустим скрипт конфигурирования /usr/local/lib/webmin/setup.sh, который задаст кое-какие вопросы:

Log file directory [/var/log/webmin]: жмём энтер
Full path to perl (default /usr/bin/perl): жмём энтер
Web server port (default 10000): если надо, то порт можно изменить на другой подходящий. Я менять не стал.
Login name (default admin): здесь тоже на ваше усмотрение. Я оставил админа.
Login password: вводим пароль
Use SSL (y/n): вот здесь я ответил положительно. Вдруг когда-нибудь придётся заходить на сервер извне...

После завершения скрипта конфигурирования можно пользоваться вебмином зайдя вот так: https://192.168.0.100:10000. И не забудем в файл rc.conf добавить строчку:

webmin_enable="YES"

Также, не забудем и переключить вебмин на русский язык с локалью KOI8-R. Это делается в меню Webmin --> Webmin Configuration --> Language.

Следующее, что очень желательно сделать для общей подготовки сервера - это установить Apcupsd, чтобы сервер корректно выключался при отключении электричества. Вы же не забыли подключить сервер к ИБП? Установим apcupsd:

cd /usr/ports/sysutils/apcupsd
make install clean

Опции сборки я оставил по умолчанию. Не забываем в rc.conf добавить строчку:

apcupsd_enable="YES"

Затем, найдём файл конфигурации /usr/local/etc/apcupsd/apcupsd.conf и отредактируем некоторые строчки. Во FreeBSD надо будет внести несколько изменений в конфиг:

# Кабель, которым ИБП подсоединён к серверу.
UPSCABLE usb

# Тип ИБП
UPSTYPE usb

# этот параметр оставляем пустым
DEVICE

# уровень заряда батареи, при котором сервер начнёт выключаться
BATTERYLEVEL 10

# оставшееся время работы батареи, меньше которого сервер начнёт выключаться
MINUTES 8

# Подключаться к сервису apcupsd можно будет только с самого сервера. Позже, тут можно будет добавить свой рабочий комп, чтоб отслеживать отслеживать состояние ИБП.
NISIP 127.0.0.1

Последний момент, который тоже очень важен - это включение запуска fsck при старте сервера. К сожалению, я об этом узнал уже после того, как однажды у меня накрылась файловая система. И когда я начал гуглить в надежде найти спасение, то наткнулся вот на это статью:

http://myfreebsd.ru/overview/avtomaticheski-zapusk-fsck-y-pri-starte-freebsd

в которой сказано, что предохраняться то надо было заранее! Поэтому в файл /etc/rc.conf добавляем вот такие строчки:

fsck_y_enable="YES"
background_fsck="NO"

Вот на этом, думаю, общая подготовка сервера закончена. Перейдём ко второму этапу, в котором настроим веб-сервер и развернём болванку для сайта.

Этап 2. Настройка Mysql-сервера, вэб-сервера и развёртывание CMS-системы

Сейчас всё больше и больше набирает популярность вэб-сервер Nginx, в первую очередь, благодаря своей лёгкости. Также бесконечно приятным является тот факт, что этот вэб-сервер разрабатывается нашим отечественным разработчиком. Устанавливать вэб-сервер будем вот в такой связке: nginx+php-fpm+eaccelerator. Ну а CMS-систему (а-ля болванку для сайта) - конечно же Joomla!. А для джумлы, в свою очередь, понадобится Mysql. Для настройки всего этого я пользовался вот этими статьями:

http://wiki.firstvds.ru/index.php/Установка_freebsd_nginx_php-fpm_MySQL_phpMyAdmin
http://habrahabr.ru/post/67152
http://wiki.firstvds.ru/index.php/Высокопроизводительный_web-сервер
http://www.lissyara.su/articles/freebsd/www/nginx+php-fpm+mysql
http://docs.joomla.org/Nginx
и конечно же, замечательной русской документацией nginx: http://nginx.org/ru/docs

Ставим Nginx:

cd /usr/ports/www/nginx-devel
make install clean

Опции сборки я указал вот такие:

Объясняю, почему выбрал все штатные модули: а пусть будут! На тот случай, если к сайту начну накручивать всяку-всячину. Модулей сторонних разработчиков намного больше, чем штатных, но их не стал ни одного ставить, побоявшись каких-либо конфликтов, которые потом могли бы вылезти.

А тут я покажу свои опции сборки в тех пакетах, которые шли по зависимостям. Имеется ввиду, если мои опции отличались от предлагаемых по умолчанию:

Теперь установим PHP к нашему вэб-серверу:

cd /usr/ports/lang/php52
make install clean

Опции:

Заметьте, что во FreeBSD 9 патч php-fpm уже включён в дистрибутив php. Поэтому уже не нужно ставить его отдельно, как это описано в вышеприведённых мною ссылках на другие статьи.

Далее, ставим php52-exstensions:

cd /usr/ports/lang/php52-extensions
make install clean

Опции:

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

Важно! Не выбирайте одновременно два конфликтующих экстеншина: IMAP и YAZ.

Зависимости, в которых я менял опции сборки:






После установки php-расширений поставим eaccelerator:

cd /usr/ports/www/eaccelerator
make install clean

Опции сборки я оставил по умолчанию.

Далее, необходимо установить Mysql-server, который мы будем использовать почти везде и почти для всего:

cd /usr/ports/databases/mysql55-server
make install clean

Опции сборки Mysql-сервера я оставил по умолчанию.

После установки такого множества пакетов предлагаю перезагрузить сервер и уже потом начать кофигурировать всё то, что мы поставили. Я думаю, что первым делом, мы добавим в файл /etc/rc.conf вот такие строчки:

mysql_enable="YES"
# строчка ниже означает месторасположение наших баз, потому как, если к серверу будет подключаться дополнительный жёсткий диск, то базы переместятся на него.
mysql_dbdir="/usr/home/mysql"
php_fpm_enable="YES"
nginx_enable="YES"

И первое, что мы настроим - это Mysql-server. Создадим эту самую папку с соответствующими правами на неё:

mkdir /usr/home/mysql
chown mysql:mysql /usr/home/mysql

Теперь запустим сам mysql:

/usr/local/etc/rc.d/mysql-server start

Потом запустим вот этот скрипт: /usr/local/bin/mysql_secure_installation , который настроит безопасность нашего mysql-сервера. Он будет задавать вопросы, на которые будем отвечать:

Enter current password for root (enter for none): жмём энтер, т.к. пароль пароль суперпользователя на mysql у нас пока пустой
Set root password? [Y/n] y
New password: вводим пароль суперпользователя на mysql
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

С помощью этого скрипта мы выполнили следующие действия: задали пароль для суперпользователя root, так как по умолчанию для него не установлен пароль; удалили анонимного пользователя, который создаётся только для тестовых целей; запретили пользователю root входить удалённо - теперь он сможет заходить только с localhost; удалили тестовую БД test и доступ к ней.

Что ж, теперь настроим eaccelerator. Сначала создадим папку для его временных файлов:

mkdir /tmp/eaccelerator
chown www /tmp/eaccelerator
chmod 0700 /tmp/eaccelerator

Затем, нам надо внести некоторые изменения в файл /usr/local/etc/php.ini, однако мы его не найдём а этом месте. Зато вместо него есть файл php.ini-recommended. Сделаем его копию под названием php.ini (или просто переименуем его в php.ini) и вот уже в этот файл пропишем настройки после строчки zend.ze1_compatibility_mode = Off:

; Подключаем расширение
zend_extension="/usr/local/lib/php/20060613/eaccelerator.so"

; Включаем eAccelerator
eaccelerator.enable="1"

; Максимальный размер кеша в мегабайтах
eaccelerator.shm_size="128"

; Корневой каталог для хранения кеша
eaccelerator.cache_dir="/tmp/eaccelerator"

; Встроенный оптимизатор кода
eaccelerator.optimizer="1"

; Включаем проверку модификации PHP файлов.
eaccelerator.check_mtime="1"

; Режим отладки
eaccelerator.debug="0"

; Фильтр файлов, которые должны быть закэшированы
eaccelerator.filter=""

; Максимально допустимое значение которое может быть
; отправлено в разделяемую память. По-умолчанию - без ограничений.
eaccelerator.shm_max="0"

; Когда акселлератору потребуется отправить в разделяемую
; память какой-то объект и при этом в памяти для него
; не окажется места, он попытается удалить файлы, которые
; не были запрошены в течении последних "shm_ttl" секунд.
; По-умолчанию, это значение равно "0" - не удалять ничего.
; 3600сек - это 1 час.
eaccelerator.shm_ttl="3600"

; Когда акселлератору потребуется отправить в разделяемую
; память какой-то объект и при этом в памяти для него
; не окажется места, он попытается удалить старые скрипты,
; если предыдущие такие попытки были не больше, чем
; "shm_prune_period" секунд назад.По-умолчанию, это значение
; равно "0" - не удалять ничего.
eaccelerator.shm_prune_period="0"

; Включить или отключить кеширование скомпиленных скриптов
; _только_ на диск. Этот параметр не влияет на данные сессий
; и кеширование контента. По-умолчанию, значение 0, что означает
; что данные будут кешироваться и в памяти и на диске.
eaccelerator.shm_only="0"

; Включить или отключить сжатие закешированного контента.
; По-умолчанию, "1" - сжимать.
eaccelerator.compress="1"

; Уровень сжатия. По-умолчанию, "9" - максимум.
eaccelerator.compress_level="9"

Но на этом редактирование ещё не заканчиваем. Сразу поправим некоторые строчки, которые потом всё равно пришлось бы править. Находим и приводим в соответствующий вид следующие строчки:

upload_max_filesize = 20M
output_buffering = off

Потом находим вот такую закомментированную строчку:

; extension_dir = "./"

и правим её вот до такого вида:

extension_dir = "/usr/local/lib/php/20060613"

Эта строчка указывает, в каком каталоге находятся установленные экстеншины (которые мы только что поставили) для php.
Чтобы чуточек обезопасить свой сервер, можно ещё отключить вот этот параметр:

expose_php = Off

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

Вот теперь сохраняем изменения и приступим к конфигурированию php-fpm. Находим файл /usr/local/etc/php-fpm.conf и приводим в соответствующий вид вот эти строчки:

<value name="listen_address">/tmp/php-fpm.sock</value>
<value name="max_children">50</value>
<value name="request_terminate_timeout">31s</value>

Этими строчками мы задали файл сокета, через который nginx будет подключаться к php-fpm; установили максимальное количество дочерних процессов; задали интервал после которого дочерний процесс будет убит - эта функция будет срабатывать, когда параметр 'max_execution_time' в php.ini не остановит выполнение скрипта в заданное время.

Далее, не забываем установить владельца на папку:

chown www:www /var/run/php-fpm

Теперь можно попробовать стартануть php-fpm:

service php-fpm onestart

А теперь ВНИМАНИЕ!!! Если при старте php-fpm выходит вот такая ошибка:

starting php_fpm.
Segmentation fault (core dumped)
/usr/local/etc/rc.d/php-fpm: WARNING: failed to start php_fpm

То это может быть связано со следующими ситуациями:

1 У вас установлены вместе расширения IMAP и YAZ (я говорил выше, что этого не надо делать)

2 Расширение RECODE грузится после расширений IMAP или MYSQL

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

fetch http://www.pingle.org/files/fixphpextorder.sh
sh ./fixphpextorder.sh

Однако, у меня он, почему-то не совсем корректно отработал и в файле /usr/local/etc/php/extensions.ini почему-то появились две строчки extension=mysqli.so , и из-за этого при загрузке php-fpm вылазила уже другая ошибка. Поэтому, одну строчку extension=mysqli.so (ту что повыше) я удалил. После этого php-fpm благополучно запустился без ошибок:

service php-fpm start
Starting php_fpm

Теперь можно заняться и самим nginx. Он у меня завёлся почти с пол пинка. И это благодаря тому, что в джумловской документации уже выложен готовый кусок конфига, с которым джумла работает. Я его совсем чуть-чуть поправил, и вот так он выглядит (/usr/local/etc/nginx/nginx.conf):

user  www;

# количество воркеров рекомендуют делать по количеству ядер. У меня 2 ядра
worker_processes  2;

# настраиваем куда писать лог
error_log  /var/log/nginx-error.log;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    use kqueue;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # разрешить загружать файлы
    sendfile        on;

    keepalive_timeout  5m;
    client_max_body_size 100m;

    # использовать сжатие
    gzip on;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 4 8k;
    gzip_types text/plain application/xhtml+xml text/css application/xml application/xml+rss text/javascript application/javascript application/x-javascript
    gzip_proxied any;
    gzip_disable "MSIE [1-6]\.";

 server {
        # тут многое итак понятно: задаём имя сервера, порт, расположение каталога с сайтом.
        listen 80;
        server_name example.com www.example.com;
        server_name_in_redirect off;

        access_log /var/log/nginx/access_log;
        error_log /var/log/nginx/error_log info;

        root /usr/local/www/mysite;
        index index.php;
        # Support Clean (aka Search Engine Friendly) URLs
        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        index index.php index.html index.htm default.html default.htm;
        # deny running scripts inside writable directories
        location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
                return 403;
                error_page 403 /403_error.html;
        }

        location ~ .*.php$ {
#            include /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/tmp/php-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        # caching of files
        location ~* \.(ico|pdf|flv)$ {
                expires 1y;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|swf|xml|txt)$ {
                expires 14d;
        }
 }

#  HTTPS server. Ниже настраиваем параметры для возможности работы через https
# По большому счёту, здесь всё тоже самое, только добавлены настройки ssl
    server {
        listen       443;
        server_name  example.com www.example.com;
        ssl                  on;
        ssl_certificate      cert.pem;
        ssl_certificate_key  cert.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;

        root /usr/local/www/mysite;
        index index.php;

         # Support Clean (aka Search Engine Friendly) URLs
        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        index index.php index.html index.htm default.html default.htm;
        # deny running scripts inside writable directories
        location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
                return 403;
                error_page 403 /403_error.html;
        }

        location ~ .*.php$ {
#            include /etc/nginx/fastcgi.conf;
            fastcgi_pass unix:/tmp/php-fpm.sock;
            fastcgi_index index.php;
            # вот тут главно не проглядеть этот момент, что строчка ниже подключает уже другой файл с параметрами
            include fastcgi_params-ssl;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }

        # caching of files
        location ~* \.(ico|pdf|flv)$ {
                expires 1y;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|swf|xml|txt)$ {
                expires 14d;
        }
  }
}

Сохраняем конфиг. Затем делаем копию файла /usr/local/etc/nginx/fastcgi_params с названием /usr/local/etc/nginx/fastcgi_params-ssl (тем, что указан в секции HTTPS). И в его содержимое добавляем вот такую строчку:

fastcgi_param HTTPS on;

Без этой строчки доступ по HTTPS работать не будет.

Теперь нам надо создать сертификат для подключения по https. Делаем это так (находясь в каталоге /usr/local/etc/nginx):

openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key

При этом будут задаваться вопросы, на которые отвечать надо примерно так:

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Sverdlovskaya
Locality Name (eg, city) []:EKB
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mr.Technotrance
Organizational Unit Name (eg, section) []:noname
Common Name (eg, YOUR name) []:example.com
Email Address []:yourmail@example.com

Примечание: Common Name должен совпадать с названием вашего домена. Создадим каталог для логов nginx:

mkdir /var/log/nginx
chown www:www /var/log/nginx

Забегу немного вперёд и скажу, что с этой конфигурацией nginx у меня отлично заработал и postfixadmin, и roundcube. Запускать nginx пока не торопимся. Сначала давайте скачаем джумлу и расположим её в каталоге, который указали в настройках nginx. Скачать русифицированную джумлу можно здесь:

http://joomlaportal.ru

Когда скачаете архив с джумлой, то просто распакуйте его содержимое в каталог /usr/local/www/mysite. После этого, обязательно дадим права на этот каталог пользователю www:

chown -R www:www /usr/local/www/mysite

И, конечно же, не забудем создать базу mysql для джумлы, а также отдельного пользователя для доступа к этой базе:

mysql -p
CREATE DATABASE `joomla` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON joomla.* TO 'joomla'@'localhost'
IDENTIFIED BY 'my_password' WITH GRANT OPTION;

Вот теперь запускам nginx, чтобы наш конфиг начал работать. Если nginx, при запуске, не выдал никаких ошибок, то пробуем зайти на наш сервер: http://192.168.0.100

Вы должны увидеть вот такую картинку:

Это открылся инсталятор джумлы. На этой странице выбираем язык установки. Жмём далее:

На втором этапе инсталятор проверяет, подходит ли наша система для установки. Как видите, у нас всё идеально. Жмём далее. Скриншот с лицензией я не стал делать.

Настройки подключения к базе:

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

Далее:

Я не стал устанавливать демо-данные, поскольку буду делать всё сам с нуля. Демо-данные - это готовый демонстрационный сайт.

Последний этап:

Нажимаем кнопку "удалить директорию installation". Всё! Первоначальная настройка закончена.

Чтобы настраивать дальше, нужно зайти по адресу http://192.168.0.100/administrator где вы попадёте в админку джумлы. Но эту настройку рассматривать уже не будем. Потому что сайт для себя каждый делает по-своему. Настало время третьего этапа настройки нашего сервера.

Этап 3. Настройка почтового сервера

Для почтового сервера я выбрал, пожалуй, самую популярную связку: postfix+dovecot2+spamassassin+postfixadmin+roundcube. Не хватает антивирусника, но мне он реально не нужен, поскольку я сижу на линуксе что дома, что на работе. В настройке этого всего мне помогли вот эти статьи:

http://www.sys-adm.org.ua/mail/dovecot.php
http://vladimir-stupin.blogspot.com/2009/11/postfix-dovecot-postfixadmin.html
http://bozza.ru/art-170.html
http://www.opennet.ru/docs/RUS/postfix_soho
http://extmemory.blogspot.com/2010/01/spamassassin.html
http://gq.net.ru/2007/02/23/spamassassin-howto
http://www.samag.ru/archive/article/559
http://www.opennet.ru/base/net/spamassassin_mysql.txt.html
http://help-host.ru/ispmanager/admins-servers/41-ustanovka-roundcube-na-freebsd.html
http://mdex-nn.ru/page/nastrojka-pochtovogo-veb-interfejsa-roundcube

Начнём с установки postfix, который по зависимостям должен сразу же и dovecot за собой вытянуть:

cd /usr/ports/mail/postfix
make install clean

Опции сборки:

Опции сборки зависимостей:

Хочу сразу обратить ваше внимание на сборку cyrys-sasl 2! Оставляйте опции по умолчанию, не ставьте поддержку mysql. Если поставите поддержку mysql, то при приёме-отправке почты у вас будет вылазить вот такая ошибка:

auxpropfunc error no mechanism available

Информация взята вот из этих источников:

http://www.cyberciti.biz/faq/postfix-sql_select-option-missing-auxpropfunc-error
http://blog.mydream.com.hk/howto/linux/auxpropfunc-error-no-mechanism-available-errors

Продолжаем про опции зависимостей:

В конце установки будет показан вот такой вопрос:

Would you like to activate Postfix in /etc/mail/mailer.conf [n]?

Если хотим полностью заменить текущий MTA Sendmail на Postfix, то отвечаем: "y". Я так и ответил. А в rc.conf добавляем вот это:

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
postfix_enable="YES"
dovecot_enable="YES"

Сразу к конфигурированию постфикса пока не будем приступать. Я сначала установил postfixadmin и создал в нём домен и ящики. Поэтому, ставим postfixadmin:

cd /usr/ports/mail/postfixadmin
make install clean

Опции сборки по умолчанию оставляем, поскольку поддержка mysql стоит по умолчанию. После установки в каталоге /usr/local/www появится каталог postfixadmin. Здесь уже кому как удобнее будет: кто-то захочет создать дополнительную секцию в nginx для этого ресурса, кто-то - вообще виртуальный домен. Кому как нравится. Но я сделал проще: я создал каталог /usr/local/www/mysite/mailadmin и в него скопировал всё содержимое из каталога postfixadmin. Права дать на этот каталог не забыл:

chown -R www:www mailadmin

Теперь, в моём случае, я смогу заходить в постфиксадмин по адресу: http://192.168.0.100/mailadmin. Но для этого надо сначала сконфигурировать postfixadmin. Редактирую файл /usr/local/www/mysite/mailadmin/config.inc.php (привожу лишь те строчки, в которые вносил изменения):

$CONF['configured'] = true;
$CONF['setup_password'] = 'ваш пароль';
$CONF['postfix_admin_url'] = 'https://example.com/mailadmin';
$CONF['postfix_admin_path'] = '/usr/local/www/mysite/mailadmin';
$CONF['default_language'] = 'ru';

// здесь, почему-то надо писать именно mysqli, хоть у нас и mysql база будет.
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'ваш пароль на базу mysql, которую мы потом создадим для постфиксадмина';
$CONF['database_name'] = 'postfix';

// Этот адрес будет использован для отправлния письма при создании нового ящика.
$CONF['admin_email'] = 'admin@example.com';

// исли в строчке ниже прописано что-то другое, то обязательно ставим так:
$CONF['encrypt'] = 'md5crypt';

// строчки ниже редактируйте на своё усмотрение
$CONF['default_aliases'] = array (
'abuse' => 'abuse@example.com',
'hostmaster' => 'hostmaster@example.com',
'postmaster' => 'postmaster@example.com',
'webmaster' => 'webmaster@example.com'
);

// Чтобы письма располагались по структуре: ~/domain/user
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

// Квота по умолчанию в мегабайтах. Мне квота не нужна.
$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';

// Разрешить редактировать тип домена
$CONF['transport'] = 'YES';

// Управление псевдонимом для суперадмина
$CONF['alias_control'] = 'YES';

$CONF['user_footer_link'] = "https://example.com/mailadmin/main";
$CONF['footer_text'] = 'Return to example.com/mailadmin';
$CONF['footer_link'] = 'https://example.com/mailadmin';

// эти параметры выставляем так потому, что у нас dovecot
$CONF['create_mailbox_subdirs_prefix']='';
$CONF['new_quota_table'] = 'YES';

Теперь, нам надо сделать базу данных для постфиксадмина. Делаем:

mysql -p
CREATE DATABASE `postfix` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;

Теперь попробуем зайти вот по такой ссылке, чтобы запустился процесс настройки: http://192.168.0.100/mailadmin/setup.php И если всё сделали правильно, то должны увидеть вот это:

А если эту страничку пролистнуть вниз, то увидим приглашение с названием "Create superadmin account". Вводим:

Однако, после того, как нажмём кнопку "добавить администратора", у нас вылезет вот такая ошибка:

Это он просит подправить в конфиге параметр пароля, который мы там ввели в открытом виде. Нам нужно вставить пароль в том виде, в котором нас просит setup. И вот уже после того, как вы поправите в конфиге пароль, вы сможете создать учётную запись администратора. ВНИМАНИЕ! В моём случае, когда я поправил пароль в конфиге, достаточно было лишь обновить страничку в браузере (Firefox), и у меня сразу появилось уведомление:

Т.е., повторю, я не вбивал снова в эти поля пароль и т.д. - я просто обновил страничку в браузере, и учётная запись добавилась. После чего, можно, используя эту созданную учётку, переходить по адресу: http://192.168.0.100/mailadmin и настраивать домен и ящики пользователей. Да, и не забываем удалить файл /usr/local/www/mysite/mailadmin/setup.php, когда уже всё благополучно настроили.

После того, как настроите домен, пользователей и всё остальное, нужно будет сделать кое-что ещё. Дело в том, что postfixadmin не умеет сам себя перенаправлять в режим https (ну, по крайней мере, я не нашёл, как это делать.). А ведь это существенно повысит безопасность. Чтобы заходя на страничку http://192.168.0.100/mailadmin срабатывало перенаправление в режим https, надо в конфиг nginx внести кое-какую правку. Итак, находим в нём первую секцию server (который работает по порту 80) и, где-нибудь, после строчек

root /usr/local/www/mysite;
index index.php;

добавляем вот такую конструкцию:

location ~ .*/mailadmin {
           if ($ssl_protocol = "") {
            rewrite .* https://example.com/mailadmin break;
           }
        }

Сохраняем и перезапускаем nginx. После чего, пробуем чего у нас получилось. На этом, с настройкой postfixadmin всё.

Переходим к настройке самого Postfix. Нам надо сделать так, чтобы он понимал всё то, что мы насоздавали в постфиксадмине. Для начала, отредактируем конфиг /usr/local/etc/postfix/main.cf (привожу лишь те строчки, которые я редактировал):

myhostname = example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
mydestination = localhost
local_recipient_maps = unix:passwd.byname $alias_maps
mynetworks = 127.0.0.1/32
relay_domains =
alias_maps = hash:/usr/local/etc/aliases
alias_database = hash:/usr/local/etc/aliases
home_mailbox = Mailbox
mail_spool_directory = /usr/home/mail
smtpd_banner = $myhostname ESMTP $mail_name

virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:1911
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1911
virtual_transport = dovecot
virtual_destination_concurrency_limit = 5
virtual_destination_recipient_limit = 5
virtual_uid_maps = static:1911
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,
reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = cyrus

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

После редактирования конфига нужно сделать ещё несколько вещей. Создадим пользователя и группу virtual для работы с виртуальными ящиками:

pw group add virtual -g 1911
pw user add virtual -g virtual -s /sbin/nologin -u 1911

gid и uid указываем такие же, как в main.cf указали. Создаём каталоги для локальных и виртуальных ящиков (хотя локальными я и не собираюсь пользоваться):

mkdir /usr/home/mail
mkdir /usr/home/vmail
chown postfix:postfix /usr/home/mail
chown virtual:virtual /usr/home/vmail

Далее, создаём файлы, с помощью которых постфикс сможет считывать данные из базы данных. Напомню, что именно в этой базе хранятся данные о доменах и пользователях, которые мы завели в постфиксадмине. Создаём файл /usr/local/etc/postfix/mysql_virtual_alias_maps.cf с таким содержимым:

user = postfix
password = ваш_пароль_на_базу
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address

Создаём файл /usr/local/etc/postfix/mysql_virtual_domains_maps.cf с содержимым:

user = postfix
password = ваш_пароль_на_базу
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

Создаём файл /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf с содержимым:

user = postfix
password = ваш_пароль_на_базу
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

Чтобы работала шифрованная smtp-сессия надо создать самоподписанный доверенный сертификат. Находясь в каталоге /usr/local/etc/postfix, необходимо выполнить команду:

openssl req -new -nodes -x509 -out smtpd.pem -keyout smtpd.pem -days 9999

На задаваемые вопросы отвечаем примерно так:

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Sverdlovskaya
Locality Name (eg, city) []:EKB
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mr.Technotrance
Organizational Unit Name (eg, section) []:noname
Common Name (eg, YOUR name) []:exapmle.com
Email Address []:yourmail@exapmle.com

Самым важным параметром является значение Common Name - оно должно совпадать с FQDN сервера.
На этом, постфикс пока оставим. Но и запускать его пока не будем. Осталось настроить Dovecot и Spamassassin.

Начнём с довекота. Зайдя в каталог /usr/local/etc/dovecot мы обнаружим, что там нет никаких конфигов. Но зато есть файл README, в котором написано, что конфиги надо скопировать из каталога /usr/local/share/doc/dovecot/example-config/. Так мы и сделаем, но нам от туда не все конфиги понадобятся. Копируем лишь папку conf.d и файлы dovecot-sql.conf.ext и dovecot.conf.

Редактируем dovecot.conf (только те строчки, которые я изменял):

protocols = imap
listen = *
base_dir = /var/run/dovecot/
instance_name = dovecot
login_trusted_networks = 127.0.0.1/32
shutdown_clients = yes

По такому же принципу редактируем dovecot-sql.conf.ext:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=ваш_пароль_на_базу
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT local_part FROM mailbox WHERE username = '%u'
iterate_query = SELECT local_part FROM mailbox

По такому же принципу редактируем conf.d/10-auth.conf:

disable_plaintext_auth = no
auth_default_realm = example.com
auth_worker_max_count = 10
auth_mechanisms = plain

# комментируем строчку:
# !include auth-system.conf.ext

# и наоборот, убираем из комментария строчку:
!include auth-sql.conf.ext

По такому же принципу редактируем conf.d/10-logging.conf:

log_path = /var/log/dovecot.log

По такому же принципу редактируем conf.d/10-mail.conf:

mail_location = mbox:/usr/home/vmail/%d/%n
mail_uid = 1911
mail_gid = 1911
first_valid_uid = 1911
last_valid_uid = 1911
first_valid_gid = 1911
last_valid_gid = 1911

По такому же принципу редактируем conf.d/10-master.conf:

default_internal_user = dovecot

service imap-login {
  inet_listener imap {
    port = 143
  } 
  inet_listener imaps {
    #port = 993
    ssl = no 
  }

  service_count = 1
  process_min_avail = 0

service imap {
  # Most of the memory goes to mmap()ing files. You may need to increase this
  # limit if you have huge mailboxes.
  vsz_limit = 384M
    
  # Max. number of IMAP processes (connections)
  #process_limit = 1024
}

service auth {
  unix_listener auth-userdb {
    mode = 0660   
    user = virtual 
    group = virtual
  }
  unix_listener auth-master {
    mode = 0660
    user = virtual 
    group = virtual
  }
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660   
    user = postfix 
    group = postfix
  }
}

По такому же принципу редактируем conf.d/10-ssl.conf:

ssl = no
# комментируем эти строчки. Не вижу смысла включать тут ssl, поскольку к имапу будет подключение только с локального хоста.
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem

По такому же принципу редактируем conf.d/15-lda.conf:

hostname = example.com

По такому же принципу редактируем conf.d/20-imap.conf:

imap_id_send = *

По такому же принципу редактируем conf.d/auth-sql.conf.ext:

args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
args = /usr/local/etc/dovecot/dovecot-sql.conf.ext

Остальные конфигурационные файлы я не трогал, оставляя их настройки по умолчанию.
Теперь установим и настроим Spamassassin. Установка:

cd /usr/ports/mail/p5-Mail-SpamAssassin
make install clean

Опции сборки:

Опции сборки зависимостей, в которых я что-либо менял:





В конце установки будет вот такой вопрос:

Do you wish to run sa-update to fetch new rules [N]?

Я ответил положительно. Также, после установки, появится каталог /usr/local/etc/mail/spamassassin, а в нём можно будет найти файл local.cf.sample. Тут же, сделаем его копию с названием local.cf и уже её отредактируем:

# Список через пробел ящиков-ловушек (у меня таких пока нет, но в будущем наверно сделаю)
# spam@example.com
rewrite_header Subject *****SPAM*****
report_safe 0
trusted_networks 127.0.0.1/32
lock_method flock
required_score 5.0
use_bayes 1
bayes_auto_learn 1
ok_locales ru en

use_pyzor 1
pyzor_options --homedir /usr/home/spamassassin/pyzor/
use_razor2 1
razor_config /usr/local/etc/mail/spamassassin/razor-agent.conf

use_dcc 1
dcc_home /usr/local/dcc
dcc_path /usr/local/bin/dccproc
dcc_timeout 10

# значение при превышении которого письмо будет рассматриваться
# как спам и будет производиться обучение системы анализа. Я пока закоментировал
# bayes_auto_learn_threshold_spam 12.0

# Это оо же самое, но наоборот для писем, которые не являются спамом.
# bayes_auto_learn_threshold_nonspam 0.1

Теперь создаём файл razor-agent.conf вот с таким содержимым:

# See razor-agent.conf (5)
# Change this to 5 for safer classification of MIME attachments. This will let more spam through
logic_method = 4

# Uncomment the next line for logging via syslog
#logfile = sys-syslog
razorhome = /usr/home/spamassassin/razor
debuglevel = 0

В файле v310.pre я закомментировал экспериментальный плагин:

# loadplugin Mail::SpamAssassin::Plugin::ReplaceTags

В файле v312.pre закомментировал ещё один экспериментальный плагин:

# loadplugin Mail::SpamAssassin::Plugin::DKIM

После редактирования конфигов не забываем создать каталоги для работы razor и pyzor:

mkdir /usr/home/spamassassin
mkdir /usr/home/spamassassin/pyzor
mkdir /usr/home/spamassassin/razor
chown -R spamd:spamd /usr/home/spamassassin

Также, надо создать mysql-базу для спамассассина. Незадача в том, что структура таблиц находится в архиве с исходниками, которые нам придётся скачать:

fetch http://www.sai.msu.su/apache//spamassassin/source/Mail-SpamAssassin-3.3.2.tar.bz2

В них и мы найдём каталог sql, который надо скопировать в какое-нибудь удобное место. Затем, перейдём в него и выполним создание базы:

mysql -p
CREATE DATABASE `spamassassin` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON spamassassin.* TO 'spamassassin'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;

После чего создаём в ней структуру таблиц. Делаем команду:

mysql -p spamassassin < userpref_mysql.sql

и получаем ошибку:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM' at line 8

Чтобы это исправить, находим эту самую пресловутую конструкцию 'TYPE=MyISAM' в файлах awl_mysql.sql, bayes_mysql.sql, userpref_mysql.sql и меняем её на такую:

ENGINE=MyISAM;

Затем, благополучно выполняем команды:

mysql -p spamassassin < userpref_mysql.sql
mysql -p spamassassin < bayes_mysql.sql
mysql -p spamassassin < awl_mysql.sql

Всё, база для спамассассина готова. Но чтобы спамассассин умел ею пользоваться, надо создать дополнительный кофигурационный файл рядышком с local.cf. Называться он будет sql.cf, а его содержимое будет таким:

user_scores_dsn DBI:mysql:spamassassin:localhost
user_scores_sql_username spamassassin
user_scores_sql_password ваш пароль на базу
# если будете использовать плагин автоматического создания белого списка, то раскомментируйте эти строчки.
# auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
# user_awl_dsn DBI:mysql:spamassassin:localhost
# user_awl_sql_username spamassassin
# user_awl_sql_password ваш пароль на базу
bayes_store_module Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn DBI:mysql:spamassassin:localhost
bayes_sql_username spamassassin
bayes_sql_password ваш пароль на базу

Также, в скрипт запуска надо будет добавить один ключик. Найдите файл /usr/local/etc/rc.d/sa-spamd, а в нём найдите строчку:

command_args="-d -r ${pidfile}"

и добавьте ключик -q:

command_args="-d -r -q ${pidfile}"

Сохраните изменения. В файл /etc/rc.conf добавьте строчку, которая будет запускать спамассассин при загрузке:

spamd_enable="YES"

Сейчас, чтобы заработала связка postfix+dovecot+spamassassin, надо отредактировать последний файл /usr/local/etc/postfix/master.cf. В самом верху есть строчка:

smtp      inet  n       -       n       -       -       smtpd

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

smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin

Затем надо раскомментировать вот эти строчки (также добавив к ним строчку с фильтром):

smtps     inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

И в самый конец добавить вот такие строчки:

dovecot   unix  -    n    n   -   -    pipe
  flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}
spamassassin unix - n n - - pipe
    user=spamd argv=/usr/local/bin/spamc -f -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}

Вот теперь, после всего этого длительного конфигурирования, перезагружаем сервер. Смотрим логи. У меня было всё в порядке, кроме одного - были вот такие уведомления:

no working DCC servers dcc1.dcc-servers.net dcc2.dcc-servers.net dcc3.dcc-servers.net ... at 209.169.14.30 80.91.36.101
dcc: instead of X-DCC header, dccproc returned 'no working DCC servers dcc1.dcc-servers.net dcc2.dcc-servers.net dcc3.dcc-servers.net ... at 209.169.14.30 80.91.36.101'

Чтобы это исправить нужно к серверу открыть порт UDP 6277:

add 00180 pass udp from any 6277 to me

Потом, перезапустив ipfw, выполнить вот такую команду:

cdcc "load /usr/local/dcc/map.txt"

Затем, попробуйте из постфиксадмина отправить письмо на какой-нибудь из своих же ящиков. Если видите ошибку:

postfix/smtpd[1547]: error: open database /usr/local/etc/aliases.db: No such file or directory

То делаем так:

rm -f /etc/aliases.db
mkdir /usr/local/etc/aliases
newaliases

Ещё, у меня была ошибка о том, что постфикс не может получить доступ к логу довекота. Особо разбираться не хотелось, потому просто сделал так:

chmod 666 /var/log/dovecot.log

После чего сервер заработал. Осталось лишь прикрутить вэб-интерфейс roundecube. Установим roundcube:

cd /usr/ports/mail/roundcube
make install clean

Опции сборки:

И сразу же получаем ошибку:

pecl-intl-1.1.2_3 cannot install: doesn't work with PHP version : 52 (Doesn't support PHP 4 52).

Исправить это легко. Находим файл /usr/ports/devel/pecl-intl/Makefile, а в нём находим строчку:

IGNORE_WITH_PHP=4 52

И изменяем её вот так:

IGNORE_WITH_PHP=4

Затем пробуем снова установить roundcube и получаем ещё одну ошибку:

/usr/bin/ld: Warning: size of symbol `datefmt_parse_args' changed from 160 in .libs/php_intl.o to 120 in dateformat/.libs/dateformat_class.o

Эту ошибку разрешаем вот такими действиями:

echo "LICENSES_ACCEPTED+=GPLv2" >> /etc/make.conf
cd /usr/ports/devel/pecl-intl/
make deinstall clean
make clean
rm ./files/*

После чего снова пробуем установить roundcube. В этот раз всё должно завершиться удачно, и в папке /usr/local/www мы увидим каталог roundcube. Но мне бы хотелось ещё установить дополнительную тему оформления. Внешний вид некоторых можно посмотреть вот тут:

http://www.w2a.ru/blog/684.html

Мне понравилась Air. Её и ставлю:

cd /usr/ports/mail/roundcube-air
make install clean

Теперь создадим mysql-базу для роундкуба:

mysql -p
CREATE DATABASE `roundcube` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;

Потом заходим в каталог /usr/local/www/roundcube/SQL и создаём таблицы в базе:

mysql roundcube -p < mysql.initial.sql

В своём случае, я хочу заходить в почту по адресу https://192.168.0.100/mail, поэтому я копирую всё содержимое каталога /usr/local/www/roundcube в каталог /usr/local/www/mysite/mail. Как я уже и говорил раньше, настройки вэб-сервера под джумлу прекрасно подошли и под roundcube. При этом, обязательно помню, что надо дать соответствующие права на этот каталог:

chown -R www:www mail

Затем, чтобы сделать начальное конфигурирование, захожу по адресу: http://192.168.0.100/mail/installer И если всё работает, то должна появиться вот такая картинка:

Жмём на strat installation. На второй страничке я увидел надпись Intl: NOT AVAILABLE. Тут, наверно, достаточно просто было перезапустить php-fpm, но я перезагрузил весь сервер, после чего установшик больше на это не жаловался.

На второй странице я сделал вот такие настройки:

product_name: назовите как-нибудь заголовок вашей страницы
temp не трогал
ip_check не ставил галку
des_key не трогал
enable_caching не имеет смыла, т.к. Imap прямо на этом же сервере.
enable_spellcheck - да, проверку правописания включить
spellcheck_engine выбрал pspell, т.к. не хочу, чтоб моя переписка куда-то в гугл уходила.
identities_level оставил как есть
debug_level - галка Log errors
log_driver - file
log_dir - /var/log/roundcube
Database setup: прописываем нашу базу, логин и пароль к ней
default_host - 127.0.0.1
default_port - 143
username_domain - автоматическое добавление домена к логину пользователя. Пишем свой example.com
auto_create_user - галка стоит
sent_mbox, trash_mbox, drafts_mbox, junk_mbox - каталоги, что будут создаваться в вашем ящике. Я оставил по умолчанию.
smtp_server - 127.0.0.1
smtp_port - 25
smtp_user/smtp_pass не надо ничего вводить, т.к. SMTP-сервер у нас на этом же хосте
smtp_log - снял галку, т.к. хватает и постфиксовских логов.
Language - ru_RU
skin - air
skin_logo - тут можно загрузить лого-картинку вместо стандартной. Но у меня она не готова пока. Потом вручную подменю картинку...
pagesize не менял
prefer_html не менял (отображать сообщения в виде HTML по умолчанию)
preview_pane - поствил галку (отображать панель просмотра сообщений по умолчанию)
htmleditor - создавать сообщения в формате HTML только когда отвечаю на HTML сообщение (последний вариант выбрал)
draft_autosave - сохранение черновика каждые n минут. Я отключил.
mdn_requests - отправлять уведомление о прочтении. Не трогал - пусть меня спрашивает
mime_param_folding - выбрал для аутглюка.

В конце нажимаем кнопку , после чего установщик предложит скачать два конфига и положить их в папку /usr/local/www/mysite/mail/config , что мы и сделаем. А после этого, нажимаем в установщике . Нас перебросит на тестовую страничку, на которой можно протестировать smtp и imap.

ВНИМАНИЕ: если у вас не проходит тест imap, то проверьте настройки в соответствии с тем, как сказано тут:

http://unix4me.ru/archives/1204

Дублирую сюда эту информацию:

при настройке криптации пароля пользователя в связке Postfixadmin+Dovecot+Roundcube необходимо настроить:

В Postfixadmin - config.inc.php:

$CONF['encrypt'] = 'md5crypt';

В Dovecot - 10-auth.conf:

auth_mechanisms = plain

Просто один plain без других видов криптации.

В Dovecot - dovecot-sql.conf.ext:

default_pass_scheme = MD5-CRYPT

В Roundcube - main.inc.php:

$rcmail_config['imap_auth_type'] = CRAM-MD5;

И не забываем создать каталог для логов:

mkdir /var/log/roundcube
chown www:www /var/log/roundcube

Если же все тесты прошли удачно, то давайте ещё немного подправим конфиг /usr/local/www/mysite/mail/config/main.inc.php вручную. Пишу лишь те строчки, что я подправил:

// Log session authentication errors to <log_dir>/session or to syslog. Записывать в лог неудачные попытки авторизоваться.
$rcmail_config['log_session'] = true;

// enforce connections over https. Принудительно переходить в https.
$rcmail_config['force_https'] = true;

// кодировать или нет IP-адрес и имя хоста. Пусть кодирует.
$rcmail_config['http_received_header_encrypt'] = true;

//автоматически создавать папки <входящие>, <отправленные> и т.д. Новому пользователю.
$rcmail_config['create_default_folders'] = true;

//Если 0 у вас в системных квотах означает безлимит, ставим истину
$rcmail_config['quota_zero_as_unlimited'] = true;

Сохраняем конфиг и удаляем папку /usr/local/www/mysite/mail/installer Потом пробуем зайти на сервер http://192.168.0.100/mail При этом, вас должно перекинуть на https соединение. Попробуйте попользоваться почтой. Если всё сделали без ошибок, то почта должна работать.

Этап 4. Настройка ФТП-сервера

Итак, фтп-сервер будет ProFTPd. Сперва-наперво, установим его:

cd /usr/ports/ftp/proftpd
make install clean

Опции сборки:

После установки приступим к конфигурированию. Находим файл /usr/local/etc/proftpd.conf и открываем его для редактирования. Комментируем строчку:

# UseIPv6 on

А под ней добавляем вот эти строчки:

LangEngine on
LangPath /usr/share/locale
UseEncoding KOI8-R WINDOWS-1251

Затем, ниже находим параметр umask и приводим его вот к такому виду:

Umask 007

Сохраняем изменения. Дальнейшее конфигурирование начнём проводить через webmin. Но для начала, я хочу объяснить, чего мне хочется. А для начала, мне хочется немного: хочу сделать всего три папки вот по такой схеме:

Если не совсем понятно, что я хочу, то потом, когда всё настроим - будет понятнее. Сразу создадим это дерево каталогов:

mkdir /usr/home/ftpserv
mkdir /usr/home/ftpserv/admin
mkdir /usr/home/ftpserv/guest
mkdir /usr/home/ftpserv/guest/files
chown -R admin:ftp /usr/home/ftpserv

Потом заходим в вэбмин и в меню находим "Сервер ProFTP" и видим несколько разных значков.

Заходим в параметры сети:

Здесь я поставил максимальное количество одновременных подключений равное 30, разрешил повторную загрузку на сервер и повторную загрузку с сервера. Если вы обратили внимание, то на скриншоте есть два параметра называемых "разрешить повторную загрузку?". Если же смотреть английский вариант, то эти две настройки будут звучать как: и , что и означает повторную загрузку с сервера и на сервер. Также, здесь я выставил тип сервера как отдельный демон и явно указал диапазон портов для пассивного режима. Остальное не трогал. Сохраняем и переходим дальше.

Параметры ведения журнала: не менял ничего.

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

Здесь я задал начальный каталог регистрации, ограничил всех пользователей в домашних каталогах, настроил, чтобы отменённые загрузки удалялись и владеющие группы в создаваемых файлах и каталогах подделывались на группу ftp. Когда мы будем создавать пользователя, то домашний каталог будем ему указывать тот, в котором мы его хотим запереть. Подделку владеющей группы я сделал для того, чтобы не возникло путаницы с правами на уровне файловой системы.

Управление доступом, Разное: Не менял ничего.

Теперь мы дошли до значка "Аутентификация". Но перед тем, как производить эти настройки, нам надо иметь какие-либо учётные записи в системе, которые будут использоваться для фтп-доступа. Пока что, у меня будет только пользователь админ и пользователь ftp для анонимного доступа. Перейдём в вебмине в пункт <Система> и выберем подпункт <Пользователи и группы>. Здесь мы подредактируем учётку админа и создадим учётку ftp.

В учётке админа изменим следующее:

Здесь я изменил домашний каталог на корень фтп-шного дерева, заменил основную группу на ftp и дополнительно внёс его обратно в группу admin, которая была основной. Поставил крыж, чтоб домашний каталог не перемещался.

Теперь создадим пользователя ftp для анонимного доступа:

Указываем домашнюю папку, в которой хотим запереть этого анонимуса. Оболочку выбираем nologin. Основную группу -ftp. И ставим крыжи, чтоб не создавался домашний каталог и не перемещались туда файлы.

Вот теперь, пора вернуться к настройкам ProFTPd и кликнуть на значок Аутентификация:

Здесь мы запрещаем регистрацию для рута и запрещаем регистрацию пользователям из списка /etc/ftpusers. И самое главное: мы именно здесь добавляем нашего пользователя admin для доступа к ФТП-серверу. И здесь же, мы назначаем ему пароль именно для доступа ФТП. И этот пароль очень желательно сделать отличающимся от его пароля для входа в ОС. Идём далее.

Файл опций для каждого каталога: его пока пропустим, но обязательно вернёмся позже к нему.

Запрещённые пользователи FTP:

В этот список мы прописываем тех пользователей операционной системы, которым доступ в качестве фпт будет невозможен (дополнительная мера безопасности). Я туда добавил вот этих: mysql cyrus dovecot dovenull postfix virtual dcc spamd.

Ну а сейчас приступим к настройкам для анонимуса. Наверно, вы уже обратили внимание, что помимо общих настроек для ProFTpd, в вебмине есть ещё и настройки под названием "Виртуальные серверы", в которых мы видим значок с названием "Сервер по умолчанию". Вот на него и кликнем. Нам откроются параметры виртуального сервера с такими же значками, как и в общих настройках. Но в них нас интересует только один: Настройка анонимного FTP. Кликнем на него:

Выберем ограничение каталога, в котором запрём анонимуса и нажмём кнопку "создать". После этого нам снова откроется страничка с привычными значками, но называться она уже будет "Параметры анонимного FTP". Здесь мы тоже пройдёмся по некоторым из них.

Параметры сети:

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

Аутентификация:

Здесь я запретил регистрацию для root, разрешил регистрацию пользователям только с псевдоименами (а у нас это только anonymous). Поставил крыж, чтобы не требовать пароль для анонимной регистрации и разрешил регистрацию пользователям с оболочкой /sbin/nologin.

И вот теперь вернёмся к тому, что пропустили. Нажмём на надпись "вернуться в основное меню" и кликнем на значок "Файл опций для каждого каталога".

Вот здесь мы выбираем каталог, для которого хотим ограничить доступ и нажимаем кнопку "Создание файла параметров". После чего увидим следующее:

Здесь нас интересует только значок "user permissions", однако если же прогуляться по остальным настройкам, то мы увидим, что тут, конкретно для этого каталога, можно задавать свои параметры "Разрешить повторную загрузку?', "Удалять отмененные загрузки?", "Устанавливаемая группа для закачанных файлов" и прочие, которые мы уже видели в глобальных настройках ProFTPd. Если здесь эти настройки не трогать, то они останутся унаследованы от глобальных параметров ProFTPd.

Итак, заходим в интересующий нас "user permissions":

и выставляем права для админа. Для остальных фтп-пользователей (если в будущем ещё захочу зарегить) эта папка даже видна не будет. Да и остальные сюда и не попадут вовсе, т.к. будут ограничены в своих каталогах. Сохраняем и аналогичным образом назначаем доступ остальным папкам.

Сначала на /usr/home/ftpserv/guest:

Здесь нам надо сделать так, чтоб полный доступ имел только админ. Для этого, админу даём все права с помощью вэб-интерфейса, а в теле самого файла кое-что прописываем вручную. То, что прописать вручную, я указал стрелочкой (<Limit WRITE>). Таким образом, всем будет только чтение, а админу - полный доступ.

На папку /usr/home/ftpserv/guest/files доступ делаем также, только вручную уже дописываем <Limit WRITE DIRS>:

Таким образом, эта папка не будет видна гостю, и попасть он в неё не сможет. Однако, если туда положить какой-нибудь файл и дать на него прямую ссылку, например такую:

ftp://example.com/files/file1.doc

То скачать этот файл можно. Ну, а у админа туда будет, также, полный доступ. Это нужно для того, чтобы аноним мог скачать файлы по прямой ссылке, но и чтобы он не знал про остальные файлы, которые там могут находиться.

В конце всех настроек, не забудем открыть порты для пассивного режима. В /etc/ipfw.rules добавляем:

# пассивные порты для фтп
add 00175 allow tcp from any to me 49152-65534 via em0

Перезапускаем ipfw, потом попробуем запустить ProFTPd-сервер:

service proftpd onestart

Если ругани никакой не вылезло, то всё в порядке, можно пользоваться. Только не забываем в rc.conf добавить строчку:

proftpd_enable="YES"

И на этом настройку всего сервера можно завершить. Возни, конечно же, очень много было, но мне кажется, что оно того стоило!

Материал взят с сайта: http://technotrance.su/index.php/moi-stati/freebsd/item/13-home-web-mail-ftp-server1
http://technotrance.su/index.php/moi-stati/freebsd/item/14-home-web-mail-ftp-server2
http://technotrance.su/index.php/moi-stati/freebsd/item/15-home-web-mail-ftp-server3
http://technotrance.su/index.php/moi-stati/freebsd/item/16-home-web-mail-ftp-server4

Главная > Операционные системы > UNIX > BSD > FreeBSD