Сразу оговорюсь, что описанное здесь решение превосходно подойдёт и для использования в малых и средних организациях. А может, даже и в крупных...
А также, сразу оговорюсь, для чего это всё нужно было делать дома, и зачем вся эта головная боль. Нужно это было, в первую очередь, мне. Это моя блажь, которую давно хотелось воплотить в жизнь. Хотелось иметь свой личный сайт, свою личную почту и свой личный фтп-шник, и чтобы это обязательно работало на своём личном сервере, где повелителем бы я, и только я, целиком и полностью. Само собой, что и путь для этого лежит, пожалуй, самый сложный. Поэтому, тех, кого это пугает, и тех, кто не испытывает такой же блажи, эта статья не заинтересует.
Ну, а для тех, кто заинтересовался, опишу то, что имеется:
- свой домен example.com с двумя DNS-записями вида: - www.example.com. A <ваш белый IP-адрес> - example.com. A <ваш белый IP-адрес> - и записью MX вида: - example.com. MX 10 example.com. - Также, очень желательно бы сделать ещё и PTR-запись для вашего домена у провайдера. Но мой провайдер, к сожалению, отказал мне в этом, как физическому лицу. - Имеем небольшую квартиру, в которой не особо много места для дополнительного системника и для дополнительного источника шума.
Домен можно зарегистрировать на www.nic.ru. Там же, и сделать все нужные записи на DNS-сервере. От себя скажу, что там это всё делается очень быстро и очень удобно, даже если вы вообще в первый раз подобной процедурой занимаетесь.
Ну, а что касается железа, то оно должно было отвечать параметрам: компактный; бесшумный; непрожорливый; с некоторым запасом производительности для моих нужд. Я остановился вот на такой подборке:
Решение действительно получилось весьма компактное и бесшумное. А также весьма сердитое для своих таких размеров. Твердотел потому, что мне хотелось получить ударостойкую систему. Потому как, это чудо будет стоять у меня на столе, и, возможно, его придётся двигать с места на место иногда. К сожалению, денег хватило лишь на 64-ёхгиговый. Но, в будущем, планирую поставить второй твердотел более внушительного объёма.
Операционную систему я для своего сервера выбрал FreeBSD. Почему именно её? Да потому, что мне так захотелось. Хотя бы из-за того, что это мой первый сервер на FreeBSD, и ему всё равно когда-то суждено было быть.
Этап 1. Установка и общая подготовка сервера
Сперва наперво, сразу хочу показать, как у меня расположен сервер, относительно домашней сети:
Т.е. сервер, как и вся локальная сеть, будет прикрыт извне маршрутизатором. Ну, а на самом маршрутизаторе я настроил проброс нужных портов извне до своего сервера.
Скачиваем свежий дистрибутив FreeBSD. На мой момент, это была девяточка:
И приступаем к установке. На этапе, когда установщик спрашивает: 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 и предложит сконфигурировать подключение к сети, на что я соглашаюсь и ввожу свои сетевые реквизиты:
После конфигурирования сети, установщик спросит, настроены ли наши часы в БИОСе по всемирному координированному времени (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 DUMMYNET
# Почему-то, многие эту опцию включают. Но я не стал. Эта опция означает, что во время загрузки сервер будет открыт до тех пор, пока не включится фаервол. # options IPFIREWALL_DEFAULT_TO_ACCEPT
Что касается остальных опций, относительно поддерживаемого железа, то тут у каждого будут свои настройки. Я стараюсь отключить всё лишнее. Хотя, кое-что, я думаю, можно отключить у всех, например, всё, что связано со звуком, firewire, usb wireless, да и вообще всё беспроводное отключить можно. Также и PCMCIA карты, флоппи, лишние raid-контроллеры.
Итак, после того, как всё-таки конфиг редактировать закончили, переходим в каталог /usr/src и там делаем команды:
make buildkernel KERNCONF=mykernel make installkernel KERNCONF=mykernel
Когда ваше ядро соберётся и установится, то пока не спешите перезагружаться. Давайте сразу всё подготовим для фаервола. Во-первых, в файл /etc/rc.conf добавим строчки:
Потом создадим файл /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" и сразу после неё добавляем ещё четыре:
Сохраняем изменения. Затем, надо внести изменения ещё в два файла. Сначала находим файл /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 при старте сервера. К сожалению, я об этом узнал уже после того, как однажды у меня накрылась файловая система. И когда я начал гуглить в надежде найти спасение, то наткнулся вот на это статью:
в которой сказано, что предохраняться то надо было заранее! Поэтому в файл /etc/rc.conf добавляем вот такие строчки:
fsck_y_enable="YES" background_fsck="NO"
Вот на этом, думаю, общая подготовка сервера закончена. Перейдём ко второму этапу, в котором настроим веб-сервер и развернём болванку для сайта.
Этап 2. Настройка Mysql-сервера, вэб-сервера и развёртывание CMS-системы
Сейчас всё больше и больше набирает популярность вэб-сервер Nginx, в первую очередь, благодаря своей лёгкости. Также бесконечно приятным является тот факт, что этот вэб-сервер разрабатывается нашим отечественным разработчиком. Устанавливать вэб-сервер будем вот в такой связке: nginx+php-fpm+eaccelerator. Ну а CMS-систему (а-ля болванку для сайта) - конечно же Joomla!. А для джумлы, в свою очередь, понадобится Mysql. Для настройки всего этого я пользовался вот этими статьями:
Объясняю, почему выбрал все штатные модули: а пусть будут! На тот случай, если к сайту начну накручивать всяку-всячину. Модулей сторонних разработчиков намного больше, чем штатных, но их не стал ни одного ставить, побоявшись каких-либо конфликтов, которые потом могли бы вылезти.
А тут я покажу свои опции сборки в тех пакетах, которые шли по зависимостям. Имеется ввиду, если мои опции отличались от предлагаемых по умолчанию:
Теперь установим 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. Создадим эту самую папку с соответствующими правами на неё:
Потом запустим вот этот скрипт: /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. Сначала создадим папку для его временных файлов:
Затем, нам надо внести некоторые изменения в файл /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.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"
; Уровень сжатия. По-умолчанию, "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 и приводим в соответствующий вид вот эти строчки:
Этими строчками мы задали файл сокета, через который nginx будет подключаться к php-fpm; установили максимальное количество дочерних процессов; задали интервал после которого дочерний процесс будет убит - эта функция будет срабатывать, когда параметр 'max_execution_time' в php.ini не остановит выполнение скрипта в заданное время.
Далее, не забываем установить владельца на папку:
chown www:www /var/run/php-fpm
Теперь можно попробовать стартануть php-fpm:
service php-fpm onestart
А теперь ВНИМАНИЕ!!! Если при старте 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):
При этом будут задаваться вопросы, на которые отвечать надо примерно так:
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. Скачать русифицированную джумлу можно здесь:
Когда скачаете архив с джумлой, то просто распакуйте его содержимое в каталог /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
Вы должны увидеть вот такую картинку:
Это открылся инсталятор джумлы. На этой странице выбираем язык установки. Жмём далее:
На втором этапе инсталятор проверяет, подходит ли наша система для установки. Как видите, у нас всё идеально. Жмём далее. Скриншот с лицензией я не стал делать.
Настройки подключения к базе:
Если здесь что-то введёте неправильно, то будете получать сообщение об ошибке. Если всё верно, то появится следующий этап конфигурирования фтп, который мы пропускаем, потому как мы потом поставим свой, намного более функциональный, фтп-сервер.
Далее:
Я не стал устанавливать демо-данные, поскольку буду делать всё сам с нуля. Демо-данные - это готовый демонстрационный сайт.
Чтобы настраивать дальше, нужно зайти по адресу http://192.168.0.100/administrator где вы попадёте в админку джумлы. Но эту настройку рассматривать уже не будем. Потому что сайт для себя каждый делает по-своему. Настало время третьего этапа настройки нашего сервера.
Этап 3. Настройка почтового сервера
Для почтового сервера я выбрал, пожалуй, самую популярную связку: postfix+dovecot2+spamassassin+postfixadmin+roundcube. Не хватает антивирусника, но мне он реально не нужен, поскольку я сижу на линуксе что дома, что на работе. В настройке этого всего мне помогли вот эти статьи:
Начнём с установки postfix, который по зависимостям должен сразу же и dovecot за собой вытянуть:
cd /usr/ports/mail/postfix make install clean
Опции сборки:
Опции сборки зависимостей:
Хочу сразу обратить ваше внимание на сборку cyrys-sasl 2! Оставляйте опции по умолчанию, не ставьте поддержку mysql. Если поставите поддержку mysql, то при приёме-отправке почты у вас будет вылазить вот такая ошибка:
Сразу к конфигурированию постфикса пока не будем приступать. Я сначала установил 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 (привожу лишь те строчки, в которые вносил изменения):
// здесь, почему-то надо писать именно 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';
// эти параметры выставляем так потому, что у нас 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) и, где-нибудь, после строчек
Сохраняем и перезапускаем nginx. После чего, пробуем чего у нас получилось. На этом, с настройкой postfixadmin всё.
Переходим к настройке самого Postfix. Нам надо сделать так, чтобы он понимал всё то, что мы насоздавали в постфиксадмине. Для начала, отредактируем конфиг /usr/local/etc/postfix/main.cf (привожу лишь те строчки, которые я редактировал):
После редактирования конфига нужно сделать ещё несколько вещей. Создадим пользователя и группу virtual для работы с виртуальными ящиками:
pw group add virtual -g 1911 pw user add virtual -g virtual -s /sbin/nologin -u 1911
gid и uid указываем такие же, как в main.cf указали. Создаём каталоги для локальных и виртуальных ящиков (хотя локальными я и не собираюсь пользоваться):
Далее, создаём файлы, с помощью которых постфикс сможет считывать данные из базы данных. Напомню, что именно в этой базе хранятся данные о доменах и пользователях, которые мы завели в постфиксадмине. Создаём файл /usr/local/etc/postfix/mysql_virtual_alias_maps.cf с таким содержимым:
Чтобы работала шифрованная smtp-сессия надо создать самоподписанный доверенный сертификат. Находясь в каталоге /usr/local/etc/postfix, необходимо выполнить команду:
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 (только те строчки, которые я изменял):
По такому же принципу редактируем 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:
Остальные конфигурационные файлы я не трогал, оставляя их настройки по умолчанию. Теперь установим и настроим 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
# значение при превышении которого письмо будет рассматриваться # как спам и будет производиться обучение системы анализа. Я пока закоментировал # 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 я закомментировал экспериментальный плагин:
В них и мы найдём каталог 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
Ещё, у меня была ошибка о том, что постфикс не может получить доступ к логу довекота. Особо разбираться не хотелось, потому просто сделал так:
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. Но мне бы хотелось ещё установить дополнительную тему оформления. Внешний вид некоторых можно посмотреть вот тут:
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, то проверьте настройки в соответствии с тем, как сказано тут:
Если же все тесты прошли удачно, то давайте ещё немного подправим конфиг /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. Но для начала, я хочу объяснить, чего мне хочется. А для начала, мне хочется немного: хочу сделать всего три папки вот по такой схеме:
Если не совсем понятно, что я хочу, то потом, когда всё настроим - будет понятнее. Сразу создадим это дерево каталогов:
Потом заходим в вэбмин и в меню находим "Сервер 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"
И на этом настройку всего сервера можно завершить. Возни, конечно же, очень много было, но мне кажется, что оно того стоило!