Как быстро создать виртуальнй хост и структуру папок одной строкой в терминале
Так уж сложилось, что для web-разработки я использую отдельный сервер на базе Debian. В первую очередь это обусловлено тем, что я часто работаю вне дома, а так-же это позволяет совместно работать над проектом с коллегами.
Раньше мне приходилось вручную создавать директории для сайта, копировать и править конфиги. Я тратил на это кучу времени и иногда ошибался, а потом судорожно искал где и что я упуслил.
Не так давно я задумался над автоматизацией процесса создания виртуальных хостов. Порыв немного в интернетах, и заодно вспомнив bash, родился скрипт, который избавил меня от рутины и ошибок одновременно.
Конфигурация у меня следующая:
- Стандартный LAMP + NGINX в качестве фронт-энда.
- Директория с хостами /var/www/hosting/
- Директоря виртуального хоста = имени домена
- Стуктура виртуального хоста
- test.ru/cgi-bin
- test.ru/www
- test.ru/log
Создаем файл:
cd ~ touch addvhost.sh chmod +x addvhost.sh
и пишем в него следующее
#!/bin/sh hostmaster="hostmaster@test.ru" # Электропочта Администратора сервера www_path="/var/www/hosting/" # Путь до директории с виртуальными хостами wwwuser="www-data" wwwgroup="www-data" case "$@" in "") echo "Введите имя домена (as root)." ;; *) clear echo "Создаю директории сайта" mkdir -p $www_path$1/www/ mkdir -p $www_path$1/cgi-bin/ mkdir -p $www_path$1/log/ echo "$www_path$1/www/" echo "$www_path$1/cgi-bin/" echo "$www_path$1/log/" echo "\nСоздаю пустой index.html " echo " " > $www_path$1/www/index.html chown -R $wwwuser:$wwwgroup /$www_path$1 chmod -R 0755 /$www_path$1 echo "\nДобавляю хост в: /etc/apache2/sites-enabled/$1" exec 3>&1 1>/etc/apache2/sites-enabled/$1 echo "<virtualhost \${HOSTING_HOST}:$2>" echo " ServerName $1" echo " ServerAdmin $hostmaster" echo " " echo " DocumentRoot \${HOSTING_ROOT}/$1/www/" echo " <Directory />" echo " Options Indexes Includes FollowSymLinks MultiViews" echo " Order allow,deny" echo " AllowOverride All" echo " Allow from All" echo " </Directory>" echo " " echo " <Directory \${HOSTING_ROOT}$1/www/>" echo " Options Indexes Includes FollowSymLinks MultiViews" echo " Order allow,deny" echo " AllowOverride All" echo " Allow from All" echo " </Directory>" echo " " echo " ScriptAlias /cgi-bin/ \${HOSTING_ROOT}/$1/cgi-bin/" echo " <Directory \${HOSTING_ROOT}/$1/cgi-bin/>" echo " AllowOverride None" echo " Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch" echo " Order allow,deny" echo " Allow from all" echo " </Directory>" echo " " echo " ErrorLog \${HOSTING_ROOT}/$1/log/error.log" echo " LogLevel warn" echo " CustomLog \${HOSTING_ROOT}/$1/log/access.log combined" echo " ServerSignature On" echo " " echo "</virtualhost>" exec 1>&3 echo "\nДобавляю хост в: /etc/nginx/sites-enabled/$1" exec 3>&1 1>/etc/nginx/sites-enabled/$1 echo "server {" echo " listen 80;" echo " server_name $1;" echo " " echo " #charset koi8-r;" echo " " echo " access_log $www_path$1/log/$1-nginx.access.log main;" echo " " echo " location / {" echo " proxy_pass http://127.0.0.1:$2/;" echo " proxy_redirect off;" echo " proxy_set_header Host \$host;" echo " proxy_set_header X-Real-IP \$remote_addr;" echo " proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;" echo " client_max_body_size 40m;" echo " client_body_buffer_size 256k;" echo " " echo " proxy_connect_timeout 120;" echo " proxy_send_timeout 120;" echo " proxy_read_timeout 120;" echo " proxy_buffer_size 64k;" echo " proxy_buffers 4 64k;" echo " proxy_busy_buffers_size 64k;" echo " proxy_temp_file_write_size 64k;" echo " proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;" echo " }" echo " #Static files location" echo " location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ " echo " {" echo " root $www_path$1/www/;" echo "}" echo "}" exec 1>&3 sleep 1 echo "Перезапуск вэбсервера" sudo /etc/init.d/apache2 restart sudo /etc/init.d/nginx restart echo "Домен создан;)" echo "Теперь вы можете перейти по адресу http://$1" ;; esac
Разберемся немного с кодом:
- Если Вы решили «скопипастить» скрипт — удалите обратный слэш в "<\/Directory>". Я добавил обратный слэш, дабы редактор не съедал строку.
- Я использую frontend/backend технологию, поэтому каждый отдельный хост сидит на отдельном порту апача для проксирования его NGINX-ом.
Listen 8080 Listen 8081 Listen 8082 Listen 8083 #И_так_далее
${HOSTING_HOST} и ${HOSTING_ROOT} — переменные Apache2. Они мне нужны.
Вместо них вы можете использовать свои переменные или явно указать адреса/пути.
Так же замечу что ${HOSTING_ROOT} имеет то же значение что и $www_path, поэтому можно использовать и ее.
Теперь когда мы со всем разобрались — запускаем
sudo ./addvhost.sh test.ru 8080
где «test.ru» — имя нашего домена (присваивается $1), а «8080» — порт на котором у нас будет сидеть этот тестовый домен (присваивается $2).
Что имеем в итоге: у нас автоматически создаются директории для виртуальных хостов. Конфиги виртуальных хостов для Apache и Nginx c нужными нам параметрами так-же автоматом генерируются, складываются куда надо и перезапускаются сервисы. Проффит.
PS. Конечно данный скрипт очень примитивен и не претендует на оригинальность, но все же способен значительно облегчить жизнь начинающему разработчику или администратору.
Для локальной разработки я использую MAMP Pro. Весь описаный выше функционал, и даже больше, там доступен через красивый и удобный GUI, но не все работает на Mac и не всегда, а жить как-то надо.
PPS. Как вариант — можно использовать шаблоны конфигурационных файлов вместо echo «каждой строчки». Но мне пока и так нормально.
Будет время — доработаю и выложу.
UPD — Новая версия скрипта с использованием шаблонов конфигов доступна здесь
«Полотенце» из echo заменено на обычный sed -e. Скрипт стал более гибким и простым.
UPD II — Обновил скрипт и статью. Статью с учетом подсветки кода, а в скрипте порпавил некоторые баги.
