Не так давно переехал с
- Панель делает все за тебя, а мне хочется прокачать скил в области адмиистрирования.
- Не нравится способ создания сайтов через панель, а именно создаваемые пути до папки с сайтом (/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