среда, 22 января 2014 г.

[Из песочницы] Быстрое создание виртуальных хостов 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




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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий