Настройка Exim4 / Dovecot в Astra Linux SE 1.5
Настройка почты в Astra Linux 1.5 ALD
Исходные данные и задачи
Необходимо настроить сервер электронной почты, работающий в рамках домена Astra Linux 1.5 SE. Исходные данные:
| Параметр | Значение |
|---|---|
| Имя домена | local.net |
| FQDN сервера | server.local.net |
| IP-адрес сервера | 192.168.0.1 |
| Маска сети: | 255.255.255.0 |
Настройка сети
Отключаем графический менеджер управления сетевыми подключениями wicd.
chkconfig wicd off
Прописываем настройки сети в файле /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.1
network 192.168.0.0
broadcast 192.168.0.255
dns-nameservers 192.168.0.1
dns-search local.lan
После этого нужно выполнить перезапуск демона сети:
service networking stop && service networking start
В документации к демону networking написано, что команда restart является устаревшей и работает не так, как ожидается.
Необходимо в файле /etc/hosts прописать соответствие FQDN сервера и его IP-адреса, а также задать hostname
127.0.0.1 localhost
192.168.0.1 server.local.net server
192.168.0.101 arm01.local.net arm01
192.168.0.102 arm02.local.net arm02
192.168.0.103 arm03.local.net arm03
В файле /etc/hostname меняем краткое имя компьютера server на полное server.local.net, а также изменяем текущее значение системной переменной:
echo server.local.net > /etc/hostname
hostname server.local.net
Инициализация домена
Действуем согласно официальной инструкции от РусБиТех:
ald-init init
Появится уведомление о том, что команда init уничтожит всю базу данных LDAP и Kerberos, будут остановлены и перезапущены службы, и упадет с неба большая звезда, горящая подобно светильнику, и падет на третью часть рек и на источники вод... Отвечаем утвердительно
Попросят ввести пароли для доступа к базе данных Kerberos и пароль администратора Astra Linux Directory. Лучше записать куда-нибудь, потому что понадобится ещё не раз.
Спустя какое-то время на экране появится сообщение:
Astra Linux Directory сконфигурирована.
Сервер ALD активен.
Клиент ALD включен.
Astra Linux Directory сервер успешно инициализирован.
Установка и настройка почтовых сервисов.
Необходимо установить три пакета:
| Пакет | Описание |
|---|---|
| exim4-daemon-heavy | Передает сообщения и умеет работать с мандатными метками. |
| dovecot-imapd | Умеет отдавать почту клиентам. |
| dovecot-gssapi | Умеет принимать авторизацию на сервере через Kerberos (ALD). |
Отдельно отмечу, что сразу же после установки нужно будет запустить конфигурирование exim4.
aptitude install exim4-daemon-heavy dovecot-imapd dovecot-gssapi -y
dpkg-reconfigure exim4-config
Процесс настройки exim4 не очень сложный, но нужно правильно ответить на несколько вопросов.
| Вопрос | Ответ |
|---|---|
| Общий тип почтовой конфигурации | интернет-сайт; приём и отправка почты напрямую, используя SMTP |
| Почтовое имя системы: | local.net |
| IP-адреса, с которых следует ожидать входящие соединения SMTP: | 192.168.0.1 |
| Другие места назначения, для которых должна приниматься почта: | local.net |
| Домены, для которых доступна релейная передача почты: | Оставляем пустым |
| Машины, для которых доступна релейная передача почты: | Оставляем пустым |
| Сокращать количество DNS-запросов до минимума (дозвон по требованию)? | Нет |
| Метод доставки локальной почты: | Maildir формат в домашнем каталоге |
| Разделить конфигурацию на маленькие файлы? | Да |
Теперь нужно удалить из каталога /var/mail файл с именем пользователя, созданного при установке системы (у меня обычно administrator).
rm /var/mail/administrator
Создадим сервисы ALD для работы с почтой:
ald-admin service-add imap/server.local.lan
ald-admin sgroup-svc-add imap/server.local.lan --sgroup=mac
ald-admin sgroup-svc-add imap/server.local.lan --sgroup=mail
ald-admin service-add smtp/server.local.lan
ald-admin sgroup-svc-add smtp/server.local.lan --sgroup=mac
ald-admin sgroup-svc-add smtp/server.local.lan --sgroup=mail
ald-client update-svc-keytab imap/server.local.lan --ktfile="/var/lib/dovecot/dovecot.keytab"
ald-client update-svc-keytab smtp/server.local.lan --ktfile="/var/lib/dovecot/dovecot.keytab"
Указывая имя сервиса, важно помнить, что после слеша указывается то же самое имя сервера, что и в файле /etc/hostname. Если даже в настройках Bind вы потом укажете, что mail.local.net и smtp.local.net являются всего лишь псевдонимами для server.local.net, почта работать не будет, потому что Kerberos очень строго проверяет этот параметр.
После создания файла ключей нужно предоставить доступ к нему для dovecot:
setfacl -m u:dovecot:x /var/lib/dovecot
setfacl -m u:dovecot:r /var/lib/dovecot/dovecot.keytab
Dovecot
Выполняем настройку dovecot. Если убрать все комментарии из файлов, то получится примерно следующее (в тех файлах, где меняли):
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap
listen = 192.168.0.1
dict {}
!include conf.d/*.conf
!include_try local.confdisable_plaintext_auth = yes
auth_mechanisms = gssapi
auth_gssapi_hostname = server.local.lan
auth_krb5_keytab = /var/lib/dovecot/dovecot.keytab
!include auth-system.conf.extЯ не могу в настройку SSL. Отключаем:
ssl = no
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </dovecot/private/dovecot.pemМаленькая настройка для корректной работы с почтой - добавляем в файле /etc/dovecot/conf.d/10-master.conf в секцию service auth:
# ...
service auth {
unix_listener auth-client {
mode = 0600
user = Debian-exim
}
# ...
}Немного упрощаем себе и пользователям жизнь, автоматически создавая на сервере каталоги под входящие, отправленные и удаленные письма при первой авторизации (параметр auto = subscribe).
namespace inbox {
mailbox Drafts {
special_use = \Drafts
auto = subscribe
}
mailbox Junk {
special_use = \Junk
}
mailbox Trash {
special_use = \Trash
auto = subscribe
}
mailbox Sent {
special_use = \Sent
auto = subscribe
}
}Расположение каталогов внутри /var/mail/%username% можно изменить, сделав более удобным, если в /etc/dovecot/conf.d/10-mail.conf немного изменить параметр mail_location:
mail_location = maildir:/var/mail/%u:LAYOUT=fs
Exim4
Теперь нужно сделать пару дополнительных настроек Exim4.
dovecot_gssapi:
driver = dovecot
public_name = GSSAPI
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1 # В конце цифра один, а не маленькая эльФайл /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt очень большой, поэтому не привожу его полностью. В самом начале нужно добавить в секцию acl_check_rcpt 4 строки, чтобы выглядело примерно так:
acl_check_rcpt:
deny
message = "Auth required"
hosts = *:+relay_from_hosts
!authenticated = *
accept:
hosts = :
control = dkim_disable_verify
# и так далееПроверка работоспособности
Заходим от имени пользователя ALD. Запускаем Thunderbird и создаем новую учетную запись. В параметрах IMAP- и SMTP-серверов пишем одно и то же - server.local.net. При нажатии кнопки "Проверка параметров" параметры авторизации должны измениться на Kerberos/GSSAPI. Сохраняем, перезапускаем почтовый клиент. После второго запуска должно загрузиться дерево папок с сервера. Пишем письмо сами себе, если пришло - все хорошо. Если нет - очень внимательно проверяем содержимое всех конфигурационных файлов. Я сам потерял три дня из-за того, что в одном месте пропустил всего одну строку.
Минимальная настройка SSH в Debian 7 Wheezy
Цели
В этой статье я расскажу о минимальных настройках, необходимых для того, чтобы на вашем сервере заработала служба OpenSSH, позволяющая удалённо подключаться к нашей машине и выполнять нужные команды. Кроме того, будут рассмотрены вопросы использования ключей для доступа к серверу.
Установка пакетов
Установить сервер OpenSSH в Debian очень просто:
apt-get install openssh-server -y
Вместе с самим сервером ставится несколько зависимостей. В моём случае (Debian 7.5) это openssh-client и ncurses-term.
Служба сервера sshd будет автоматически запущена после установки. Обращаться к ней в терминале следует по имени ssh, например (запуск, остановка, перезапуск):
service ssh start
service ssh stop
service ssh restart
Увеличение длины серверного ключа
До того, как приступить к изменению основных настроек OpenSSH, следует сгенерировать более длинные серверные ключи, иначе безопасность будет под угрозой. Делается это очень просто:
- Переходим в каталог
/etc/ssh - Изменяем в sshd_config значение параметра
ServerKeyBitsс 768 на 2048. Удаляем старые ключи командой
rm -rf ssh_host_*Выполняем перегенерацию ключей сервера (служба будет перезапущена автоматически):
dpkg-reconfigure openssh-server
Минимальная настройка
Все найстроки сервера OpenSSH хранятся в файле /etc/ssh/sshd_config. Откроем его для редактирования и рассмотрим минимально необходимые опции, которые не рекомендуется трогать либо наоборот настоятельно рекомендуется изменить.
Port 22- лучше всего сразу сменить порт на другой, однако, номер порта желательно выбрать больше 1024, чтобы случайно не создать конфликт с какой-нибудь другой программой, работающей на этом порту.ListenAddress 0.0.0.0- по умолчанию закомментировано. Можно указать, какой интерфейс должен слушать наш сервер. Если на сервере несколько интерфейсов, один из которых торчин наружу, например, предоставляет доступ к WEB-серверу, а работа с сервером будет производиться только из внутренней сети, я советую указать здесь адрес сервера во внутренней сети, чтобы заблокировать доступ из Интернета.UsePrivilegeSeparation yes- ни в коем случае не отключать разделение привилегий!LoginGraceTime 120- время в секундах, в течение которого следует авторизоваться на сервере. По истечении указанного интервала сервер автоматически разорвёт соединение.PermitRootLogin yes- настоятельно рекомендую сменить наno! Пользовательrootне должен подключаться к серверу! Для выполнения команд, требующих повышения привилегий, следует использоватьsudo!PubkeyAuthentication yes- включаем, т.к. дальше будет рассматриваться использование публичных ключей для подключения к серверу.AuthorizedKeysFile %h/.ssh/authorized_keys- следует раскомментировать для доступа с помощью открытых ключей шифрования. По умолчанию эта настройка указывает на то, что открытые ключи каждого пользователя следует искать в его домашнем каталоге, в файлеauthorized_keys, лежащем в подкаталоге.ssh.
Изменив эти минимальные настройки, перезапустите службу ssh.
Проверка работоспособности
Попробуйте подключиться к своему серверу с него самого:
ssh user@localhost
где user - ваш настоящий логин в системе.
При самом первом подключении ваш SSH-клиент будет спрашивать, следует ли доверять указанному хосту и принять от него ключ шифрования. Отвечаем yes (нужно написать слово полностью). Сервер предложит ввести пароль для авторизации в системе. Вводим его. Если всё правильно, вы окажетесь в консоли, где сможете вводить команды.
Генерация и размещение ключей
Генерация ключей
При шифровании с открытым ключом потребуется создать пару из двух ключей - открытого и закрытого. В *nix-системах стандартным средством для их генерации является программа ssh-keygen. Запуск её с различными параметрами приводит к созданию различных ключей. В нашем случае будет использован минимум настроек.
Выполните указанную ниже команду для создания ключа длиной 2048 бит и с комментарием "New generated key". Права root не требуются. Я советую добавить комментарий для ключа - в этом случае при подключении с его помощью в логах сервера будет отображаться этот комментарий. Можете ввести сюда свои имя и фамилию.
ssh-keygen -b 2048 -C "New generated key"
Система предложит указать имя для новых файлов. Для примера будем использовать new_key
Затем будет задан вопрос, какая парольная фраза будет использоваться для ключа. Если не заполнять это поле, то ключ не будет защищён паролем. Рекомендую ввести сюда что-нибудь. После первого ввода парольной фразы будет предложено ввести её ещё раз.
После этого в текущем каталоге (если вы ввели имя файла выше) будут созданы два файла - new_key и new_key.pub
Файл new_key - это закрытый ключ. Его нужно сохранить в надёжное место на вашем компьютере и не давать никому. Как правило, его кладут в домашнем каталоге в папку .ssh под именем id_rsa, при этом права на файл должны быть
mv new_key ~/.ssh/id_rsa
chmod 0600 ~/.ssh/id_rsa
Если права будут указаны неправильно, могут возникнуть проблемы. Например, утилита Seahorse из комплекта Gnome при попытке добавить этот ключ в хранилище будет запрашивать пароль, но при нажатии кнопки "Сохранить" выдаст ошибку.
Файл new_key.pub - это открытый ключ. Его также следует сохранить на вашем компьютере, однако, именно его следует распространять на серверах, к которым вы будете подключаться.
Размещение ключей на целевой системе
Если в домашнем каталоге пользователя не существует каталога .ssh, создайте его, а внутри него разместите пустой файл authorized_keys.
cd ~
mkdir .ssh
cd .ssh/
touch authorized_keys
Теперь в этот файл мы добавим наш открытый ключ с помощью стандартной команды >>
cat ~/new_key.pub >> authorized_keys
Теперь следует скопировать закрытый ключ на ваш компьютер. Его мы будем использовать для подключения к нашему серверу.
Использование закрытых ключей и Putty
Формат закрытых ключей, используемых программой Putty, несколько отличается от того, который используется в *nix-системах. Тем не менее, в комплекте идёт программа puttygen. Запустите её.
В меню выберите пункт Conversion, а в нём - Import key.
Найдите ваш закрытый ключ и откройте его.
Если ранее вы указали парольную фразу, сейчас её нужно будет ввести для открытия ключа.
Нажмите кнопку Save private key
Дайте подходящее имя закрытому ключу и сохраните его куда-нибудь. Как видите, формат файла изменился - теперь он ppk
Создайте в Putty новое подключение. В настройках найдите пункт Auth. На этой странице в поле Private key file for authentication выберите сохранённый ключ.
Сохраните подключение.
Нажмите Open
Теперь при подключении вам нужно будет вводить не пароль пользователя системы, а пароль от вашего ключа. Удобство заключается в том, что можно создать один публичный ключ и разместить его на десятке серверов. Теперь вместо того, чтобы помнить 10 разных паролей, достаточно помнить всего один и хранить его и секретный ключ в надёжном месте, исключающем доступ посторонних лиц.
Использование ключей для авторизации не отменяет ввода пароля пользователя при вызове команды sudo!
Gunicorn + NGinx + Virtualenv на Debian 7
В этой заметке я хочу рассмотреть наиболее перспективный в настоящее время способ размещения проектов на базе Django на боевых серверах. Будет использовано следующее ПО:
- Python 2.6. Вы можете использовать вообще любой, какой Вам нравится, просто проекты, которыми пользуется моя организация, используют именно его. По умолчанию в Debian 7 установлен Python 2.7, но без проблем можно установить и более старую версию. Проблем с 3-ей версией также не возникнет, он есть в стандартных репозиториях.
- Virtualenv и virtualenvwrapper. Благодаря этим пакетам можно создать свою песочницу для каждого проекта Django, указав свой собственный интерпретатор Python (2.6, 2.7, 3, 3.1 - и всё на одной машине) и набор пакетов (а также версий пакетов). Данное ПО позволяет изолировать проекты друг от друга, при необходимости используя разные версии библиотек. Допустим, в одном проекте используется lxml версии 2.3.1, а в другом 3.2.1. Как быть? Просто добавляем в одно окружение 2.3.1, а в другое - 3.2.1, и никаких конфликтов библиотек не будет.
- Gunicorn. Этот легковесный сервер позволяет размещать на одном сервере проекты, использующие разные версии Python. В отличие от
apache2-mod-wsgi, он позволяет работать одновременно и с Python2.6, и с Python2.7 (имеется ввиду разделение по проектам). Работа же mod-wsgi глобальна, т.е. весь сервер сразу поддерживает либо одну версию Python, либо другую. - Supervisor. Эта утилита позволяет демонизировать процессы. В рассматриваемом случае она будет запускать gunicorn-серверы проектов. Некоторые скажут, что можно использовать
init. Пожалуйста, я никого не заставляю, но настроек для init'а у меня нет. - PostgreSQL. Наиболее продвинутая из бесплатных и максимально соблюдающая SQL-стандарты из известных мне СУБД. С помощью утилиты
pgtuneможно в автоматическом режиме оптимизировать настройки (содержимое файлаpostgresql.conf) под конкретную машину с учётом размера оперативной памяти, дискового кэша и т.д. - Nginx. В представлении не нуждается. Самый производительный web-сервер в мире на сегодня.
- Пакеты для работы с графикой, XML и сборки драйвера
psycopg2PostgreSQL для Python (ставить желательно, но не обязательно):libfreetype6-dev- позволяет Pillow выводить надписи на изображенияzlib1g-dev- включает поддержку PNG-формата для Pillowlibjpeg8-dev- позволяет Pillow обрабатывать JPEG-изображенияlibwebp-dev- позволяет Pillow работать с форматом webplibtiff-dev- комментарии излишниliblcms2-dev- для поддержки библиотеки управления цветовыми профилями Little Color Management System версии 2.libpq-dev- без этого пакета в виртуальном окружении не соберётся пакетpsycopg2, необходимый для использования PostgreSQLlibxml2-dev, libxslt1-dev- без этих двух пакетов в виртуальном окружении не соберётся пакетlxml
Установка пакетов
Для работы нам понадобится установить некоторые пакеты в систему, но прежде чем приступить к установке, нужно будет добавить репозитории PostgreSQL и Nginx в систему, чтобы всегда использовать последние стабильные версии ПО. Переходим в каталог, содержащий файлы с указанием дополнительных репозиториев apt:
cd /etc/apt/sources.list.d/
Создадим здесь два файла со следующим содержимым:
Первый - postgresql.list
deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main
Второй - nginx.list
deb http://nginx.org/packages/debian/ wheezy nginx
deb-src http://nginx.org/packages/debian/ wheezy nginx
Конечно, можно добавить эти строки в файл /etc/apt/sources.list, но я предпочитаю не трогать его, а добавлять сторонние репозитории через создание отдельных .list-файлов в каталоге /etc/apt/sources.list.d/.
На следующем этапе следует добавить ключи для проверки пакетов. Здесь для nginx, здесь для PostgeSQL.
Собственно команды:
wget http://nginx.org/keys/nginx_signing.key
wget https://www.postgresql.org/media/keys/ACCC4CF8.asc --no-check-certificate
apt-key add nginx_signing.key
apt-key add ACCC4CF8.asc
Кратко опишу смысл указанных выше команд.
С помощью утилиты wget были скачаны 2 файла. При этом во втором случае была отключена проверка сертификата для шифрованного соединения по протоколу SSL. Сделано это потому, что у сайта PostgreSQL на момент написания статьи были какие-то проблемы с сертификатом и wget не начинал загрузку, выдавая вместо этого сообщение об ошибке.
Далее с помощью команды apt-key add идёт импорт скачанных ключей в системное хранилище. Debian не работает с репозиториями, для которых у него нет ключей проверки цифровой подписи.
Теперь нужно обновить список доступных пакетов с помощью команды apt-get update и установить необходимое ПО с помощью apt-get install:
apt-get update
apt-get install libfreetype6-dev zlib1g-dev libjpeg8-dev libwebp-dev postgresql-9.3 postgresql-server-dev-9.3 postgresql-contrib-9.3 pgtune libpq-dev libxml2-dev nginx python-pip python-setuptools python-virtualenv virtualenvwrapper python-elementtidy supervisor python2.6-dev
Пакет gunicorn следует ставить отдельно, прямо в виртуальное окружение, поэтому здесь его указывать не надо.
Настройка виртуальных окружений и среды
Запуск любых серверных скриптов должен происходить под ограниченной учётной записью. В Debian по умолчанию для этого используется учётная запись www-data. Откройте файл /etc/passwd и убедитесь также, что данному пользователю запрещён вход в систему. При необходимости приведите вот эту строку
www-data:x:33:33:www-data:/var/www:/bin/bash
к вот такому виду:
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
Перейдите в каталог /var и посмотрите, имеется ли там папка www. Если её нет, надо её создать и сделать владельцем пользователя www-data:
cd /var
mkdir www
chown www-data:www-data www/
Теперь нужно будет войти в систему от имени этого пользователя. Так как мы запретили ему вход с использованием шелла, придётся использовать sudo с параметром -s, задающим командную оболочку:
sudo su www-data -s /bin/bash
Без параметра -s система выдаст сообщение, что указанная учётная запись недоступна.
При первом входе в систему в домашнем каталоге пользователя будет создана папка .virtualenvs, о чём будут выведены сообщения.
Создадим виртуальное окружение:
mkvirtualenv project --python=/usr/bin/python2.6
Созданное окружение project будет содержать в себе Python 2.6, не будет видеть пакеты, установленные на уровне всей системы, и может быть активировано командой workon, а деактивировано командой deactivate:
workon project
deactivate
Если вызвать команду workon без параметров, она вернёт список имеющихся виртуальных окружений. Помните, что у каждого пользователя свой набор этих окружений, поэтому результат работы этой команды у каждого пользователя будет свой.
Настройка PostgreSQL
Перейдём в каталог с настройками PostgreSQL:
cd /etc/postgresql/установленная_версия/main/
Настроим доступ к базам по паролю, без наличия учетной записи в системе, для этого изменим в файле pg_hba.conf строку
local all all ident
на
local all all md5
Создадим резервную копию файла настроек, оптимизируем настройки с помощью pgtune и перезапустим службу:
cp postgresql.conf postgresql.conf.bak
pgtune -i postgresql.conf.bak -o postgresql.conf --type=web
service postgresql restart
В версиях PostgreSQL до 9.2 включительно оптимизация настроек с помощью pgtune требует также изменения параметров ядра. Прежде всего надо будет выполнить вот этот скрипт:
#!/bin/bash
# simple shmsetup script
page_size=`getconf PAGE_SIZE`
phys_pages=`getconf _PHYS_PAGES`
shmall=`expr $phys_pages / 2`
shmmax=`expr $shmall \* $page_size`
echo kernel.shmmax = $shmmax
echo kernel.shmall = $shmall
Строки, которые выведет этот скрипт, следует добавить в начало файла /etc/sysctl.conf и перезагрузить систему.
Для создания БД проекта следует запустить интерпретатор PostgreSQL от имени пользователя postgres:
su -c psql postgres
При выполнении SQL-запросов точка с запятой в конце обязательна. Команды, начинающиеся со знака \, вводятся как есть.
Создадим роль project с паролем project и возможностью подключаться к СУБД:
CREATE ROLE project WITH PASSWORD 'project' LOGIN;
Добавим БД project_db, с которой будет работать эта роль:
CREATE DATABASE project_db WITH OWNER project;
Проверим список имеющихся баз данных с помощью команды \l и завершим работу с интерпретатором \q.
Установка пакетов виртуального окружения
Снова залогинимся от имени пользователя www-data. Активируем виртуальное окружение и запустим в нем команду на установку пакетов:
sudo su www-data -s /bin/bash
workon prject
pip install lxml psycopg2 gunicorn Pillow
Если некоторые пакеты должны ставиться из каких-либо внешних репозиториев, следует передать дополнительные параметры:
pip install myPackage -i http://mysite.ru/simple/
Здесь после ключа i идёт указание стороннего репозитория.
Настройка Gunicorn
Для соединения Gunicorn'а с Nginx'ом будем использовать сокеты. В каталоге /var/www/ создадим каталог sockets
cd /var/www
mkdir sockets
chown www-data:www-data sockets/
Теперь в каталоге с настройками проекта /var/www/project/conf создадим файл gunicorn.conf.py со следующим содержимым:
#! coding: utf-8
import os
import multiprocessing
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
short_name = 'project' # Это имя будет далее использоваться для создания сокета
bind = "unix:/var/www/sockets/%s.sock" % (short_name)#Создаём сокет
proc_name = short_name
workers = multiprocessing.cpu_count() * 2 + 1 #Кол-во воркеров вычисляется по рекомендуемой формуле
print "Socket started"
user = "www-data"
group = "www-data"
errorlog = "/var/www/project/log/gunicorn.log"
loglevel = "warn"
timeout = 30 # 30 секунд на завершение воркера при получении сигнала к завершению
keepalive = 5 #Поддерживать каждое подключение 5 секунд
Указанное содержимое затем будете передано gunicorn'у в качестве параметров. Подробно про переменные, использованные в этом файле, можно почитать здесь. Следует сделать этот файл исполнимым:
chmod u+x gunicorn.conf.py
Настройка supervisor
Установим:
apt-get install supervisor -y
Перейдём в каталог /etc/supervisor/conf.d и создадим файл настроек для нашего проекта (вместо vim новичкам советую использовать nano):
cd /etc/supervisor/conf.d
touch project.conf
vim project.conf
Содержимое файла project.conf
[program:project]
environment=DJANGO_SETTINGS_MODULE="project.settings",PYTHONIOENCODING="UTF-8",LANG="ru_RU.UTF-8",LC_ALL="ru_RU.UTF-8",LC_LANG="ru_RU.UTF-8"
command=/var/www/.virtualenvs/project_env/bin/gunicorn_django -c /var/www/project/conf/gunicorn.conf.py
directory = /var/www/project
user="www-data" #По аналогии с gunciron.conf.py
group="www-data"
stderr_logfile = /var/www/project/log/supervisor_error.log
Пожалуй, самой интересной является здесь строка, описывающая переменные окружения. В частности, она указывает, какие локали использовать. Без указания правильных локалей при загрузке или обработке приложением файлов, содержащих в имени символы, коды которых выходят за границы основной таблицы ASCII, можно будет полюбоваться ошибкой Non-Unicode character at position ...
В принципе, последняя строка необязательна, но лог ошибок позволит быстро разобраться в возникающих проблемах приложения. После сохранения файла следует выполнить обновление данных supervisor'а и посмотрим статус нашего проекта:
supervisorctl update
supervisorctl status project
Если всё хорошо, на экран будет выведено примерно следующее:
project RUNNING pid 2801, uptime 0:02:05
Больше делать ничего не надо, supervisor будет сам стартовать после перезагрузки системы и автоматически запускать все демоны. Для сервисного обслуживания БД или обновления сайта следует остановить демон командой stop, запустить заново командой start:
supervisorctl stop project
...
Какие-то сервисные работы, например, обновление Django, проведение миграций и т.д.
...
supervisorctl start project
Настройка nginx
Возможно, в Вашем случае на одной машине будет несколько сайтов, поэтому дабы не повторяться, некоторые настройки следует вынести в отдельный файл. В каталоге /etc/nginx создадим файл proxy_params.conf
/etc/nginx/proxy_params.conf
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 20m;
client_body_buffer_size 1m;
proxy_buffering off;
proxy_connect_timeout 360;
proxy_send_timeout 260;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 1m;
Данная конфигурация успешно работает на машине с 4 Гб RAM и далеко не топовой конфигурацией. Также следует немного модифицировать /etc/nginx/nginx.conf (Вы ведь не забыли сначала сделать его резервную копию, правда?).
user nginx;
worker_processes 2;
worker_priority -5;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
timer_resolution 100ms;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 2;
client_max_body_size 10m;
gzip on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
}
Единственное, на что здесь следует обратить внимание - это параметры client_max_body_size и gzip. По умолчанию максимальный размер одного пакета, который пропускает nginx, равен 24 КБ. В случае, если пользователь захочет загрузить на сайт фотографию размером 30 КБ (смешно, правда, особенно после 41 МП на некоторых смартфонах?), он получит ошибку 304, поэтому данное значение следует в разумных пределах увеличить. gzip позволяет снизить расход трафика, используя сжатие для указанных типов содержимого (список gzip_types). В остальном данный файл практически не отличается от оригинального.
В каталоге /etc/nginx/conf.d/ создадим файл project.conf
/etc/nginx/conf.d/project.conf
upstream project {
server unix:/var/www/sockets/project.sock fail_timeout=0;
}
server {
listen 80;
server_name project.ru www.project.ru;
access_log off;
error_log /var/www/project/log/nginx_error.log crit;
location / {
proxy_pass http://project;
include /etc/nginx/proxy_params.conf;
}
location /static/ {
root /var/www/project/static;
expires 3d;
}
location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt|xlsx|doc|docx|pdf|rar|zip|7z|exe)$ {
root /var/www/project/;
expires 3d;
add_header Cache-Control: public;
access_log off;
error_log /var/www/project/log/nginx_static_error.log;
}
}
Данный конфиг указывает, что динамические запросы следует передавать на сервер, подключенный к сокету /var/www/sockets/project.sock. Для раздачи статики, т.е. запросов, в которых встречается строка /static/, следует использовать содержимое каталога /var/www/project/static/. После сохранения настроек следует перезапустить nginx:
service nginx restart
Если всё сделано правильно, после ввода адреса в браузере мы попадём на сайт.
Установка и настройка ProFTPd в Ubuntu
I. Установка и настройка сервера.
Все действия производятся от имени root.
-
Ставим:
apt-get install proftpd -
Указываем, как запускать, через inetd (маленькая нагрузка) или самостоятельно (десятки пользователей). Если выбрать inetd, то сервер, скорее всего, не стартанёт. Этот глюк был замечен мной и на Ubuntu Server 12.04.1, и на Debian 6.0.6. Если у вас то же самое, то смотрите ниже.
vi /etc/proftpd/proftpd.confЕсли надо, переименовываем сервер:
ServerName "Ultimate Super Mega FTP Server"Меняем ServerType, если он не запускается как демон inetd
ServerType standaloneРаскомментируем вот эту строку, чтобы разрешить пользователям работать только в своих домашних каталогах.
DefaultRoot ~Разрешаем пользователям пользоваться FTP, даже если им запрещено логиниться в системе:
RequireValidShell off -
После всех настроек не забываем перезапустить демон proftpd
/etc/init.d/proftpd restartТакже работает команда
service proftpd restartСервер готов к использованию.
Добавление пользователей.
У нас есть рабочий FTP-сервер, необходимо добавить его пользователей. Пусть все они, для удобства, хранят свои данные в каталоге /var/ftp/%имя_пользователя%. Добавим одного такого пользователя, создав для подобных ему группу ftp_users.
-
Создадим группу:
addgroup ftp_users -
Добавим пользователя
ftp01, указав расположение его домашнего каталога, оболочку, запрет на вход в систему и группу.adduser ftp01 --home /var/ftp/ftp01 --shell /bin/false --disabled-login --ingroup ftp_users -
Зададим пароль свежесозданному пользователю (на экране не будет видно ничего, даже звездочек):
passwd ftp01 Password: Confirm password: Password succesfully changed.

