Directadmin+nginx полный автомат

Доброго всем LOCALTIME ! 🙂

Решил поделиться с общественностью своими скриптами для связки directadmin и nginx.

В свое время для снижения нагрузки на apache было решено поставить nginx. После некоторого гугления была сделана первая попытка связать панель и nginx. На тот момент скрипт умел совсем немного - только создавать и удалять конфигурационные файлы виртуальных хостов. Он не умел работать ни с поддоменами, ни с алиасами, не умел и переименовывать конфиги доменов.

Затем последовала вторая попытка. Этот скрипт уже был немного "умнее". Он умел создавать, удалять не только домены, но и поддомены. Однако, после того, как количество вирт. хостов выросло и управляться с большим количеством доменов стало как-то трудно, было решено полностью переписать всю схему работы связки directadmin и nginx. Все домены/поддомены/алиасы будут описываться в map-файле, а в конфиге будут использоваться соответствующие переменные, тем самым будет использоваться всего один небольшой общий конфиг, в котором и описывается виртуальный хост.
"Особые" домены описываются в отдельных конфигурационных файлах.
Кроме того, логи для всех вирт. хостов будет писать nginx, освободим нашего монстра apache от этой обязанности и оставим ему писать только error_log. Что положительно скажется на производительности.

Сказано - сделано.
По моей просьбе и некоторому подобию ТЗ, мой друг Александр Русских написал совсем новый и удобный скрипт, который и будет использоваться в этой статье.
Еще одна моя просьба была направлена Кириллу Коринскому, который написал небольшой патч для nginx. Данный патч выдает 503 ошибку, если уровень load average системы выше заданного в конфиге значения. Да, это грубо, но зато может уберечь сервер от ухода в глубокий своп. Поэтому уровень LA необходимо указывать заведомо высокий.

Итак, поехали.

Часть первая (Если nginx уже установлен - смотрим вторую часть)
У нас в распоряжении сервер с установленной панелькой DirectAdmin (отличная, кстати, панель). Чтобы не делать из системы свалку, nginx будет ставиться из репозитария.

Добавляем репозитарий в список, импортируем ключи и ставим nginx:

# echo "deb http://ftp2.debian.org.ua/debian-dou/ lenny main" >> /etc/apt/sources.list
# gpg --keyserver keys.gnupg.net --recv-keys 0A3D4789
gpg: requesting key 0A3D4789 from hkp server keys.gnupg.net
gpg: key 0A3D4789: public key "Debian.org.ua Custom Repository " imported
gpg: Total number processed: 1
gpg:               imported: 1
# gpg --armor --export 0A3D4789 | apt-key add -
OK
# aptitude update
# aptitude install nginx

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

После установки nginx не запустится - это нормально, так как на 80-м порту все еще работает apache.
Дальше будем приводить в порядок конфигурационные файлы apache и nginx.
Читать дальше Directadmin+nginx полный автомат

Как добавить XSL без пересборки php на сервере с DirectAdmin

Если после сборки остался каталог с исходниками php, то включить модуль довольно просто:

# cd /usr/local/directadmin/custombuild
# cd php-5.2.12/ext/xsl
# phpize
# ./configure
# make && make install

после чего, модуль xsl.so будет находится в /usr/local/lib/php/extensions/no-debug-non-zts-20060613

Добавляем в php.ini

extension=xsl.so

И напоследок делаем "мягкий" рестарт апача:

apachectl graceful

Exim + Greylist + Directadmin

В предыдущей статье я описывал как ставил грейлист  на тазик с панелью directAdmin на CentOS-е.

Нашел время написать как я ставил greylist  под Debian
Итак, имеем: Debian Lenny, DirectAdmin, exim из комплекта панели. Потребуется установить демон greylistd и после чуть подправить конфиг ексима.
Приступаем:

aptitude update
aptitude install  greylistd

Теперь необходимо поправить конфиг ексима. Ищем первый accept  в acl_smtp_rcpt и добавляем перед ним:
[eng]Now need to change exim.conf. Find first 'accept' in 'acl_smtp_rcpt' and add before:

# GreyListing
    defer   message    = Sender verification for $sender_host_address in progress. Please try later.
        log_message    = greylisted.
        !senders       = :
        !hosts         = : +relay_hosts : +whitelist_hosts : +whitelist_hosts_ip
        !authenticated = *
        !domains       = : ${if exists {/etc/greylistd/skip-greylist}\
                                 {/etc/greylistd/skip-greylist}{}}
        domains        = +local_domains : +relay_domains
        verify         = recipient/callout=20s,use_sender,defer_ok
        condition      = ${readsocket{/var/run/greylistd/socket}\
                            {--grey \
                                  $sender_host_address \
                                  $sender_address \
                                  @$domain}\
                              {5s}{}{false}}
    deny   message = $sender_host_address is blacklisted
        log_message = blacklisted.
        !senders       = :
        !authenticated = *
        verify         = recipient/callout=20s,use_sender,defer_ok
        condition      = ${readsocket{/var/run/greylistd/socket}\
                                 {--black \
                                  $sender_host_address \
                                  $sender_address \
                                  $local_part@$domain}\
                                 {5s}{}{false}}

Далее, ищем в ACL acl_smtp_data первый accept и вставляем перед ним:
Next, find first 'accept' in ACL acl_smtp_data and add before this code:

     defer
        message        = Sender verification for $sender_host_address in progress. Please try later.
        log_message    = greylisted.
        senders        = :
        !hosts         = : +relay_hosts : +whitelist_hosts : +whitelist_hosts_ip
        !authenticated = *
        condition      = ${readsocket{/var/run/greylistd/socket}\
                                 {--grey \
                                  $sender_host_address \
                                  $recipients}\
                                  {5s}{}{false}}
    deny
        message = $sender_host_address is blacklisted from delivering \
                     mail from <$sender_address> to <$recipients>.
        log_message   = blacklisted.
        !senders       = :
        !authenticated = *
        condition      = ${readsocket{/var/run/greylistd/socket}\
                                 {--black \
                                  $sender_host_address \
                                  $recipients}\
                                  {5s}{}{false}}

В файле /etc/greylistd/skip-greylist можно прописать домены (локальные) для которых не включать грейлистинг. Формат файла простой - один домен на строчку.
Вот собственно все.

In file /etc/greylistd/skip-greylist you can write whitelisted domains. One domain per line.

Если будет свободное время, напишу как прикрутить DSPAM  + Exim + Directadmin

nginx 0.8.20 для Debian Lenny

Собрал для Debian Lenny deb-пакет.

Что нового в 0.8.20 версии:

*) Изменение: теперь по умолчанию используются следующие шифры SSL:
"HIGH:!ADH:!MD5".

*) Исправление: модуль ngx_http_autoindex_module не показывал последний
слэш для линков на каталоги; ошибка появилась в 0.7.15.

*) Исправление: nginx не закрывал лог, заданный параметром конфигурации
--error-log-path; ошибка появилась в 0.7.53.

*) Исправление: nginx не считал запятую разделителем в строке
"Cache-Control" в строке заголовка бэкенда.

*) Исправление: nginx/Windows мог не создать временный файл, файл в
кэше или файл с помощью директив proxy/fastcgi_store, если рабочий
процесс не имел достаточно прав для работы с каталогами верхнего
уровня.

*) Исправление: строки "Set-Cookie" и "P3P" в заголовке ответа
FastCGI-сервера не скрывались при кэшировании, если не
использовались директивы fastcgi_hide_header с любыми параметрами.

*) Исправление: nginx неверно считал размер кэша на диске.

Взять можно тут

Также собрал пакет, в который включены патчи, позволяющие использовать:
переменные $crc32_name и $md5_name
переменные $loadavg_1m, $loadav_5m, $loadavg_15m
А также использовать оперраторы < !< > !> в if-условиях

За патчи отдельное спасибо Кириллу Коринскому

Пакет можно взять тут

nginx 0.8.15

Собрал свежую версию nginx для Дебиан-а.  Пакет собран с опциями:

--with-mail
--with-mail_ssl_module
--with-http_stub_status_module
--with-http_flv_module
--with-http_ssl_module
--with-http_dav_module
--with-http_sub_module
--with-http_realip_module
--with-http_gzip_static_module
--with-debug

Также в сборку включены два  патча Кирилла Коринского,  который выдает 503 ошибку в случае превышения заданного в конфиге значения load average

Взять можно тут

CSF FireWall + DirectAdmin

ConfigServer сделали интеграцию CSF фаирвола с панелью управления хостингом DirectAdmin.

При установке скрипт проверяет необходимые параметры и сам интегрируется в администртивную часть DirectAdmin-а. Все просто и удобно. Настройки CSF фаирвола будут доступны для редактирования в административной части хостинг-панели.

Итак, устанавливаем:

wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh

После установки запускем скрипт для проверки необходимых модулей в iptables:

# perl /etc/csf/csftest.pl
Testing ip_tables/iptable_filter...OK
Testing ipt_LOG...OK
Testing ipt_multiport/xt_multiport...OK
Testing ipt_REJECT...OK
Testing ipt_state/xt_state...OK
Testing ipt_limit/xt_limit...OK
Testing ipt_recent...OK
Testing ipt_owner...OK
Testing iptable_nat/ipt_REDIRECT...OK

RESULT: csf should function on this server

При установке скрипт автоматически делает преднастройку первоначального конфигурационного файла.
После инсталляции можно приступить к более тонкой настройке параметров либо прямо в файле /etc/csf.conf, либо в панели управления.
Скиншоты GUI посмотреть можно тут, тут и тут

CSF великолепно работает как с панелями так и без них, CSF Firewall интегрируется в такие панели как: Cpanel, DirectAdmin, Webmin

Nginx как проксирующий фронт-енд к Apache

Что имеем:

Самый обычный набор namebased хостинг-провайдера:
- apache 1.3.x
- DirectAdmin
- на сервер на базе CentOS 5.x и тормоза при отдаче страниц клиентам

Что получим:
- Nginx в качестве фронт-енда для Апачи
- автосоздание конфигов для виртуал.хостов из Directadmin
- ограничение количества коннектов с одного IP
- ощутимое снижение нагрузки на сервер и на Apache

Установка nginx.
Скачиваем стабильную ветку (на момент написания 0.6.32 - последняя стабильная версия) :
# wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz
# tar -zxvf ./nginx-0.6.32.tar.gz
# cd nginx-0.6.32

в файле configure указываем нужные модули, а неиспользуемые лучше отключить. Большое количество модулей немного замедляет работу nginx.
У меня nginx собирается такой:

cat ./myconfigure
#!/bin/sh
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/bin \
--without-http_ssi_module \
--without-http_auth_basic_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--user=apache \
--group=apache \
--with-http_stub_status_module \
--with-http_realip_module \
--without-http_charset_module \
--without-http_memcached_module \
--without-http_upstream_ip_hash_module \
--without-http_browser_module \
--with-http_flv_module \
--with-http_sub_module \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log

# ./myconfigure
....
# make ; make install

Далее надо будет настроить конфиг nginx и шаблоны апачевского конфига от директадмина
...
Будет больше времени, допишу как это все это сделал....