Translate

Автоматизация создания виртуального хоста для web-разработки на базе Apache+Nginx

Как быстро создать виртуальнй хост и структуру папок одной строкой в терминале


Так уж сложилось, что для web-разработки я использую отдельный сервер на базе Debian. В первую очередь это обусловлено тем, что я часто работаю вне дома, а так-же это позволяет совместно работать над проектом с коллегами. 
Раньше мне приходилось вручную создавать директории для сайта, копировать и править конфиги. Я тратил на это кучу времени и иногда ошибался, а потом судорожно искал где и что я упуслил.

Не так давно я задумался над автоматизацией процесса создания виртуальных хостов. Порыв немного в интернетах, и заодно вспомнив bash, родился скрипт, который избавил меня от рутины и ошибок одновременно.

Конфигурация у меня следующая:
  • Стандартный LAMP + NGINX в качестве фронт-энда.
  • Директория с хостами /var/www/hosting/
  • Директоря виртуального хоста = имени домена
  • Стуктура виртуального хоста
    1. test.ru/cgi-bin
    2. test.ru/www
    3. 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


Разберемся немного с кодом:

  1. Если Вы решили «скопипастить» скрипт — удалите обратный слэш в "<\/Directory>". Я добавил обратный слэш, дабы редактор не съедал строку.
  2. Я использую frontend/backend технологию, поэтому каждый отдельный хост сидит на отдельном порту апача для проксирования его NGINX-ом.
Порты должны бвть перечислены в конфиге /etc/apache2/ports.conf

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 — Обновил скрипт и статью. Статью с учетом подсветки кода, а в скрипте порпавил некоторые баги.

http://habrahabr.ru/post/93695/

Целебное зелье для IE5+ или IE7.js

Разбирая код очередного проекта внутри тега head наткнулся на интересный код:

<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta3)/IE9.js"></script>
<![endif]-->

Только одно слово «IE9» меня пустило в замешательство. Первое что пришло мне в голову — это то, что при помощи этого .js кода браузеры под печальным клеймом Internet Explorer можно заставить работать используя свойства многообещающего IE9. Больше всего я ожидал что будут доступны свойства CSS3.0, но не тут-то было!

Первый гугл запрос меня привел сюда. С первых строк стало понятно что это «аспирин» для верстальщиков. Думаю что сейчас самый раз перестать лить воду и прыгнуть с места в карьер.

Вкратце, от какой головной боли нас избавляет эта библиотека:
  • min-width(height)
  • PNG прозрачность
  • opacity
  • Селекторы и псевдоклассы:
    — ::after, ::before;
    — :first-child, :last-child;
    — [attr=«value»];
  • .multiple.classes
  • ...

Просто взгляните и протестируйте демо-страницу, лично у меня в горле пересохло и пришлось ущипнуть себя чтобы убедится что со мной все в порядке и то что я вижу — реально.

После того, как все эти примеры я протестил в эмуляторе IE начиная с версии 5.5 как будто вдыхать воздух стало легче. Правда тест PNG Alpha прозрачности заставил IE5.5 уйти в нирвану, но это никак не заставило меня пожалеть о том, что я потратил свое ценное время на изучение этой библиотеки.

Считаю что разработка Dean Edwards'a принесет многим пользу.

PS: новичкам не советую использовать эту штуку, если вы не понимаете откуда и когда берутся эти баги и как их решить при помощи своих ручек. Просто я на 100% уверен, что не на всех проектах будет получаться использовать эту библиотеку… Каким-то клиентам на этот момент будет ровно, а других это не будет устраивать.

IE7.js project home page
Demo

http://habrahabr.ru/post/100838/#habracut

Постоянные читатели