В продолжение темы о связке nginx + apache + directadmin решил все же написать хоть что то :)

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

Суть заключается в том, что nginx полностью отвечает за отдачу всей статики (картинки, архивы, файлы стилей и т.д.), а апач занимается обработкой скриптов. Для снижения нагрузки апач не ведет access_log (только error_log),  логи так же ведет nginx. За SSL тоже отвечает nginx.

nginx выступает в роли фронт-енда, в то время как апач – в роли бек-енда. nginx слушает внешние IP адреса, апач – только один, например, 127.0.0.1:80

Итак, копируем некоторые шаблоны DirectAdmin:

# cd /usr/local/directadmin/data/templates
# cp ./virtual_host*  ./custom/  && cp ./ips_virtual_host.conf ./custom && cd ./custom

Далее необходимо отредактировать скопированные шаблоны для наших нужд.

Файл  /usr/local/directadmin/data/templates/custom/ips_virtual_host.conf выглядит так:

<VirtualHost 127.0.0.1:80>
  ServerName shared.domain
  ScriptAliasMatch ^/~([^/]+)/+cgi-bin/+(.*) /home/$1/public_html/cgi-bin/$2
  AliasMatch ^/~([^/]+)(/.*)* /home/$1/public_html$2
  DocumentRoot |DOCROOT|
  |*if APACHE_VER="2.0"|
  SuexecUserGroup |USER| |GROUP|
  |*else|
  User |USER|
  Group |GROUP|
  |*endif|
  CustomLog /var/log/httpd/homedir.log homedir
</VirtualHost>

В файлах virtual_host_* меняем строки: <VirtualHost |IP|:80> на <VirtualHost 127.0.0.1:80>

Далее, создаем (или добавляем туда, если такие уже есть) post-скрипты в /usr/local/directadmin/scripts/custom для создания и удаления конфигов nginx.

Автосоздание конфига nginx, файл 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
LIMIT=10
echo "Making config files: "
echo -e "#
# NginX http server.
# Virtual host config ver. 0.2 (14.10.2008), nginx v.5.xx
# autocreated on: `date \"+%d.%m.%Y %H:%M:%S\"`
#
server {
   listen $ip:80;
   server_name $domain www.$domain;
   error_page  500 502 503 504 /50x.html;
   location = /50x.html { root   html;  }
   # images files location
   location ~* ^.+\.(bmp|jpg|jpeg|pjpeg|gif|ico|cur|png|css|doc|txt|js|docx|rtf|ppt|pdf|svg)$ {
      expires     5d;
      set \$root_path  /home/${username}/domains/${domain}/public_html;
      if (\$uri ~* \"/(squirrelmail|atmail|roundcube|phpMyAdmin|webmail)/\") { set \$root_path  /var/www/html; }
         root  \$root_path;
         access_log  /var/log/httpd/domains/${domain}.bytes bytes;
         access_log  /var/log/httpd/domains/${domain}.log domain;
      }
   # Static files location
   location ~* ^.+\.(swf|3gp|dll|msi|cdr|cdd|cue|cdi|mkv|nrg|pdi|mds|mdf|arj|zip|tgz|gz|rar|bz2|7z|xls|exe|tar|wav|avi|mp3|mp4|mov|wmv|vob|iso|mpg|midi|cda|wma)$ {
      expires     10d;
      set \$root_path  /home/${username}/domains/${domain}/public_html;
      if (\$uri ~* \"/(squirrelmail|atmail|roundcube|phpMyAdmin|webmail)/\") { set \$root_path  /var/www/html; }
      root  \$root_path;
      limit_conn one 2;
      limit_rate 220k;
      access_log  /var/log/httpd/domains/${domain}.log domain;
      access_log  /var/log/httpd/domains/${domain}.bytes bytes;
      access_log  /var/log/httpd/nginx/access.log main;
   }
   location / {
     limit_conn  one  ${LIMIT};
     root        /home/${username}/domains/${domain}/public_html;
     access_log  /var/log/httpd/nginx/access.log main;
     access_log  /var/log/httpd/domains/${domain}.bytes bytes;
     access_log  /var/log/httpd/domains/${domain}.log domain;
     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;
     proxy_redirect off;
   }
   location ~ /\.ht { deny  all; }
}
" >  /usr/local/nginx/conf/vhosts/$domain.conf
if [ -f /usr/local/nginx/conf/vhosts/$domain.conf ]; then
   chown root.root /usr/local/nginx/conf/vhosts/$domain.conf
   chmod 644 /usr/local/nginx/conf/vhosts/$domain.conf
   /etc/init.d/nginx reload
   echo "[ OK ]"
fi
exit 0

файл domain_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
rm -f /usr/local/nginx/conf/vhosts/$domain.conf
/etc/init.d/nginx reload
exit 0

В основном конфиге nginx некоторые измения для ведения логов, совместимых с апачем:

    log_format  main    '$remote_addr - $remote_user [$time_local] $host $request "$status" $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    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  bytes   '$body_bytes_sent';

    limit_zone   one  $binary_remote_addr  10m;
    server {
        listen IP_сервера:80 default backlog=2048  deferred;
        .....
        .....
    }
    include conf/vhosts/*.conf;

Остальные настройки nginx уже настраивайте под себя.

На этом, собственно все.

Есть недоработки, например, ручками нужно править конфиг nginx в случае создания алиаса к уже существующему домену. Кроме того, конфиг подобного вида не оптимальный. Тут очень напрашивается использовать map в nginx.

Надеюсь пригодится не только мне ;)

Popularity: 100% [?]