Быстрое создание виртуальных хостов Apache при помощи bash скрита

от автора

Не так давно переехал с VPS на выделенные сервер и передо мной остро встал вопрос по переносу сайтов со на новый сервер, а именно по быстрому созданию виртуальных хостов и баз данных. Конечно же в довесок к серверу шла панель управления ISPmanager, но в этом случае мне не нравилось две вещи:

  • Панель делает все за тебя, а мне хочется прокачать скил в области адмиистрирования.
  • Не нравится способ создания сайтов через панель, а именно создаваемые пути до папки с сайтом (/var/www/user_name/data/www/site.ru)

В силу этого решил все настраивать ручками. Про установку Apache и php, писать не буду, так как и на Хабре и в интернете очень много материалов по данной теме. Нас же больше интересует быстрое создание пользователя, виртуального хоста, и базы данных. Кому интересно прошу в подкат.

Логику решил разделить на два скрипта.

  • Создает пользователя и в его папке добавляет сайты. Если пользователя нет, то он создается, если есть, то создается только сайт.
  • Второй скрипт создает базу данных и пользователя для базы, присваивая ему привилегии на данную базу.

Немного условий для скриптов.

  • Оба скрипта генерируют пароли по умолчанию.
  • Конфиги виртуальных хостов должны лежать в /etc/apache2/vhosts.
  • Все действия должны производиться только из под суперпользователя

Скрипт для создания нового виртуального хоста (/home/addsite)

#!/bin/bash IP_ADDRESS="1.2.3.4"  APACHE2_DIR="/etc/apache2"  UID_ROOT=0  if [ "$UID" -ne "$UID_ROOT" ]; then   echo "$0 - Requires root privileges"   exit 1 fi  function is_user(){     local check_user="$1";     grep "$check_user:" /etc/passwd >/dev/null     if [ $? -ne 0 ]; then  #echo "NOT HAVE USER"  return 0     else  #echo "HAVE USER"  return 1     fi }   function generate_pass(){     CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-_=+\\|/"     LENGTH="8"     while [ "${n:=1}" -le "$LENGTH" ] ; do 	PASSWORD="$PASSWORD${CHARS:$(($RANDOM%${#CHARS})):1}"         let n+=1     done     echo $PASSWORD }   function is_yes(){ #TODO - add check 3-rd parameter for set default ansver (if press enter)     while true     do  echo -n "Yes or No[Y/n]:"  read  x  if [ -z "$x" ]  then      return 0; #defaul answer: Yes  fi  case "$x" in  y |Y |yes |Д |д |да ) return 0;;  n |N |no |Н |н |нет ) return 1;; # * ) ; # asc again  esac     done }  function create_user(){     local login="$1"     local password="$2"     `useradd -m -s /bin/bash $login`     #set password     echo -e "$password\n$password\n" | passwd $login >> /dev/null }  USER_NAME=$1  echo -n "Check user name $USER_NAME: " if( is_user "$USER_NAME" )then     USER_PASSWORD="$(generate_pass)"     echo "-----------------------------------"     echo "User name    : $USER_NAME"     echo "User password: $USER_PASSWORD"     echo "-----------------------------------"     echo -n "Continue? "     if(! is_yes) then         exit;     fi     echo "--- create user ---"     create_user "$USER_NAME" "$USER_PASSWORD" fi  if [ $# -eq 2 ]; then     if [ "$2" != "delete" ]; then         SITE_NAME=$2                  mkdir /home/$USER_NAME/$SITE_NAME         mkdir /home/$USER_NAME/$SITE_NAME/www         mkdir /home/$USER_NAME/$SITE_NAME/logs         mkdir /home/$USER_NAME/$SITE_NAME/tmp         mkdir /home/$USER_NAME/$SITE_NAME/cgi-bin                  hostConf=" <VirtualHost ${IP_ADDRESS}:80>         ServerName $SITE_NAME         ServerAlias www.$SITE_NAME         ServerAdmin webmaster@$SITE_NAME          AddDefaultCharset utf-8         AssignUserID ${USER_NAME} ${USER_NAME}          DocumentRoot /home/$USER_NAME/$SITE_NAME/www         CustomLog log combined         ErrorLog /home/$USER_NAME/$SITE_NAME/logs/error.log         DirectoryIndex index.php index.html          ScriptAlias /cgi-bin/ /home/$USER_NAME/$SITE_NAME/cgi-bin         <FilesMatch \"\\.ph(p[3-5]?|tml)$\">                 SetHandler application/x-httpd-php         </FilesMatch>         <FilesMatch \"\\.phps$\">                 SetHandler application/x-httpd-php-source         </FilesMatch>         php_admin_value upload_tmp_dir "/home/$USER_NAME/$SITE_NAME/tmp"         php_admin_value session.save_path "/home/$USER_NAME/$SITE_NAME/tmp"         php_admin_value open_basedir "/home/$USER_NAME/$SITE_NAME/www:." </VirtualHost> <Directory /home/$USER_NAME/$SITE_NAME/www>         Options +Includes +ExecCGI         php_admin_flag engine on </Directory>         "          touch ${APACHE2_DIR}/vhosts/${SITE_NAME}.conf         echo "$hostConf" >> ${APACHE2_DIR}/vhosts/${SITE_NAME}.conf         touch //home/$USER_NAME/$SITE_NAME/www/index.php         echo "<?php phpinfo() ?>" >> /home/$USER_NAME/$SITE_NAME/www/index.php                  chown $USER_NAME:$USER_NAME /home/$USER_NAME/$SITE_NAME/*                  service apache2 restart     fi fi;  #display information echo "*****************************************" echo "* Profit!" echo "*****************************************"

В общем ни чего сложного, в самом начале задаем ip адрес сервера и папку где у нас лежат настройки апача. Не забываем добавить права на исполнения файла

chmod -x /home/addsite

Для того чтобы апач мог подцепить наши конфиги в конец главного конфигурационого файла добавляем

Include vhosts/

Запускаем скрипт просто

/home/addsite user_name site.ru

Скрипт создаст пользователя, виртуальный хост и перезапустит апач. И конечно же не забудет показать пароль для вновь созданного пользователя.
Создание базы данных. Меня немного напрягало создание базы из phpMyAdmin, надо сначала создать базу, потом пользователя и еще не забыть добавить привелегии бд, новому пользователю, вот и упрощаем себе жизнь (/home/addbd).

#!/bin/bash  MYSQL_PASS="derev123blog"  UID_ROOT=0  if [ "$UID" -ne "$UID_ROOT" ]; then   echo "$0 - Requires root privileges"   exit 1 fi  function generate_pass(){     CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()-_=+\\|/"     LENGTH="8"     while [ "${n:=1}" -le "$LENGTH" ] ; do  PASSWORD="$PASSWORD${CHARS:$(($RANDOM%${#CHARS})):1}"         let n+=1     done     echo $PASSWORD }  function is_running(){     local result="$(ps -A|grep $1|wc -l)"     if [[ $result -eq 0 ]]; then  return 1     else  return 0     fi }  if [ $# -eq 1 ]; then     echo -n "Check MySQL status: "     if(is_running mysqld)then         echo "OK [Running]";         DB_NAME=$1         DB_PASSWORD="$(generate_pass)"         mysql -uroot -p${MYSQL_PASS} --execute="create database ${DB_NAME};"         mysql -uroot -p${MYSQL_PASS} --execute="GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_NAME}'@'localhost' IDENTIFIED by '${DB_PASSWORD}'  WITH GRANT OPTION;"     else         echo "Error: need start mysql daemon!"         exit     fi fi;  #display information echo "*****************************************" echo "* Data base name: ${DB_NAME}" echo "* Data base user: ${DB_NAME}" echo "* User password: ${DB_PASSWORD}" echo "* Profit!" echo "*****************************************"

В самом начале скрипта задаем пароль для пользователя root из MySQL. Запускаем командой

/home/addsite bd_name

Создастся база данных и пользователь и вывидутся данные для подключения.
Так же можно добавить оба файлв в дирректорию /bin для быстрого вызова данных комманд

cp /home/addsite /bin/addsite cp /home/addbd /bin/addbd

Вроде как все. Надеюсь данный способ создания виртуальных хостов упростит жизнь пользователям так же как и мне.

ссылка на оригинал статьи http://habrahabr.ru/post/209962/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *