Как поставить Nginx для DirectAdmin под FreeBSD

Внимание! Для корректной работы у вас должен быть установлен bash и доступен как /usr/local/bin/bash!

 

Сначала ставим nginx из портов:

portsnap fetch extract update

portinstall nginx

 

А вот mod_rpaf придеться ставить из исходников:

wget -c http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz

tar -zxf mod_rpaf-0.6.tar.gz

cd mod_rpaf-0.6/

apxs -iac mod_rpaf-2.0.c

Найдите в конфиге апача /etc/httpd/conf/httpf.conf такую строку:

LoadModule rpaf_module

И допишите после нее:

/etc/httpd/conf/extra/rpaf.conf

 

Теперь создайте скрипт rpaf.sh, который надо запускать если список IP на сервере изменился:

#!/usr/local/bin/bash

IP_LIST=$(for i in `/sbin/ifconfig | grep inet | awk ‘{ print $2}’ |cut -d «:» -f2` ; do echo -n «$i » ; done)

cat >/etc/httpd/conf/extra/rpaf.conf<< EOF

RPAFenable On

RPAFproxy_ips $IP_LIST

RPAFsethostname On

RPAFheader X-Real-IP

EOF

 

Не забудьте его запустить его сразу после создания!

 

Теперь перейдем к настройке nginx. Создайте файл /usr/local/etc/nginx/nginx.conf с таким содержимым:

user  apache;

worker_processes  2;

worker_rlimit_nofile 20480;

 

events {

worker_connections 20480;

}

 

http {

include    mime.types;

default_type  application/octet-stream;

log_format  main  ‘$remote_addr — $remote_user [$time_local] $status ‘

‘»$request» $body_bytes_sent «$http_referer» ‘

‘»$http_user_agent» «$http_x_forwarded_for»‘;

 

server_name_in_redirect off;

server_names_hash_max_size 2048;

server_names_hash_bucket_size 256;

 

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout  65;

gzip on;

gzip_vary on;

gzip_http_version 1.1;

gzip_min_length  1100;

gzip_comp_level  3;

gzip_buffers  4 32k;

gzip_types    text/plain text/xml text/css application/x-javascript application/xml application/xml+rss text/javascript application/atom+xml;

ignore_invalid_headers on;

client_header_timeout  3m;

client_body_timeout 3m;

send_timeout     3m;

reset_timedout_connection on;

connection_pool_size  256;

client_header_buffer_size 256k;

large_client_header_buffers 4 256k;

request_pool_size  32k;

output_buffers   4 32k;

postpone_output  1460;

log_format bytes «$bytes_sent»;

 

 

server {

listen       80 default rcvbuf=8192 sndbuf=16384;

server_name  localhost;

access_log  /var/log/httpd/access_log;

 

location / {

proxy_pass         http://127.0.0.1:88/;

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;

}

 

location ~* ^/(phpmyadmin|webmail|squirrelmail|uebimiau|roundcube)/.+\.(jpg|jpeg|gif|png|ico|css|zip|tar|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|wmv|avi|cur|swf|mp3|wma|htc|cur)$ {

root /var/www/html/;

expires      30d;

access_log        off;

}

 

location ~* ^/(stats)/.+\.(jpg|jpeg|gif|png|html|htm)$ {

root /var/www/html/;

access_log        off;

}

 

location ~* ^.+\.(jpg|jpeg|gif|mp3|png|avi|vob|mpg|mpeg|mp4|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {

root /var/www/html;

}

}

include /usr/local/etc/nginx/virtual.conf;

}

 

Затем создадим /usr/local/etc/nginx/proxy.conf с таким содержимым:

proxy_connect_timeout 30s;

proxy_send_timeout   90;

proxy_read_timeout   90;

proxy_buffer_size    32k;

proxy_buffers     4 32k;

proxy_busy_buffers_size 64k;

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 100m;

client_body_buffer_size 128k;

 

И наконец перейдем к самому главному — подружим DirectAdmin с Nginx. Делается это при помощи следующих скриптов, которые надо поместить в  /usr/local/directadmin/scripts/custom. Для этого создайте там файлы, состоящие из одной строки:

echo «/usr/local/directadmin/scripts/nginx_direct.sh -u $username» >> /usr/local/etc/nginx/task.nginx

Файлы нужно создать под следующими именами:

domain_create_post.sh

domain_destroy_post.sh

domain_change_post.sh

domain_pointer_create_post.sh

domain_pointer_destroy_post.sh

subdomain_destroy_post.sh

subdomain_create_post.sh

 

Еще создайте файл user_destroy_post.sh, который состоит из такой строки:

echo «/usr/local/directadmin/scripts/nginx_direct.sh -u $username» >> /usr/local/etc/nginx/task.nginx

 

Как вы наверное догадались, все действия будут выполнятся из файла /usr/local/etc/nginx/task.nginx. А поможет нам в этом cron. Но для начала создаим скрипт, который будет читать все действия из этого файла: /usr/local/directadmin/scripts/nginx_task.sh

#!/usr/local/bin/bash

if [ -f /usr/local/etc/nginx/task.nginx ]; then

`cat /usr/local/etc/nginx/task.nginx | sort -u > /usr/local/etc/nginx/task.nginx.do`

rm -rf /usr/local/etc/nginx/task.nginx

while read LINE

do

`echo sh $LINE`;

done < /usr/local/etc/nginx/task.nginx.do

rm -rf /usr/local/etc/nginx/task.nginx.do

/usr/local/etc/rc.d/nginx reload

 

Поставьте его выполнятся раз в 5 минут от пользователя root (*/5 * * * * /usr/local/directadmin/scripts/nginx_task.sh)

Теперь сделаем и остальные два скрипта:

/usr/local/directadmin/scripts/nginx_del.sh:

#!/usr/local/bin/bash

USER_CONF=»include /usr/local/directadmin/data/users/$1/nginx.conf;»;

if cp /usr/local/etc/nginx/virtual.conf /usr/local/etc/nginx/virtual.conf.bak; then

rm -rf /usr/local/etc/nginx/users/$1;

STR=»/usr/bin/perl -pi -e ‘s#$USER_CONF##’ /usr/local/etc/nginx/virtual.conf.bak»;

eval ${STR};

sed ‘/^$/d’ /usr/local/etc/nginx/virtual.conf.bak > /usr/local/etc/nginx/virtual.conf;

rm -rf /usr/local/etc/nginx/virtual.conf.bak

fi

 

/usr/local/directadmin/scripts/nginx_direct.sh:

#!/usr/local/bin/bash

NGINXHOST=/usr/local/etc/nginx/virtual.conf;

PATH_CONF=/usr/local/directadmin/data/users;

NGINXTEMPATE=/usr/local/directadmin/data/templates/custom/nginx_domains.conf;

NGINXSUBTEMPATE=/usr/local/directadmin/data/templates/custom/nginx_subdomains.conf;

HOLD=/tmp/nginx.conf.$$;

 

showHelp() {

echo «Rewrite all users’s nginx.conf from template:»;

echo «$0 all «;

echo «Rewrite users nginx.conf :»;

echo «$0 -u username»;

echo «For useing modify nginx.conf , you mast create file:»;

echo «/usr/local/directadmin/data/users/USERNAME/domains/DOMAIN_NAME.custom_nginx with modify config.»;

}

do_exit() {

exit 1;

}

check_user(){

if [ «$1» = «» ] ; then

#echo «User not exit»;

return 1;

else

return 0;

fi

}

check_domain()

{

if [ ! -s $1 ];then

return 1;

else

return 0;

fi

}

user_configs(){

_UHOME=`grep -e «^${1}:» /etc/passwd | cut -d: -f6`;

_USER=$1;

_DOMAINLIST=${PATH_CONF}/$_USER/domains.list;

_NGINXCONF=${PATH_CONF}/$_USER/nginx.conf;

if ! check_user $_UHOME; then

return 1;

fi

if ! check_domain $_DOMAINLIST; then

return 1;

fi

_UIP=`cat  ${PATH_CONF}/$_USER/user.conf | grep ip= | cut -d= -f2`;

if [ ! -f  $_NGINXCONF ]

then

echo «include $_NGINXCONF;» >> $NGINXHOST;

else

cat $_NGINXCONF > $HOLD;

rm -rf $_NGINXCONF;

fi

 

for i in `cat $_DOMAINLIST`; do

if [ -f ${PATH_CONF}/$_USER/domains/$i.custom_nginx ]

then

cat ${PATH_CONF}/$_USER/domains/$i.custom_nginx >> $_NGINXCONF;

else

if [ -f ${PATH_CONF}/$_USER/domains/$i.pointers ]

then

for j in `cat ${PATH_CONF}/$_USER/domains/$i.pointers | awk -F= ‘{print $1}’ `; do

park=`echo «$park $j www.$j»`;

done

fi

if ! cat $NGINXTEMPATE | sed ‘s#|HOME|#’$_UHOME’#g’ | sed ‘s!|DOMAIN|!’$i’!g’ |sed ‘s/|SERVER_ALIASES|/'»$park»‘/’ | sed ‘s!|IP|!’$_UIP’!’  | sed ‘s!|USERNAME!’$1′!’ >> $_NGINXCONF; then

if [ -f  $HOLD ]; then

cat $HOLD > $_NGINXCONF;

fi

return 1;

fi

fi

for l in `cat ${PATH_CONF}/$_USER/domains/$i.subdomains`; do

cat $NGINXSUBTEMPATE | sed ‘s#|HOME|#’$_UHOME’#g’ | sed ‘s!|DOMAIN|!’$i’!g’|sed ‘s/|SUB|/’$l’/g’ | sed ‘s!|IP|!’$_UIP’!’ | sed ‘s!|USERNAME|!’$1′!’ >> $_NGINXCONF;

done

park=»»;

done

if [ -f  $HOLD ]; then

rm -rf $HOLD;

fi

}

doAll(){

for i in `ls /usr/local/directadmin/data/users/`; do

user_configs $i;

done

}

 

case «$1» in

all) doAll;

;;

-u) user_configs $2;

;;

* ) showHelp;

do_exit 0;

;;

esac

do_exit 0;

 

Как видно из скрипта, для создания конфига nginx используются два шаблона:

/usr/local/directadmin/data/templates/custom/nginx_domains.conf:

server {

listen |IP|:80;

server_name |DOMAIN| www.|DOMAIN| |SERVER_ALIASES|;

error_page 403 404 = @fallback;

access_log /var/log/httpd/domains/|DOMAIN|.log  main;

access_log /var/log/httpd/domains/|DOMAIN|.bytes  bytes;

error_log  /var/log/httpd/domains/|DOMAIN|.error.log error;

location / {

proxy_pass         http://|IP|:8080;

proxy_redirect http://|DOMAIN|:8080/ /;

include proxy.conf;

}

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {

root |HOME|/domains/|DOMAIN|/public_html;

}

location @fallback {

proxy_pass         http://|IP|:8080;

proxy_redirect http://|DOMAIN|:8080/ /;

include proxy.conf;

}

}

 

 

/usr/local/directadmin/data/templates/custom/nginx_subdomains.conf:

server {

listen |IP|:80;

server_name  |SUB|.|DOMAIN| www.|SUB|.|DOMAIN|;

error_page 403 404 = @fallback;

access_log /var/log/httpd/domains/|DOMAIN|.|SUB|.log  main;

access_log /var/log/httpd/domains/|DOMAIN|.|SUB|.bytes  bytes;

error_log  /var/log/httpd/domains/|DOMAIN|.|SUB|.error.log error;

location / {

proxy_pass         http://|IP|:8080;

proxy_redirect http://|DOMAIN|:8080/ /;

include proxy.conf;

}

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {

root |HOME|/domains/|DOMAIN|/public_html/|SUB|;

}

location @fallback {

proxy_pass         http://|IP|:8080;

proxy_redirect http://|DOMAIN|:8080/ /;

include proxy.conf;

}

}

 

 

 

И наконец, на все наши файлы установите правильные права:

chown -R diradmin:diradmin /usr/local/directadmin/scripts

chmod a+x /usr/local/directadmin/scripts/custom/*.sh

chmod a+x /usr/local/directadmin/scripts/*.sh

 

Обяхательно запустите nginx_direct.sh all в первый раз!

 

Теперь осталось перенести апач на 8080 порт:

echo «port_80=8080» >> /usr/local/directadmin/conf/directadmin.conf

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

sed -i -Ee «s/:80/:8080/g» /etc/httpd/conf/extra/httpd-vhosts.conf

sed -i -Ee «s/:80/:8080/g» /etc/httpd/conf/ips.conf

sed -i -Ee «s/Port 80/Port 8080/g» /usr/local/directadmin/data/templates/httpd.conf

sed -i -Ee «s/Listen 80/Listen 8080/g» /usr/local/directadmin/data/templates/httpd.conf

sed -i -Ee «s/Listen 80/Listen 8080/g» /etc/httpd/conf/httpd.conf

 

Теперь включаем nginx:

echo ‘nginx_enable=»YES»‘ >> /etc/rc.conf

 

Вот и все, осталось только стартовать его и перезапустить апач.

 

При написании были использованы материалы с http://code.google.com/p/nginxda/