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

в 12:34, , рубрики: Apache, apache2, 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 "$passwordn$passwordn" | 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

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

Автор: vlom88

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js