Pull to refresh

Установка 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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.