Персональный сайт Федоренко Александра Вторник, 16.12.2025, 06:38
Приветствую Вас Гость | RSS
Меню сайта

Категории раздела
Мои статьи [17]
Linux [47]
Кулинария [13]
LINUX [33]
WINDOWS [11]

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Linux

Быстрое создание виртуальных хостов 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 "" >> /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/
Категория: Linux | Добавил: AFed (22.01.2014)
Просмотров: 400 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск

Copyright MyCorp © 2025Создать бесплатный сайт с uCoz