Как стать автором
Поиск
Написать публикацию
Обновить

Установка Nginx + Apache2 + MySQL за 5 минут

Некоторое время назад я встал перед задачей настройки сервера со связкой 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 дистрибутивах.

#!/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
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.