bash скрипт управления виртуальными хостами на CentOS (RedHat, Fedora)
В очередной раз создавая виртуальный хост на выделенном сервере — задумался об упрощении задачи, т.к. в 90% случаев использую схожую структуру хранения сайтов. Взял за основу сторонний скрипт, доработал под свои задачи и решил поделиться.
Описание
Скрипт умеет добавлять, удалять, включать, выключать виртуальные хосты на CentOS и подобных ОС. Ubuntu, Debian имеют несколько иную структуру, поэтому скрипт на них работать не будет.
Скрипт делает проверки на существование хостов при добавлении, интерактивно предлагает заменить файл конфигурации, не удаляет файлы в директории, если они уже присутствовали. На каждое спорное действие (удаление файлов, директорий) — задает вопрос на дальнейшее действие.
Настройка скрипта
Скрипт имеет ряд настроек, часть из которых берется из командной строки для удобства:
1 2 3 4 5 6 7 8 9 10 11 | action=$1 domain=$2 documentrootdir=$3 owner='apache' confDir='/etc/httpd/conf.d/' userDir='/var/www/' #rootdir=${domain//./} rootdir=$domain dirPerm=775 confDomain=$confDir$domain.conf |
Действие, имя домена, домашняя директория задаются через параметры.
Параметр | Описание |
---|---|
owner | После создания директорий сайта — им задается владелец и группа. описанный в данном параметре |
Прописывается в настройки хоста в параметр ServerAdmin | |
confDir | Директория, куда будут записаны конфигурационные файлы виртуальных хостов веб сервера |
userDir | Директория, где будут храниться все виртуальные хосты |
rootdir | Директория, в которой будут храниться виртуальных хостов |
dirPerm | Права вновь созданные директории виртуальных хостов |
confDomain | Имя конфигурационного файла |
Использование
Добавление хоста
Самое простое использование:
1 | ./vhostsAdmin.sh add test.com |
Вывод:
1 2 3 4 5 6 7 8 | [root@admin tmp]# ./vhostsAdmin.sh add test.com New Virtual Host Created Host added to /etc/hosts file Reloading httpd: Complete! You now have a new Virtual Host Your new host is: http://test.com And its located at /var/www/test.com |
Скрипт создает файл конфигурации виртуального хоста $confDomain (/etc/httpd/conf.d/test.com.conf) следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <VirtualHost *:80> ServerAdmin test@mail.ru DocumentRoot /var/www/test.com/public_html ServerName test.com ServerAlias www.test.com ErrorLog /var/www/test.com/logs/error_log CustomLog /var/www/test.com/logs/access_log common php_admin_value upload_tmp_dir /var/www/test.com/tmp php_admin_value session.save_path /var/www/test.com/tmp php_admin_value open_basedir /var/www/test.com:/usr/share/pear <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/test.com> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost> |
Вывод конфигурационного файла можно поменять в исходниках.
Скрипт создает директории, если это необходимо: $userDir/$rootDir/{tmp,public_html,logs} (/var/www/test.com/{tmp,public_html,logs}), выдает им права $dirPerm (chmod 775) и делает проверку на возможность записи в директорию $userDir/$rootDir.
В случае, если DocumentRoot отличается от $userDir/$rootDir/public_html, путь к нему можно передать вторым параметром относительно $rootDir:
1 | ./vhostsAdmin.sh add test.com pubic_html/web |
Это полезно, когда у нас используются фреймворки (Yii2, Lavarel), в которых DocumentRoot находится в поддиректориях web, public и других.
Удаление
Удаление производится командой. Удаляется файл конфигурации, производится перезапуск веб сервера, делается запрос на удаление файлов виртуального хоста и в случае положительного ответа — удаляет всю директорию.
1 | ./vhostsAdmin.sh remove test.com |
Вывод:
1 2 3 4 5 6 | [root@ittricks tmp]# ./vhost_admin.sh remove test.com Reloading httpd: Delete host root directory /var/www/test.com? (y/n) y Directory deleted Complete! You just removed Virtual Host test.com |
Включение / выключение
Данная процедура предусматривает переименовывание конфигурационного файла виртуального хоста, при выключении добавляется префикс .off, при включении — префикс удаляется:
1 2 3 4 | [root@admin tmp]# ./vhost_admin.sh off test.com Reloading httpd: Complete! You just deactivate test.com |
1 2 3 4 | [root@admin tmp]# ./vhost_admin.sh on test.com Reloading httpd: Complete! You just activate test.com |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | #!/bin/bash ### Set Language TEXTDOMAIN=virtualhost ### Set default parameters action=$1 domain=$2 documentrootdir=$3 owner='apache' confDir='/etc/httpd/conf.d/' userDir='/var/www/' #rootdir=${domain//./} rootdir=$domain dirPerm=775 confDomain=$confDir$domain.conf ### don't modify from here unless you know what you are doing #### me=`basename $0` if [ "$(whoami)" != 'root' ]; then echo $"You have no permission to run $0 as non-root user. Use sudo" exit 1; fi if [ "$action" != 'add' ] && [ "$action" != 'remove' ] && [ "$action" != 'on' ] && [ "$action" != 'off' ] then cat <<EOF You need to prompt for action (create or delete) -- Lower-case only Usage example - Add: $me add test.com With non standart document root^ $me add test.com pubic_html/web - Remove $me remove test.com - Off $me off test.com - On $me on test.com EOF exit 1; fi while [ "$domain" == "" ] do echo -e $"Please provide domain. e.g.dev,staging" read domain done if [ "$rootdir" == "" ]; then #rootdir=${domain//./} rootdir=$domain fi if [ "$documentrootdir" == "" ]; then documentrootdir="/public_html" fi if [ "$action" == 'add' ] then ### check if domain already exists if [ -e $confDomain ]; then echo -e $"This domain already exists. Rewrite config file? (y/n)" read delconf if [ "$delconf" != 'y' ] && [ "$delconf" != 'Y' ]; then echo -e $"Please Try Another one" exit; fi fi ### check if directory exists or not if ! [ -d $userDir$rootdir ]; then ### create the directory mkdir $userDir$rootdir/{public_html,logs,tmp} -p ### give permission to root dir chmod -R $dirPerm $userDir$rootdir ### write test file in the new domain dir if ! echo "<?php echo phpinfo(); ?>" > $userDir$rootdir/public_html/phpinfo.php then echo $"ERROR: Not able to write in file $userDir/$rootdir/phpinfo.php. Please check permissions" exit; else #echo $"Added content to $userDir$rootdir/public_html/phpinfo.php" rm $userDir$rootdir/public_html/phpinfo.php fi fi ### create virtual host rules file if ! echo "<VirtualHost *:80> ServerAdmin $email DocumentRoot $userDir$rootdir/$documentrootdir ServerName $domain ServerAlias www.$domain ErrorLog $userDir$rootdir/logs/error_log CustomLog $userDir$rootdir/logs/access_log common php_admin_value upload_tmp_dir $userDir$rootdir/tmp php_admin_value session.save_path $userDir$rootdir/tmp php_admin_value open_basedir $userDir$rootdir:/usr/share/pear <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory $userDir$rootdir> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost>" > $confDomain then echo -e $"There is an ERROR creating $domain file" exit; else echo -e $"\nNew Virtual Host Created" fi ### Add domain in /etc/hosts if ! echo "127.0.0.1 $domain" >> /etc/hosts then echo $"ERROR: Not able to write in /etc/hosts" exit; else echo -e $"Host added to /etc/hosts file \n" fi if [ "$owner" == "" ]; then chown -R $(whoami):$(whoami) $userDir$rootdir else chown -R $owner:$owner $userDir$rootdir fi ### restart Apache /etc/init.d/httpd reload ### show the finished message echo -e $"Complete! \nYou now have a new Virtual Host \nYour new host is: http://$domain \nAnd its located at $userDir$rootdir" exit; fi if [ "$action" == 'remove' ] then ### check whether domain already exists if ! [ -e $confDomain ]; then echo -e $"This domain config file does not exist.\nPlease try another one" #exit; else ### Delete domain in /etc/hosts newhost=${domain//./\\.} sed -i "/$newhost/d" /etc/hosts ### Delete virtual host rules files rm $confDomain ### restart Apache /etc/init.d/httpd reload fi ### check if directory exists or not if [ -d $userDir$rootdir ]; then echo -e $"Delete host root directory $userDir$rootdir? (y/n)" read deldir if [ "$deldir" == 'y' -o "$deldir" == 'Y' ]; then ### Delete the directory rm -rf $userDir$rootdir echo -e $"Directory deleted" else echo -e $"Host directory conserved" fi else echo -e $"Host directory not found. Ignored" fi ### show the finished message echo -e $"Complete!\nYou just removed Virtual Host $domain" exit 0; fi if [ "$action" == 'on' ]; then ### check whether domain already exists if ! [ -e "$confDomain.off" ]; then echo -e $"This domain config file does not exist.\nPlease try another one" exit; else mv $confDomain.off $confDomain ### restart Apache /etc/init.d/httpd reload ### show the finished message echo -e $"Complete!\nYou just activate $domain" exit 0; fi fi if [ "$action" == 'off' ]; then ### check whether domain already exists if ! [ -e "$confDomain" ]; then echo -e $"This domain config file does not exist.\nPlease try another one" exit; else mv $confDomain $confDomain.off ### restart Apache /etc/init.d/httpd reload ### show the finished message echo -e $"Complete!\nYou just deactivate $domain" exit 0; fi fi |