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

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

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

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

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

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

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

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

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

# echo "deb http://ftp2..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.

Часть вторая – Настройка nginx.
Открываем файл /etc/nginx/nginx.conf и вносим изменения в секцию http {}

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

 log_format  main    '$remote_addr - $remote_user [$time_local] $host $request "$status" $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for" [$user:$domain] "$upstream_response_time"';

 log_format  domain  '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

 log_format  ip      '$remote_addr';
 log_format  bytes   '$body_bytes_sent';

 access_log   /var/log/nginx/access.log main;
 server_tokens off;
 reset_timedout_connection  on;
 ....
 ....
 include maps.conf;
 server {
        listen 1.2.3.4:80 default deferred;
        server_name _;

        location ~ /.svn/ {
            deny all;
        }
        # include custom_vhost.conf;
        include maps_vhost.conf;
    }
}

Описываемые форматы log-файла нужны для того, чтобы nginx писал логи для каждого вирт. хоста (apache будет писать только error_log)

В файле custom_vhost.conf – можно описать “особенные” домены, для которых нужны какие-то персональные дополнительные настройки.

Файл maps_vhost.conf – это и есть общий конфиг для всех доменов/поддоменов/алиасов:


    set $root  /home/$user/domains/$domain/public_html/$subdomain;
    set $domainlog  $domain.$subdomain;

    if ($subdomain = "") {
        set $root  /home/$user/domains/$domain/public_html;
        set $domainlog $domain;
    }
    if ($user = "") {
        set $root /var/www/;
        set $domainlog  ip;
    }
##  maintenance mode
#    error_page  403 404 500 502 503 504  /maintenance.html;
#    location = /maintenance.html  {
#         log_not_found on;
#         access_log off;
#         root  html;
#     }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {  root  html;  }

    location / {
        log_not_found on;
        root        $root;
        access_log  /var/log/httpd/domains/$domainlog.bytes bytes;
        access_log  /var/log/httpd/domains/$domainlog.log domain;
        access_log  /var/log/nginx/access.log main;

        proxy_redirect    off;
        proxy_set_header  Cookie    $http_cookie;
        proxy_set_header  Host      $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass        http://127.0.0.1:80;
    }
    location ~ /\.ht { deny  all; }

    location ~* ^/(webmail|squirrelmail|roundcube|phpMyAdmin)/.+\.(bmp|jpg|jpeg|gif|ico|cur|png|css|doc|txt|js|docx|rtf|ppt|pdf|svg)$ {
        expires     24h;
        root        /var/www/html;
        gzip   off;
        log_not_found off;
        access_log  /var/log/httpd/domains/$domainlog.bytes bytes;
        access_log  /var/log/httpd/domains/$domainlog.log domain;
    }

    location ~* ^.+\.(css|htc|js|bmp|jp?g|gif|ico|cur|png|doc|avi|txt|doc|rtf|swf)$ {
        expires     24h;
        root        $root;
        gzip   off;
        access_log  /var/log/httpd/domains/$domainlog.bytes bytes;
        access_log  /var/log/httpd/domains/$domainlog.log domain;
        log_not_found off;
   }

Map-файл с описанием доменов выглядит так:


map $http_host $user{
        hostnames;
        default       "";
        .adminco.org    "admin";
        .nginx.ks.ua     "admin";
        .site2.com        "user2";
        ....
}
map $http_host $domain {
        hostnames;
        default             "";
        .adminco.org    "adminco.org";
        .nginx.ks.ua     "nginx.ks.ua";
        .site2.com       "site2.com";
        ....
}
map $http_host $subdomain {
        hostnames;
        default             "";
        .blog.adminco.org      "blog";
        ....
}

Этот файл управляется скриптом generate_map.pl, о чем будет написано ниже.
Здесь я привожу немного сокращенное описание виртуального хоста, так сказать, для примера.

Первоначально “пустой” файл maps.conf имеет вид:


map $http_host $user{
        hostnames;
        default     "";
}
map $http_host $domain {
        hostnames;
        default     "";
}
map $http_host $subdomain {
        hostnames;
        default     "";
}

Если на Вашем сервере уже имеются созданные юзеры с их доменами, обратите внимание на UPDATE 2 в конце статьи.

Часть третья – Настройка custom в Directadmin.
Переходим в /usr/local/directadmin/scripts/custom
В этом каталоге есть файл README, где описан каждый custom-скрипт, который может быть выполнен панелью DirectAdmin. Нам нужно будет создать следующие скрипты:

touch user_destroy_post.sh domain_create_post.sh \
        domain_destroy_post.sh  domain_change_post.sh \
        subdomain_create_post.sh  subdomain_destroy_post.sh \
        domain_pointer_create_post.sh  domain_pointer_destroy_post.sh

Эти скрипты будут вызываться панелью при каждом добавлении/удалении домена/поддомена/алиаса или изменении имени домена.

Содержимое файлов.
Скрипт добавления домена – domain_create_post.sh

#!/bin/sh
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
LANG=C
export LANG
export PATH

/usr/local/directadmin/scripts/custom/generate_map.pl -ad $username $domain
if [ $? -gt 0 ]; then
    exit 1;
fi
/etc/init.d/nginx  configtest > /dev/null
if [ $? -gt 0 ]; then
    exit 1;
else
    /etc/init.d/nginx reload
fi
exit 0;

Результат выполнения – добавление домена и имени юзера в мап-файл, с последующим релоадом nginx

Скрипт удаления юзера – user_destroy_post.sh

#!/bin/sh
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
LANG=C
export LANG
export PATH

/usr/local/directadmin/scripts/custom/generate_map.pl -dd $username $domain
if [ $? -gt 0 ]; then
    exit 1;
fi

/etc/init.d/nginx  configtest > /dev/null
if [ $? -gt 0 ]; then
    exit 1;
else
    /etc/init.d/nginx reload
fi
exit 0;

При вызове скрипт удаляет из map-файла пользователя, проверяет корректность конфигурации nginx и если все нормально – делает релоад nginx-у.

Аналогичные скрипты для создания/удаления алиасов и поддоменов.

Как видно из скриптов – все действия выполняются с помощью “generate_map.pl”
Этот скрипт отвечает за работу с мап-файлом для nginx-а.
Возможности скрипта:


(l) copyleft Olden Gremlin aka Alexander P. Russkih, oldengremlin(at)gmail.com, 2009-2010
Use: ./generate_map.pl [-d] [-c maps.conf] {[{-ad|-dd|-aa|-da|-as|-ds} {username}
 {domain} [newdomainname|subdomain|alias]] [...]}
Внимание! Важен порядок следования модификаторов именно в том порядке в котором он описан в Use.
Конфигурационные модицикаторы
        -d выводить в stdout diff итоговой работы
        -c maps.conf путь к файлу с конфигами maps (опционально)
"Циклические" командные модификаторы
        -ad добавить домен
        -rd переименовать домен
        -dd удалить домен и все поддомены в нем
        -aa добавить алиас alias к domain
        -da удалить алиас alias
        -as добавить subdomain к domain
        -ds удалить только subdomain

Идем дальше.
Готовим custom-шаблоны для виртуальных хостов Directadmin.
Скопируем шаблоны для дальнейней правки:

cd /usr/local/directadmin/data/templates; cp  ./virtual_host2* ./custom

в этих шаблонах виртуального хоста нужно изменить строку:

на

Также, уберем запись лог-файлов apache.
Заменим эти строки:

        CustomLog /var/log/httpd/domains/|DOMAIN|.bytes bytes
        CustomLog /var/log/httpd/domains/|DOMAIN|.log combined

на это:

        # CustomLog /var/log/httpd/domains/|DOMAIN|.bytes bytes
        # CustomLog /var/log/httpd/domains/|DOMAIN|.log combined

Аналогично нужно изменить шаблон поддомена
(файл /usr/local/directadmin/data/templates/custom/virtual_host2_sub.conf)

Часть четвертая – Настройка Apache.
Открываем файл /etc/httpd/conf/extra/httpd-vhosts.conf, находим эту строку:

Include /etc/httpd/conf/ips.conf

и заменяем на это:

Include /etc/httpd/conf/ips_cust.conf

Сохранияем изменения, копируем /etc/httpd/conf/ips.conf в /etc/httpd/conf/ips_cust.conf
В новом файле необходимо заменить все внешние ip, которые слушает апач на 80-м порту на одну строчку:

NameVirtualHost 127.0.0.1:80

В итоге этот файл может иметь примерно такой вид:


LogFormat "%O \"%r\"" homedir

NameVirtualHost 127.0.0.1:80

NameVirtualHost 1.1.1.1:443
NameVirtualHost 1.2.3.4:443


        SSLEngine on
        SSLCertificateFile /etc/httpd/conf/.crt/server.crt
        SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
        ServerName shared.domain
        ScriptAliasMatch ^/~([^/]+)/+cgi-bin/+(.*) /home/$1/public_html/cgi-bin/$2
        AliasMatch ^/~([^/]+)(/.*)* /home/$1/public_html$2
        DocumentRoot /home/admin/domains/sharedip
        SuexecUserGroup admin admin
        CustomLog /var/log/httpd/homedir.log homedir



        SSLEngine on
        SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
        SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
        ServerName shared.domain
        ScriptAliasMatch ^/~([^/]+)/+cgi-bin/+(.*) /home/$1/public_html/cgi-bin/$2
        AliasMatch ^/~([^/]+)(/.*)* /home/$1/public_html$2
        DocumentRoot /home/admin/domains/sharedip
        SuexecUserGroup admin admin
        CustomLog /var/log/httpd/homedir.log homedir

Делается это для того, чтобы apache слушал 80 порт только локально и при добавлении или измении ip адресов в Directadmin-е не заменялся этот конфиг. В данной реализации конфига SSL-соединения обрабатываются самим apache, поэтому настройки SSL не меняются.

Просим панель пересоздать пользовательские httpd.conf файлы:

echo “action=rewrite&value=httpd” >> /usr/local/directadmin/data/task.queue

После пересоздания пользовательских httpd.conf можно проверить корректность вновь созданных конфигов и перезапустить apache и nginx:

# apachectl configtest ; nginx -t
Syntax OK
the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful

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

Дополнительно в конфигурации вирт.хоста nginx-а можно добавить ограничение по количеству запросов в секунду, ограничить количество запросов к апаче с одного IP, кеширование и т.д. и т.п.

Данная конфигурация уже больше года довольно успешно работает более, чем на 10-ти серверах.

Кому будет интересно – оставляйте коментарии, скрипт отправлю по email.
Так же выслушаю любые поправки, коментарии, дополнения и т.д.

UPDATE.
Совершенно забыл написал, что для апачи нужно доставить модуль mod_rpaf, иначе в логах апачи будет фиксироваться локальный ip адрес вместо ip клиентов.
Добавляется модуль просто:

cd /usr/local/directadmin/custombuild
wget http://www.stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

Теперь чуть подправим конфиг httpd.conf. Добавим в начало файла:

LoadModule rpaf_module /usr/lib/apache/mod_rpaf-2.0.so

RPAFenable On
RPAFproxy_ips 127.0.0.1  x.x.x.x
RPAFsethostname On
RPAFheader X-Forwarded-For

x.x.x.x – внешний IP адрес сервера. Если их несколько – добавляются через пробел

Записываем изменения и проверяем синтаксис:

apachectl configtest
Syntax OK

UPDATE 2.
Один из читателей попросил скриптик для генерации файла maps.conf для уже существующих аккаунтов на сервере.
Что ж, я не сильный скрипто-писатель, тем не менее скрипт набросал.
Скрипт пересоздает полный maps.conf используя данные из /usr/local/directadmin/data/users/

Взять можно по этой ссылке.

Вот теперь все 🙂

Благодарности.
Хочу выразить спасибо Игорю Сысоеву за создание и написание nginx,
Александру Русских за написание скрипта,
Кириллу Коринскому за написание патчей,
клиентам, которые согласились устраивать эксперименты на их серверах,
а также компании Google за их поисковик 🙂

© Просто БлогЪ, AdminCo, 2010
Используя информацию этой статьи, уважайте чужой труд – указывайте ссылку на источник и авторов

237 comments on “Directadmin+nginx полный автомат

  1. Точно 🙂 спасибо!

    Хотя помоему панелька что то колдует нужно будет файлы скриптов проверить:)

    А то может накосячил я чего по ночи 🙂

    Ещё раз огромное Вам спасибо!

    Всем буду рекомендовать Ваш блог:)

  2. и кстати готов немного пожертвовать на развитие сайта 🙂

    только скажите кошелёчек)

  3. Без проблем , для хороших людей и специалистов не пожадничавших своих знаний, всегда пожалуйста 🙂

  4. когда создал пользователя и добавил домен, на этом домене скрипты работают но статика не отдается 404. http://gamepuzzle.ru/ все комменты выше прочитал не помогло =(

    • статика именно с указанного домена отдается.
      А то, что не отображается – отдается совершенно с другого домена (portal.idxxxxx), вот с тем и разбирайтесь.

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

    Зарание спасибо.

  6. Большое спасибо за статью, давно искал нечто подобное, настолько толковый подход редко где можно встретить!
    Пришлите скриптик пожалуйста.
    Зарание Благодарю.

  7. Хотелось бы видеть полную статью без использования Apache,
    а только nginx+php-fpm.
    спасибо

    • Алексей, в интернетах на подобные статьи (php-fpm+nginx) я натыкался довольно часто. Погуглите 🙂
      У себя в блоге я описываю лишь те варианты, которые я делал лично… Правда не всё и не всегда.

      В любом случае, спасибо за коментарий
      😉

  8. В скором времени напишу статью, как я побеждал nginx+php-fpm с виртуальными хостами и запуском пулов от отдельных пользователей, а также объединением серверов хостинга в кластер под управлением haproxy…. Ждите…

    • Ура!!! наконец то нашел как наиболее полно поставить nginx на directadmin. РЕСПЕКТ!

      скинь скрипт на майл, заранее сенкс.

  9. Добавил небольшой скриптик.
    В случае если на сервере уже есть аккаунты пользователей или случайно удален файл maps.conf, можно воспользоваться скриптом приложенным в конце статье.

  10. Копируем шаблоны

    #cd /usr/local/directadmin/data/templates
    #cp virtual_host.conf custom/virtual_host.conf
    #cp virtual_host2.conf custom/virtual_host2.conf
    #cp virtual_host_sub.conf custom/virtual_host_sub.conf
    #cp virtual_host2_sub.conf custom/virtual_host2_sub.conf

    Теперь в скопированных нами файлах, нужно поправить порт. В каждом файле, строку:

    заменить на:

    Теперь у нас apache будет слушать виртуальные хосты на 8181 порту. А уж чтобы до него был доставлен трафик, мы позаботимся. Точнее позаботится об этом nginx.

    Для добавления репозитория от CentALT создадим файл »/etc/yum.repo.d/centalt.repo» со следующим содержимом
    [CentALT]
    name=CentALT Packages for Enterprise Linux 5 – $basearch
    baseurl=http://centos.alt.ru/repository/centos/5/$basearch/
    enabled=1
    gpgcheck=0

    Далее выполняем команду установки
    yum install nginx

    добавить nginx в автозагрузку
    chkconfig –levels 235 nginx on
    Далее конфиг nginx.conf
    worker_processes 3;
    pid logs/nginx.pid;
    events {
    worker_connections 1024;
    }

    http {
    access_log off;
    error_log off;
    include 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”‘;
    server {
    access_log off;
    error_log off;
    listen 1.2.3.4:80; # IP:port которые будут слушаться
    server_name *.*; #нам нет никакого различия на какой вирт-хост пришел запрос. Всё обрабатывает apache

    charset windows-1251;

    location /
    {
    proxy_pass http://1.2.3.4:8080/; # адрес который слушает apache.
    proxy_redirect off;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    client_max_body_size 10m;
    client_body_buffer_size 8k; #128k

    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;

    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    }
    }
    }
    Нужно поправить файл /etc/httpd/conf/httpd.conf
    Строку «Listen 80» заменить на «Listen 8080».
    Нужно поправить файл /etc/httpd/conf/ips.conf.
    «NameVirtualHost 1.2.3.4:80» на «NameVirtualHost 1.2.3.4:8080».
    Ставим mod_rpaf.
    Пересоздаем хосты.
    Перезапускаем apache.

    • >worker_processes 3;
      количество воркеров желательно выставлять = кол-ву ядер.

      >server_name *.*;
      Этого я вообще не понял, зачем так ??

      В таком случае, уж лучше используйте стандартное:
      server_name _;
      Иил вообще не использовать эту директиву. В документации nginx написано об этом.

      >charset windows-1251;
      Пора уже избавляться от допотопных вещей 😉

      Еще одно замечание. Вы никогда не увидите, что творится с nginx – у вас выключено ведение всех логов.

  11. Копируем шаблоны

    #cd /usr/local/directadmin/data/templates
    #cp virtual_host.conf custom/virtual_host.conf
    #cp virtual_host2.conf custom/virtual_host2.conf
    #cp virtual_host_sub.conf custom/virtual_host_sub.conf
    #cp virtual_host2_sub.conf custom/virtual_host2_sub.conf

    Теперь в скопированных нами файлах, нужно поправить порт. В каждом файле, строку:

    заменить на:

    заменить на:

  12. Не пому в чем разница. В вашем способе много манипуляций. Вариант который мой куда проще…

  13. Как избавить от этого

    в логах пишет nginx

    [crit] 25954#0: *496464 open() “/var/log/httpd/domains/ip.log” failed (13: Permission denied) while logging request, client:

    • Или разрешить писать пользователю, под которым работает nginx, писать в /var/log/http/domains/
      Или чуть изменить конфигурацию вирт.хоста и не писать эти логи )

  14. DeNiTo,
    вариант проксировать полностью *все* на бекенд – намного проще. Именно так у меня и было три года назад )

    Отличие моего способа, описанного в этой статье, в том что бекенд (апач) не занимается раздачей статики и не пишет access.log. Этим занимается nginx.
    Я не вижу смысла в том, чтобы и без того нагруженный апач, занимался еще и раздачей отдачей статики, бесполезно затрачивая на это ресурсы.

    Надеюсь Вы поняли разницу ?

  15. admin, не очень. Поставил все по Вашей статье, но в логах пишет что что я дал и с алиасами проблема, при переходе ip/phpMyAdmin все нормально, а так /phpmyadmin нет. Нет картинок , js не работают и в орги пишет [crit] 25954#0: *496464 open() «/var/log/httpd/domains/ip.log» failed (13: Permission denied) while logging request, client:

    Подскажите пожалуйста как исправить?

  16. в linux “phpMyAdmin” и “phpmyadmin” – это два *разных* значения.
    Создайте симлинк phpmyadmin на phpMyAdmin, проблемы с картинками не будет

    • В локейшне
      location ~* ^/(webmail|squirrelmail|roundcube|phpMyAdmin)/…….
      добавьте
      location ~* ^/(webmail|squirrelmail|roundcube|phpMyAdmin|phpmyadmin)/.

    • ну, допишите location для /phpmyadmin
      Например так:

      location ~* ^/phpmyadmin/(.+\.(jp?g|gif|ico|cur|png|css|htc|doc|txt|js))$ { expires 7d; alias /var/www/html/phpMyAdmin/; gzip off; log_not_found on; ... ... }
      • nginx -t

        nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
        nginx: configuration file /etc/nginx/nginx.conf test is successful

        nginx: nginx version: nginx/0.9.3
        nginx: built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
        nginx: TLS SNI support disabled
        nginx: configure arguments: –user=nginx –group=nginx –prefix=/usr/share/nginx –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/tmp/client_body –http-proxy-temp-path=/var/lib/nginx/tmp/proxy –http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi –pid-path=/var/run/nginx.pid –lock-path=/var/lock/subsys/nginx –with-http_secure_link_module –with-http_random_index_module –with-http_ssl_module –with-http_realip_module –with-http_addition_module –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_gzip_static_module –with-http_stub_status_module –with-http_perl_module –with-http_geoip_module –with-mail –with-mail_ssl_module –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables’ –with-ipv6 –with-file-aio –add-module=/builddir/build/BUILD/nginx-0.9.3/nginx-upstream-fair –add-module=/builddir/build/BUILD/nginx-0.9.3/nginx-upload-progress-module –add-module=/builddir/build/BUILD/nginx-0.9.3/mod_zip-1.1.6 –add-module=/builddir/build/BUILD/nginx-0.9.3/nginx_upload_module-2.2.0 –add-module=/builddir/build/BUILD/nginx-0.9.3/nginx_mod_h264_streaming-2.2.7

      • поправка:

        -alias    /var/www/html/phpMyAdmin/;
        +alias    /var/www/html/phpMyAdmin/$1;
        

        смотрите логи. там будет написано, что происходит.

  17. 2011/01/16 16:07:07 [crit] 11592#0: *22 open() “/var/log/httpd/domains/ip.log” failed (13: Permission denied) while logging request, client: мой IP, server: _, request: “GET /phpmyadmin/themes/original/img/b_home.png HTTP/1.1”, host: “site.ru”

    • По поводу прав я уже писал чуть выше.

      Или дать права на запись пользователю под которым работает nginx или не логировать запросы.

  18. Здравствуйте.
    А не подскажете как можно получить перловый скрипт генератор?
    В любом случае спасибо.

  19. да! где перловый скрипт генератор??? (на эту почту пошли те плиз и опубликуйте на сайте)

    • Sergey, честно говоря, вот из-за такого отношения и не выкладываю.
      Извините, разве Вам тут кто-то чем-то обязан ? 🙂

      Вечером, когда будет время, отправлю на указанный емаил.

  20. “опубликуйте на сайте”
    категоричность просто убивает 🙁
    а где волшебное слово? (“бегом!” не подходящий вариант)

  21. admin, хотелось бы видеть в вашем блоге как покрестить DirectAdmin+nginx+mpm-itk и если стоит уже mod_ruid2, очень полезная статья бы была, все перерыл, нормальных манов нет вообще.

  22. DeNiTo, а в чем проблема скрестить DA+nginx+ruid2 ?
    Вся инфа есть, просто собрать все до кучи.
    У меня именно так и работает. Правда, я использую еще и ACL, т.к. у меня nginx работает под своим юзером.

    Что касается itk, то не использую.

  23. DA+nginx+ruid2 стоит, нужен mpm-itk чтобы в случаее чего не весь сервер ложился, а только сайт “жертвы” или кто привышает лимиты установленные.

        • map $http_host $user {
                  hostnames;
                  default "";
          map $http_host $domain {
                  hostnames;
                  default "";
          map $http_host $subdomain {
                  hostnames;
                  default "";
          

          поправил прежде чем написать, полные пути в инклюдах тоже написал, результат нулевой, причём закоментив месо где определяется $root в отсутствии $user , получаю в логи
          open() “/home//domains//public_html/*” failed (2: No such file or directory),

          nginx/0.8.53
          include /etc/nginx/maps.conf;

          server {
          listen 80 default deferred;
          server_name _;
          # location ~ / {
          # deny all;
          # }
          # include custom_vhost.conf;
          include /etc/nginx/maps_vhost.conf;
          }

        • Формат файла именно такой, как Вы написали, без закрывающих скобок ?
          nginx -t – что пишет ?

        • конечно с закрывающей, тазик не мой
          nginx -t
          the configuration file /etc/nginx/nginx.conf syntax is ok
          configuration file /etc/nginx/nginx.conf test is successful

      • Zak, если удобно, отправьте мне на мыло Ваши конфиг-файлы. приватные данные в конфигах можно заменить на что то другое.

        • выше не верно написал, listen 81 в конфиге…
          спасибо за помощь, ошибка была в следствии использования адреса порта в адресной строке http://domain.ru:81/ регулярка соответственно в имя домена засовывала domain.ru:81 а такого естественно нет…

  24. Мил человек, спасибо за статью! то, что нужно. сейчас этим самым и занимаюсь, и задумался над тем, как же все таки реализовать root в локейшенах, которые отвечают за статику, которые по сути по одному пути находятся, но тем не менее уникальны.. regexp не поможет. и тут вижу – о, красота!
    set $root /home/$user/domains/$domain/public_html/$subdomain;
    Автор, помогите скриптом generate_map.pl, буду благодарен очень!)

  25. спасибо админу!) буду сегодня настраивать мапы на freebsd8, о результатах отпишу сюда же)

    • Вопрос – возможно по конкретнее по части custom скриптов, не совсем понятно “Аналогичные скрипты для создания/удаления алиасов и поддоменов.”?

      • при любых действиях с доменами (поддоменами или алиасами) необходимо изменить данные в map-файле. Это делается с помощью custom-скриптов, которые надо создавать самому. Пример подобного скрипта описан в статье.
        Что именно Вам не понятно ?

        • В частности не понятно что писать в файлах:
          domain_change_post.sh
          domain_pointer_create_post.sh
          domain_pointer_destroy_post.sh

          остальные по аналогии сделал, работают

  26. Если совсем коротко, то вот это надо использовать:

    > domain_change_post.sh
    /usr/local/directadmin/scripts/custom/generate_map.pl -rd $username $domain $newdomain

    > domain_pointer_create_post.sh
    /usr/local/directadmin/scripts/custom/generate_map.pl -aa $username $domain $from

    > domain_pointer_destroy_post.sh
    /usr/local/directadmin/scripts/custom/generate_map.pl -da $username $domain $from

    В файле /usr/local/directadmin/scripts/custom/README описаны все переменные, которые могут быть использованы в custom-скриптах.

    • Появился вопрос – после обновления nginx до 0.8.53 перестала отдаваться статика со всех хостов описаных в maps.conf (в почтовых интерфейсах, pma и т.д. всё отдаётся). Собрано вроде как с http_map_module (по крайней мере не отключал, установлен из репозитария), воплей со стороны nginx никаких (логи чистые). Не могу понять в чём косяк, до обновиловки всё ок.
      На всякий пожарный – Centos 5, nginx -V:

      nginx version: nginx/0.8.53
      built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
      TLS SNI support disabled
      configure arguments: –user=nginx –group=nginx –prefix=/usr/share/nginx –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/tmp/client_body –http-proxy-temp-path=/var/lib/nginx/tmp/proxy –http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi –http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi –http-scgi-temp-path=/var/lib/nginx/tmp/scgi –pid-path=/var/run/nginx.pid –lock-path=/var/lock/subsys/nginx –with-http_ssl_module –with-http_realip_module –with-http_addition_module –with-http_xslt_module –with-http_image_filter_module –with-http_geoip_module –with-http_sub_module –with-http_dav_module –with-http_flv_module –with-http_gzip_static_module –with-http_random_index_module –with-http_secure_link_module –with-http_degradation_module –with-http_stub_status_module –with-http_perl_module –with-mail –with-file-aio –with-mail_ssl_module –with-ipv6 –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables’ –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables’

        • nginx -t
          the configuration file /etc/nginx/nginx.conf syntax is ok
          configuration file /etc/nginx/nginx.conf test is successful

          всё чисто до безобразия, конфиги какие именно?

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

*