Переписать этот ужас.
Только Debian. Пользователь, которому принадлежат сайты, должен быть предварительно создан.
#!/bin/bash
function read_domain
{
if [[ -z $domain ]]; then
echo -n "Provide domain to add: "
read domain
fi
}
function read_user
{
if [[ -z $user ]]; then
echo -n "Provide domain's owner login: "
read user
fi
}
function read_logs
{
if [[ -z $logs ]]; then
echo -n "Enable access/error logs? [y/N]: "
read logs
fi
case $logs in
y*|Y*)
LOGS=1
;;
*)
unset $logs
;;
esac
}
function init_vars
{
#### BASE SETTINGS ####
CLIENTS_HOME="/home/clients"
DOMAIN_DIR="/home/clients/$user/domains/$domain"
DOCROOT="$DOMAIN_DIR/html"
LOGSDIR="$DOMAIN_DIR/logs"
TMPCONFDIR="/opt/scripts/www_configs"
# can be set as IP='111.111.111.111'
IP=`ip route get 8.8.8.8 | head -1 | awk '{print $NF}'`
if [[ ! -d $TMPCONFDIR ]]; then
mkdir -p $TMPCONFDIR
fi
if [[ -z `id $user` ]]; then
echo "You need to create user '$user' first!"
exit 1
fi
if [[ ! -d $DOCROOT ]]; then
mkdir -p $DOCROOT
chown -R $user:$user $DOCROOT
fi
if [[ ! -d $LOGSDIR ]]; then
mkdir -p $LOGSDIR
fi
}
function generate_apache_vhost
{
if [[ $logs ]]; then
local log_block="LogLevel warn
ErrorLog $LOGSDIR/apache_error_log
CustomLog $LOGSDIR/apache_access_log combined"
fi
if [[ $domain ]] && [[ $user ]]; then
cat > $TMPCONFDIR/apache.$domain << EOF
<VirtualHost 127.0.0.1:82>
<IfModule mpm_itk_module>
AssignUserId $user $user
</IfModule>
ServerName $domain
ServerAlias www.$domain
ServerAdmin $user@$domain
DocumentRoot $DOCROOT
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory $DOCROOT>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ $DOCROOT/cgi-bin/
<Directory "$DOCROOT/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
$log_block
</VirtualHost>
EOF
fi
}
function generate_nginx_vhost
{
if [[ $logs ]]; then
local log_block="access_log $LOGSDIR/nginx_access_log;
error_log $LOGSDIR/nginx_error_log;"
fi
if [[ $domain ]] && [[ $user ]]; then
cat > $TMPCONFDIR/nginx.$domain << EOF
server {
listen 80;
server_name $domain www.$domain;
root $DOCROOT;
location / {
proxy_pass http://127.0.0.1:82/;
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;
proxy_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 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;
}
location ~* ^.+.(jpg|gif|png|avi|mpg|zip|exe)$ {
root $DOCROOT;
}
$log_block
}
EOF
fi
}
function generate_named_vhost
{
serial=`/bin/date +"%Y%m%d%k"`
cat >$TMPCONFDIR/named.$domain<< EOF
\$TTL 10800
@ IN SOA ns1.$domain. root.$domain. (
$serial ; serial
10800 ; refresh
3600 ; retry
604800 ; expire
3600 ) ; minimum
; NS
IN NS ns1.$domain.
IN NS ns2.$domain.
; MX
IN MX 10 mx1.$domain.
; records
ns1 IN A $IP
ns2 IN A $IP
mx1 IN A $IP
www IN A $IP
$domain. IN A $IP
EOF
}
function enable_apache_vhost
{
if [[ -f "/etc/apache2/sites-available/${domain}.conf" ]]; then
echo "Domain $domain already exists in /etc/apache2/sites-available/${domain}.conf"
exit 1
else
cp $TMPCONFDIR/apache.$domain /etc/apache2/sites-available/${domain}.conf
a2ensite $domain
if [[ -z `apache2ctl configtest` ]]; then
/etc/init.d/apache2 reload
echo "$domain enabled!"
else
echo "Errors detected, please solve it manually!"
exit 1
fi
fi
}
function enable_nginx_vhost
{
if [[ -f "/etc/nginx/sites-available/$domain" ]]; then
echo "Domain $domain already exists in /etc/nginx/sites-available/$domain"
exit 1
else
cp $TMPCONFDIR/nginx.$domain /etc/nginx/sites-available/$domain
ln -s /etc/nginx/sites-available/$domain /etc/nginx/sites-enabled/$domain
if [[ -z `nginx -t` ]]; then
/etc/init.d/nginx reload
echo "$domain enabled!"
else
echo "Errors detected, please solve it manually!"
exit 1
fi
fi
}
function enable_named_vhost
{
[[ -d "/etc/bind/zones" ]] || mkdir -p "/etc/bind/zones"
if [[ -f "/etc/bind/zones/$domain.conf" ]]; then
echo "Zone $domain already exists in /etc/bind/zones/$domain.conf"
exit 1
else
cp $TMPCONFDIR/named.$domain /etc/bind/zones/$domain.conf
cat >>/etc/bind/named.conf.local<< EOF
zone "$domain" {
type master;
file "/etc/bind/zones/$domain.conf";
};
EOF
if [[ -z `/usr/sbin/named-checkconf` && -z `/usr/sbin/named-checkzone -q $domain /etc/bind/zones/$domain.conf` ]] ; then
/usr/sbin/rndc reload
echo "bind9: $domain enabled"
else
echo "Errors detected, please solve it manually!"
exit 1
fi
fi
}
function enable_logrotate
{
if [[ ! -d "/etc/logrotate.d/vhosts" ]]; then
mkdir -p /etc/logrotate.d/vhosts
fi
cat > $TMPCONFDIR/logrotate.$domain << EOF
$LOGSDIR/*_log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0644 root root
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \\
run-parts /etc/logrotate.d/httpd-prerotate; \\
fi; \\
endscript
postrotate
/etc/init.d/apache2 reload > /dev/null
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}
EOF
if [[ $logs ]]; then
# install logrotate
if [[ -f "/etc/logrotate.d/vhosts/$domain" ]]; then
echo "Domain $domain already exists in /etc/logrotate.d/vhosts/$domain"
exit 1
else
cp $TMPCONFDIR/logrotate.$domain /etc/logrotate.d/vhosts/$domain
fi
fi
}
read_domain
read_user
read_logs
init_vars
generate_apache_vhost
generate_nginx_vhost
generate_named_vhost
enable_apache_vhost
enable_nginx_vhost
enable_named_vhost
enable_logrotate
Необходимо предварительно создать пользователя http
#!/bin/bash
echo -n "Введите имя сайта: "
read domain
# СОЗДАНИЕ ДИРЕКТОРИИ
mkdir -p /home/http/domains/$domain/html/cgi-bin
chown -R http:http /home/http/domains/$domain/html
# СОЗДАНИЕ КОНФИГА ВИРТХОСТА ДЛЯ АПАЧА
cat >/etc/apache2/sites-available/$domain << EOF
<VirtualHost *:80>
ServerName $domain
ServerAlias www.$domain
DocumentRoot /home/http/domains/$domain/html
ErrorLog /dev/null
ScriptAlias /cgi-bin/ "/home/http/domains/$domain/html/cgi-bin/"
<Directory "/cgi-bin/">
AllowOverride None
Options None +FollowSymLinks ExecCGI
DirectoryIndex index.pl
</Directory>
<Directory />
Options All -Indexes
AllowOverride All
</Directory>
</VirtualHost>
EOF
# ВКЛЮЧЕНИЕ ВИРТХОСТА
/usr/sbin/a2ensite $domain
/etc/init.d/apache2 reload
# СОЗДАНИЕ ФАЙЛА ДНС-ЗОНЫ
serial=`/bin/date +"%Y%m%d%k"`
cat >/etc/bind/zones/$domain<< EOF
\$TTL 10800
@ IN SOA ns1.$domain. root.$domain. (
$serial ; serial
10800 ; refresh
3600 ; retry
604800 ; expire
3600 ) ; minimum
; NS
IN NS ns1.$domain.
IN NS ns2.$domain.
; MX
IN MX 10 mx1.$domain.
; records
ns1 IN A 95.169.190.217
ns2 IN A 95.169.191.217
www IN A 95.169.191.217
$domain. IN A 95.169.191.217
EOF
# СОЗДАНИЕ ЗАПИСИ О ДНС-ЗОНЕ
cat >>/etc/bind/named.conf.local<< EOF
zone "$domain" {
type master;
file "/etc/bind/zones/$domain";
};
EOF
# ВКЛЮЧЕНИЕ ЗОНЫ
/usr/sbin/rndc reload