Некоторое время назад я встал перед задачей настройки сервера со связкой Nginx + Apache2. Перекопав море инфы, удалось установить сие чудо раза с третьего.
Спустя какое-то время понадобился еще один такой же сервер, а потом еще и еще. Переезды, тестирование и т.д, Сами знаете.
Времени на первоначальную настройку тратится прилично, пока ручками пропишешь все…
В общем в результате усилий моей лени, гугла и неизвестного автора(чей скрипт я нашел и модернизировал), появился скрипт для debian-based дистрибутивов. Что он делает:
1. Локализует консоль (ru_RU.UTF-8)
2. устанавливает Nginx + Apache2 + MySQL
3. Прописывает все виртуальные хосты какие нам надо.
4. устанавливает phpmyadmin(+ меняет путь) и МС.
В результате чего настройка сервера занимает максимум 5 минут.
Данный скрипт может быть очень полезен новичкам, которые ломают голову как поставить данную связку.
Протестировано на Debian 6.x Debian 7.x. Теоретически должно работать на всех debian-based дистрибутивах.
Спустя какое-то время понадобился еще один такой же сервер, а потом еще и еще. Переезды, тестирование и т.д, Сами знаете.
Времени на первоначальную настройку тратится прилично, пока ручками пропишешь все…
В общем в результате усилий моей лени, гугла и неизвестного автора(чей скрипт я нашел и модернизировал), появился скрипт для debian-based дистрибутивов. Что он делает:
1. Локализует консоль (ru_RU.UTF-8)
2. устанавливает Nginx + Apache2 + MySQL
3. Прописывает все виртуальные хосты какие нам надо.
4. устанавливает phpmyadmin(+ меняет путь) и МС.
В результате чего настройка сервера занимает максимум 5 минут.
Данный скрипт может быть очень полезен новичкам, которые ломают голову как поставить данную связку.
Протестировано на Debian 6.x Debian 7.x. Теоретически должно работать на всех debian-based дистрибутивах.
#!/bin/bash
apt-get update 2>&1 > /dev/null
apt-get -y install dialog 2>&1 > /dev/null
apt-get -y install debconf 2>&1 > /dev/null
# Устанавливаем MC, жить без него не могу
apt-get -y install mc 2>&1 > /dev/null
# Редактор по-умолчанию mcedit
update-alternatives --config editor << EOF
2
EOF
# Русификация консоли. UTF-8 конечно же
echo "locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8, ru_RU.UTF-8 UTF-8" | debconf-set-selections
echo "locales locales/default_environment_locale select ru_RU.UTF-8" | debconf-set-selections
sed -i 's/^# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen
dpkg-reconfigure --frontend=noninteractive locales
#На всякий случай, вдруг заглючило и не встало автоматом
export LANG=ru_RU.UTF-8
# Готовимся к работе
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
<source lang="bash">
echo "example.ru" > $tempfile
domainfile=/tmp/domains.txt
#Получаем IP. Может быть вида x.x.x.x или x.x.x.x/y
ip=`ip addr sh eth0|grep inet|grep -v inet6 |awk '{print $2}'|grep -o '^[^/]*'`
memory=`free -m |grep Mem|awk {'print $2'}`
# Проверяем остатки прошлого запуска
if [ -f /var/lock/webhosting.lock ]; then
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Найдена старая конфигурация. \nВведите домены префикса www." 10 50
configured=1
sleep 5
else
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Введите имена web-доменов. \nПо одному, без префикса www." 10 50
configured=0
sleep 5
fi
# Вводим домены которые будут тут работать
while true
do
dialog --ascii-lines --title "Ввод доменов" --editbox $tempfile 16 51 2>$domainfile
retval=$?
case $retval in
0)
domains=`cat $domainfile`
dialog --ascii-lines --title "Конфигурация сервера" --yesno "Будут сконфигурированы следующие домены:\n $domains \n Все верно?" 0 0
retval1=$?
case $retval1 in
0)
break
;;
1)
cat $domainfile > $tempfile
;;
255)
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Отмена конфигурации. \n Сервер не будет настроен!!!" 10 50
sleep 5
rm -f $tempfile
rm -f $domainfile
exit
;;
esac
;;
1)
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Отмена конфигурации. \n Сервер не будет настроен!!!" 10 50
sleep 5
rm -f $tempfile
rm -f $domainfile
exit
;;
esac
done
rm -f $tempfile
sed -i '/^$/d' $domainfile
if [ $configured -eq 0 ]; then
# Устанавливаем и настраиваем Apache2 и PHP5
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Установка apache2 и php5 " 10 50
sleep 2
apt-get -y install libapache2-mod-php5 php5-cli php5-gd php-apc php5-curl php5-mcrypt php5-mysql libapache2-mod-rpaf 2>&1 > /dev/null
sed -i 's/Listen 80/Listen 127.0.0.1:80/g' /etc/apache2/ports.conf
a2enmod rewrite > /dev/null
# Устанавливаем и настраиваем Nginx
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Установка и настройка nginx " 10 50
sleep 2
apt-get -y install nginx 2>&1 > /dev/null
sed -i s/worker_processes.*1\;/worker_processes\ \ \ 4\;/ /etc/nginx/nginx.conf
sed -i s/worker_processes.*1\;/worker_processes\ \ \ 4\;/ /etc/nginx/nginx.conf
sed -i s/.listen.*80\;.*/listen\ $ip:80\ default\;/ /etc/nginx/sites-enabled/default
sed -i s/root.*\\/var\\/www\;/proxy_pass\ http\:\\/\\/127.0.0.1\;\\n\\t\\tproxy_read_timeout\ 600\;\\n\\t\\tproxy_set_header\ Host\ \\\$host\;\\n\\t\\tproxy_set_header\ X-Real-IP\ \\\$remote_addr\;\\n\\t\\tproxy_set_header\ \ X-Forwarded-For\ \ \\\$remote_addr\;\\n\\t\\tproxy_buffering\ off\;/ /etc/nginx/sites-enabled/default
# Вводим пароль MySQL
while true
do
pwdfile=$(tempfile 2>/dev/null)
trap "rm -f $pwdfile" 0 1 2 5 15
dialog --ascii-lines --title "Конфигурация сервера" --clear --insecure --passwordbox "Пароль для mysql" 10 30 2> $pwdfile
ret=$?
case $ret in
0)
password=$(cat $pwdfile)
;;
1)
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Отмена конфигурации. \n Сервер не будет настроен!!!" 10 50
sleep 2
rm -f $domainfile
rm -f $tempfile
rm -f $pwdfile
exit;;
255)
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Отмена конфигурации. \n Сервер не будет настроен!!!" 10 50
sleep 2
rm -f $domainfile
rm -f $tempfile
rm -f $pwdfile
exit;;
esac
pwdfile2=$(tempfile 2>/dev/null)
trap "rm -f $pwdfile2" 0 1 2 5 15
dialog --ascii-lines --title "Конфигурация сервера" --clear --insecure --passwordbox "Повтор пароля" 10 30 2> $pwdfile2
ret=$?
case $ret in
0)
password1=$(cat $pwdfile2)
;;
1)
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Отмена конфигурации. \n Сервер не будет настроен!!!" 10 50
sleep 2
rm -f $domainfile
rm -f $tempfile
rm -f $pwdfile2
exit;;
255)
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Отмена конфигурации. \n Сервер не будет настроен!!!" 10 50
sleep 2
rm -f $domainfile
rm -f $tempfile
rm -f $pwdfile2
exit;;
esac
if [ "$password1" == "$password" ]; then
break
else
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Пароли не совпадают. $password не равен $password1" 10 50
fi
sleep 2
done
rm -f $pwdfile
rm -f $pwdfile2
# Устанавливаем и настраиваем на вскидку MySQL
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Установка и настройка MySQL" 10 50
sleep 2
echo "mysql-server-5.1 mysql-server/root_password password $password" | debconf-set-selections
echo "mysql-server-5.1 mysql-server/root_password_again password $password" | debconf-set-selections
apt-get -y install mysql-server 2>&1 > /dev/null
if [ ! -f /etc/mysql/mysql.d/tuning.cnf ]; then
let h_mem=$memory/2
let s_mem=$memory/16
echo "[mysqld]" > /etc/mysql/conf.d/tuning.cnf
echo "innodb_buffer_pool_size = "$h_mem"M" >> /etc/mysql/conf.d/tuning.cnf
echo "query_cache_limit="$s_mem"M" >> /etc/mysql/conf.d/tuning.cnf
echo "query_cache_size="$s_mem"M" >> /etc/mysql/conf.d/tuning.cnf
# Открываем доступ из вне
sed -i 's/^bind-address/#bind-address/' /etc/mysql/my.cnf
fi
# Устанавливаем и настраиваем phpmyadmin
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Установка и настройка phpmyadmin " 10 50
sleep 2
DEBIAN_FRONTEND=noninteractive apt-get -q -y install phpmyadmin 2>&1 > /dev/null
echo "phpmyadmin phpmyadmin/mysql/admin-pass password $password" | debconf-set-selections
echo "phpmyadmin phpmyadmin/mysql/app-pass password $password" | debconf-set-selections
echo "phpmyadmin phpmyadmin/app-password-confirm password $password" | debconf-set-selections
echo "phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2" | debconf-set-selections
echo "phpmyadmin phpmyadmin/dbconfig-reinstall boolean true" | debconf-set-selections
echo "phpmyadmin phpmyadmin/dbconfig-install boolean true" | debconf-set-selections
echo "phpmyadmin phpmyadmin/install-error select retry" | debconf-set-selections
/var/lib/dpkg/info/phpmyadmin.postinst configure 2>&1 > /dev/null
# Меняем дефолтовый путь на /myphp
sed -i s/Alias\ \\/phpmyadmin/Alias\ \\/myphp/ /etc/phpmyadmin/apache.conf
fi
# Создаем виртуальные хосты
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Создание виртуальных хостов " 10 50
sleep 2
for i in `cat /tmp/domains.txt`; do
apache="<VirtualHost *:80>\n
\tServerName www.$i\n
\tServerAlias $i\n
\n
\tCustomLog /home/webserver/$i/logs/apache2/access.log common\n
\tErrorLog /home/webserver/$i/logs/apache2/error.log\n
\n
\tDocumentRoot /home/webserver/$i/html\n
\tDirectoryIndex index.php index.html\n
\n
\tphp_admin_value open_basedir /home/webserver/$i\n
\tphp_admin_value upload_tmp_dir /home/webserver/$i/tmp\n
\tphp_admin_value session.save_path /home/webserver/$i/tmp\n
</VirtualHost>\n
"
nginx="
server {\n
\n
\tlisten $ip:80;\n
\tserver_name www.$i $i;\n
\n
\taccess_log /home/webserver/$i/logs/nginx/access.log;\n
\terror_log /home/webserver/$i/logs/nginx/error.log;\n
\n
\tlocation /\n
\t{\n
\t\tproxy_pass http://127.0.0.1/;\n
\t\tproxy_read_timeout 600;\n
\t\tproxy_set_header Host \$host;\n
\t\tproxy_set_header X-Real-IP \$remote_addr;\n
\t\tproxy_set_header X-Forwarded-For \$remote_addr;\n
\t\tproxy_buffering off;\n
\t}\n
\tlocation ~* .(txt|jpg|jpeg|gif|mpg|mpeg|avi|png|css|swf|ico|zip|rar|sdt|js|bmp|wav|mp3|mmf|mid|vkp|sisx|sis|exe|jar|thm|nth|xml|doc)$ {\n
\t\troot /home/webserver/$i/html;\n
\t\texpires 2d;\n
\t}\n
\n
}\n
"
mkdir -p /home/webserver/$i/logs/apache2/
mkdir -p /home/webserver/$i/logs/nginx/
mkdir -p /home/webserver/$i/html
mkdir -p /home/webserver/$i/tmp
chown -R www-data /home/webserver
if [ $configured -eq 0 ]; then
echo -e $apache > /etc/apache2/sites-available/$i.conf
echo -e $nginx > /etc/nginx/sites-available/$i.conf
a2ensite $i.conf 2>&1 > /dev/null
ln -s /etc/nginx/sites-available/$i.conf /etc/nginx/sites-enabled/$i.conf
else
if [ -f /etc/apache2/sites-available/$i.conf ]; then
dialog --ascii-lines --title "Конфигурация сервера" --infobox " Конфигурация домена $i уже существует. " 10 50
sleep 2
else
echo -e $apache > /etc/apache2/sites-available/$i.conf
echo -e $nginx > /etc/nginx/sites-available/$i.conf
a2ensite $i.conf 2>&1 > /dev/null
ln -s /etc/nginx/sites-available/$i.conf /etc/nginx/sites-enabled/$i.conf
fi
fi
done
# перезагружаем службы
/etc/init.d/mysql restart
/etc/init.d/nginx restart
/etc/init.d/apache2 restart
if [ $configured -eq 1 ]; then
exit
fi
# Ротация логов
sed -i s/\\/var\\/log\\/nginx\\/\\*\\.log\ {/\\/var\\/log\\/nginx\\/*.log\ \\/home\\/*\\/*\\/logs\\/nginx\\/*.log\ {/ /etc/logrotate.d/nginx
sed -i s/rotate\ 52/rotate\ 14/ /etc/logrotate.d/nginx
sed -i s/create\ 640\ root\ adm/create\ 640\ www-data\ www-data/ /etc/logrotate.d/nginx
sed -i s/\\/var\\/log\\/apache2\\/\\*\\.log\ {/\\/var\\/log\\/apache2\\/*.log\ \\/home\\/*\\/*\\/logs\\/apache2\\/*.log\ {/ /etc/logrotate.d/apache2
sed -i s/rotate\ 52/rotate\ 14/ /etc/logrotate.d/apache2
sed -i s/weekly/daily/ /etc/logrotate.d/apache2
sed -i s/create\ 640\ root\ adm/create\ 640\ www-data\ www-data/ /etc/logrotate.d/apache2
touch /var/lock/webhosting.lock