Статьи

Настройка промежуточной среды

Обычной практикой является локальная работа над проектом и передача изменений на рабочий сервер, но этап, который люди часто пропускают, — это промежуточный сервер. Промежуточный сервер — это сочетание производства и разработки; вы можете протестировать ваше приложение, как если бы оно было в производстве. Давайте рассмотрим некоторые проблемы, которые вам придется рассмотреть, а также шаги, необходимые для репликации рабочей платформы как службы (PAAS).

Это происходило не раз: я запускаю пересмотр своего приложения в производство, чтобы найти проблему только после его публикации. Эти проблемы могут быть простыми: забыть добавить изображения в свой репозиторий, или они могут быть такими же большими, как локальное изменение структуры базы данных и забыть обновить производственную базу данных. Проблемы случаются со всеми, особенно если вы поспешили сроки. В этих ситуациях целесообразно настроить промежуточную среду. Идея состоит в том, чтобы иметь сервер, который бы точно копировал производственную среду, чтобы протестировать ваше приложение перед публикацией.

Промежуточные среды не только улавливают ошибки человека, но и проблемы, связанные с программным обеспечением.

Вы можете найти и устранить эти проблемы, поскольку в области подготовки используется то же программное обеспечение, что и в вашей производственной среде. Это резко контрастирует с вашим локальным компьютером, где у вас могут быть установлены разные версии программного обеспечения (например, PHP 5.3 против PHP 5.4) или даже другие функции. Я выдвинул код, который содержал вызовы file_get_contents только чтобы обнаружить, что производственный сервер не поддерживает эту функцию.

Итак, как вы собираетесь настроить промежуточный сервер? Ну, первый шаг — небольшая разведка.


Проблемы случаются со всеми, особенно если вы поспешили сроки.

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

Справедливо предположить, что большинство людей развертывают свои приложения с помощью какого-либо инструмента управления версиями (например, GIT). При странной вероятности того, что вы работаете над старым проектом, который все еще использует FTP, такие сайты, как ftploy.com или deployHQ.com, могут выступать в качестве буфера между GIT и вашим сервером. Джеффри Уэй собрал информативное видео, подробно рассказывающее, как это настроить.

Помимо GIT, вам нужно подумать о языках, программном обеспечении и «специальных» функциях, предлагаемых вашими производственными серверами. Я использую PAAS на основе PHP под названием Fortrabbit , потому что они предлагают современную поддержку PHP, Apache и GIT. Они также предоставляют возможность добавить ключевое слово в ваше сообщение коммита GIT, которое запускает Composer для установки зависимостей вашего проекта.

Это система, которую я настрою в оставшейся части этой статьи. Стандартный набор функций, а также специальная функция композитора делают Fortrabbit идеальным для широкого круга хостов. Просто помните: это не волшебное решение, но соответствующие шаги следуют той же схеме, которую вы использовали бы для настройки промежуточной среды для большинства проектов. Приспособьте процесс к вашим конкретным потребностям.

Так что без дальнейших церемоний, давайте прыгнем.


Создание промежуточной среды зависит от вашей производственной среды.

Существует много разных операционных систем, которые вы можете запустить на сервере. Fortrabbit запускает Debian Squeeze на своих серверах, и, поскольку мы пытаемся сопоставить их, я решил также запустить его.

Я буду использовать Vagrant, чтобы настроить это. Не волнуйтесь, если вы никогда не использовали Vagrant; мы не будем делать ничего продвинутого. Убедитесь, что у вас установлены VirtualBox и Vagrant (Vagrant — это CLI для VirtualBox; поэтому VirtualBox требуется).

Vagrant берет виртуальный снимок операционной системы в качестве базового «ящика», и вы можете затем создать несколько виртуальных машин из этого образа. Итак, во-первых, нам нужно скачать базовую коробку для Debian Squeeze. Я не совсем уверен, откуда взялась моя копия, поэтому я загрузил ее в DropBox, чтобы вы могли ее скачать и использовать. Для установки откройте окно терминала и введите:

1
vagrant box add debian https://dl.dropbox.com/u/30949096/debian.box

Это добавляет поле к Vagrant с именем ‘debian’. Теперь мы можем создать экземпляр этого блока для нашей промежуточной области. Сначала давайте создадим новую папку:

1
2
mkdir ~/staging_server
cd ~/staging_server

Затем создайте файл конфигурации Vagrant, набрав:

1
vagrant init debian

Это создает файл конфигурации с именем «VagrantFile», который содержит все настройки для вашего сервера. Когда вы открываете его, он выглядит довольно тесно, но большинство строк — это комментарии. Вам нужно только раскомментировать строку, которая говорит: config.vm.network :bridged . Удаление всех других комментариев оставляет вам файл, который выглядит следующим образом:

1
2
3
4
Vagrant::Config.run do |config|
    config.vm.box = «debian»
    config.vm.network :bridged
end

Эти параметры говорят Vagrant создать новую виртуальную машину на основе нашего базового блока Debian Squeeze. Затем он устанавливает сетевой режим на «мост». Виртуальная машина с мостовой сетью выглядит как новая физическая машина для вашего маршрутизатора, поэтому она автоматически получает свой собственный IP-адрес. Это позволяет получить доступ к устройству с любого устройства в вашей сети (возможно, за пределами вашей сети, если вы настроили свой маршрутизатор).

Теперь мы можем запустить нашу ВМ с помощью команды: « vagrant up » (без кавычек).

Вы должны увидеть вывод Vagrant, создающего вашу виртуальную машину. Если к вашему компьютеру подключено несколько сетевых карт, Vagrant предложит вам выбрать сетевой адаптер для моста.

Мы будем использовать SSH для входа в систему, но для входа нам потребуется встроенная команда Vagrant « vagrant ssh ». В соответствии с лучшими практиками Vagrant все пользователи должны иметь пользователя с именем «vagrant» и паролем для root и vagrant «vagrant». Пользователь vagrant добавляется как пользователь sudo которому не нужно вводить пароль, поэтому вы можете напрямую использовать команды sudo .

Давайте перейдем к настройке программного обеспечения сервера.


Настройка Fortrabbit включает в себя:

  • Apache 2.2
  • PHP 5.4
  • Композитор

Кроме того, они используют репозиторий dotdeb для установки большей его части. Для тех, кто незнаком, dotdeb — это проект Гийома Плесси, который устанавливает самые последние версии популярных пакетов веб-сервера.

Мы готовы начать. Убедитесь, что окно вашего терминала открыто и подключено к серверу через SSH. Сначала добавьте репозиторий dotdeb в APT (менеджер пакетов), добавив новый файл в каталог sources.d :

1
sudo vim /etc/apt/sources.list.d/dotdeb.list

Откроется новый файл с именем dotdeb.list в vim (текстовый редактор). Имя не важно, потому что все файлы в этом каталоге считываются в APT. Нам нужно добавить четыре строки в этот файл. Если вы никогда не использовали VIM, просто введите « i » для входа в режим вставки и скопируйте / вставьте следующие четыре строки:

1
2
3
4
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all
deb http://packages.dotdeb.org squeeze-php54 all
deb-src http://packages.dotdeb.org squeeze-php54 all

Для сохранения нажмите клавишу esc и введите :wq . Это команда для записи и выхода, что в основном означает сохранение и выход.

Нажатие Enter сохраняет файл и возвращает вас в командную строку.

Мы добавили репозитории, но нам все еще нужно добавить подпись, прежде чем мы сможем их использовать. Введите следующее, чтобы добавить ключ GNU:

1
curl http://www.dotdeb.org/dotdeb.gpg |

Это загружает ключ dotdeb и добавляет его в качестве подписанного источника. Теперь обновите APT, чтобы получить новый пакет, набрав:

1
sudo apt-get update

Это может занять минуту или около того, но все пакеты dotdeb будут перечислены в APT после его завершения. Из-за того, как настроен dotdeb и как загружаются зависимости APT, мы можем установить Apache и PHP одновременно, набрав:

1
sudo apt-get install php5

С помощью этой единственной строки APT устанавливает и настраивает Apache2 и PHP5. Если вы используете дополнение memcache для Fortrabbit, вы можете установить его с помощью:

1
sudo apt-get install memcached

Но я не собираюсь вдаваться в memcache в нашем примере в этой статье.

Теперь нам нужно установить расширения, которые использует Fortrabbit. Запустите следующую команду:

1
2
3
sudo apt-get install php5-xdebug php5-tidy php5-sqlite php5-redis php5-pgsql \
php5-mysqlnd php5-memcache php5-memcached php5-mcrypt php5-imagick php5-http \
php5-gmp php5-gd php5-curl php5-apc php5-intl

Последнее, что нам нужно установить, это Composer. Я собираюсь установить его глобально, потому что мы будем использовать его в нескольких разных местах. Команды для глобальной установки Composer:

1
2
curl -s https://getcomposer.org/installer |
sudo mv composer.phar /usr/local/bin/composer

Первая команда загружает и выполняет установщик; вторая команда перемещает Composer в папку bin, чтобы мы могли использовать ее без указания пути. Давайте перейдем к конфигурации.


Скорее всего, вы работаете над несколькими проектами. Если это так, наличие промежуточного сервера для каждого проекта создает много накладных расходов. Чтобы разрешить создание нескольких сайтов на одном сервере, нам нужно добавить виртуальные хосты на основе имен в Apache, а также разделить каталоги и репозитории для каждого проекта.

Начнем с виртуального хоста.

Я собираюсь продолжить использовать vim, но знаю, что если вы хотите работать в своих собственных программах, вы можете скопировать и вставить их или сохранить в папке staging_server вы создали на своем компьютере.

Эта папка является общей для вашей виртуальной машины, и вы можете получить доступ к файлам в корневом каталоге vagrant . Затем вы можете использовать: sudo cp /vagrant/file newfile или sudo mv /vagrant/filee newfile для копирования или перемещения файлов соответственно.

Чтобы создать новый виртуальный хост, нам нужно создать файл в каталоге /etc/apache2/sites-available/ . Чтобы сделать это с VIM, введите следующее:

1
sudo vim /etc/apache2/sites-available/demo.site

Внутри введите следующее (не забудьте нажать « i » для режима вставки):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName demo.dev
    DocumentRoot /var/www/demo
     
    <Directory /var/www/demo>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride ALL
        Order allow,deny
        allow from all
    </Directory>
     
    ErrorLog ${APACHE_LOG_DIR}/demo.log
    LogLevel debug
</VirtualHost>

В первой строке объявляется виртуальный хост, который прослушивает запросы на любом IP-адресе порта 80. Затем мы устанавливаем адрес электронной почты администратора сервера и имя сервера. Электронная почта предназначена для сообщений об ошибках, а опция имени сервера сообщает Apache, когда читать этот виртуальный хост. Обычные виртуальные хосты работают вне IP-адресов. Например, каждый vhost прослушивает разные IP; вот как Apache их отличает.

Поскольку у вас, вероятно, только один IP-адрес, мы можем использовать виртуальные хосты на основе имен, что позволяет вам предоставлять другое имя для одного и того же IP-адреса.

В нашем примере любые запросы, направленные на demo.dev, обрабатываются этим виртуальным хостом.

Следующая строка устанавливает корневую папку документа. Здесь Apache получает файлы для этого vhost. Операторы внутри директивы Directory устанавливают разрешения для этого vhost. Я не буду вдаваться в подробности, но сначала мы устанавливаем параметры каталогов Apache, затем устанавливаем, что можно переопределить в файле .htaccess, и, наконец, устанавливаем, кто может получить доступ к сайту (в нашем случае каждый может).

Последние две строки сообщают Apache, как назвать файл журнала и что записать в журнал. Наш файл журнала называется demo.log в папке журнала Apache, расположенной в /var/log/apache2/ на этой виртуальной машине.

Чтобы включить этот vhost, введите следующее:

1
sudo a2ensite demo.site

Это создает символическую ссылку между файлом в папке сайтов, доступных для файла в папке сайтов с поддержкой. После запуска этой команды вам будет предложено перезапустить Apache. Вы получите ошибку, если попытаетесь перезапустить Apache, потому что мы не создали каталог сайта. Это легко исправить, создав demo папку, на которую мы ссылаемся в файле vhost:

1
sudo mkdir /var/www/demo

Мы не хотим, чтобы пользователь root владел папкой, поэтому измените его на vagrant с помощью команды chown :

1
sudo chown -R vagrant:vagrant /var/www/demo

Теперь перезапустите Apache:

1
sudo service apache2 restart</code>

Наш новый сайт теперь должен быть полностью функциональным. Наш следующий шаг — настройка GIT.


Убедитесь, что вы находитесь в домашнем каталоге, набрав cd ~ . Создайте новую папку для mkdir demo.git : mkdir demo.git , войдите в папку и инициализируйте новое mkdir demo.git GIT:

1
2
cd demo.git
git init —bare

Чистое репо по сути является стандартным репо без рабочего каталога. Если вы хотите узнать больше о GIT, посмотрите видео-сериал Эндрю Берджесса .

Теперь нам нужна возможность отправить код в папку сайта, и для этого есть много способов. Но мне нравится, чтобы все выглядело как можно ближе к сервису, которому я подражаю. Вот изображение процесса git fortrabbit, взятого с их сайта:

Вы можете видеть, что процесс проталкивания проходит три этапа. Он отображает сообщение об обновлении при подключении и развертывает сайт в каталоге. Последний шаг устанавливает все, если сообщение о фиксации содержит ключевые слова «[trigger: composer]». Затем, после завершения этих трех шагов, вам будет показано сообщение «>> All Done <<».

Прежде чем создавать крючки, я хочу поговорить о цветах.

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


Терминалы поставляются с шестнадцатью цветами ANSI, которые можно настраивать и использовать по всему терминалу. Вот изображение экрана настроек iTerm2, показывающее шестнадцать цветовых слотов:

Вы можете получить к ним доступ в терминале, набрав escape-символ, открыв квадратную скобку, а затем код цвета. На этом изображении видно, что цвета разделены на две строки: одна помечена как «Нормальная», а другая — «Яркая». Коды для нормальных цветов — это числа 30-37, за которыми следует буква «m», а яркие цвета — от 90-97, за которыми следует m. Вы можете проверить это в окне терминала, используя echo . Чтобы создать escape-символ, введите ctrl-v а затем ctrl-[ . Вы получите символ, похожий на ^[ , но он не будет работать, если вы просто наберете «^ [» (shift-6, а затем откроете квадратную скобку). Итак, в окне терминала введите:

1
2
     
echo «^[[31m Hello World ^[[0m»

Опять же, первый ^[ не был напечатан, но был создан ctrl-v а затем ctrl-[ . Код символа 0m является кодом сброса; это удаляет все форматирование. Это потому, что цветовые коды не заканчиваются после следующего слова, они продолжаются, пока не получат другой код.

Если все сделано правильно, вышеприведенный код выводит слова «hello world» красным цветом (если у вас для этого слота не установлен другой цвет).

В оставшейся части урока я буду добавлять цвета к командам. Не стесняйтесь следовать или пропустить их; они не являются строго обязательными. Но если вы хотите использовать цвета, не стесняйтесь использовать мой класс, помогающий с цветом . Теперь вернемся к написанию крючков.


Если вы еще раз посмотрите на изображение Fortrabbit, то увидите, что перед обновлением репозитория отображается сообщение «Шаг 1: Обновление репозитория». Чтобы сделать это правильно, мы должны поместить это сообщение в ловушку предварительного получения, которая выполняется перед обновлением репо. В окне терминала введите:

1
vim ~/demo.git/hooks/pre-receive

Это открывает крюк для редактирования. Добавьте следующий код:

1
2
3
4
5
6
#!/usr/bin/php
<?php
    $yellow = «^[[33m»;
    $blank = «^[[0m»;
    echo $yellow .
?>

Первая строка сообщает ОС, что это файл PHP, и запускать его как таковой. Затем мы назначаем цвет и последовательность сброса для переменных. Последний шаг echo строку.

Следующий хук немного сложнее, потому что он обрабатывает остальные действия. Мы сделаем это шаг за шагом, поэтому сохраните первый хук (: wq) и откройте следующий хук:

1
vim ~/demo.git/hooks/post-receive

Хук пост-получения запускается после обновления репо. Мы должны сначала обновить сайт, а затем проверить наличие триггера Composer. Вот скелет нашей программы, исключая любую новую логику:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#!/usr/bin/php
<?php
    $yellow = «^[[33m»;
    $cyan = «^[[36m»;
    $blank = «^[[0m»;
         
    //print OK for first step
    echo » -> » .
         
    echo $yellow .
    /*TODO: Deploy to site */
    echo » -> » .
 
    /*TODO: Check if commit has trigger */
 
    echo $yellow .
?>

Это просто набросок для работы. Первое, что нам нужно добавить, это возможность перенести новую версию репозитория в каталог сайта. Традиционно, я бы просто набрал следующее, если бы я был в папке:

1
2
git fetch origin
git reset —hard origin/master

Вы можете использовать что-то вроде git pull , но это может привести к ошибкам. Если файл был напрямую изменен или вы пропустили коммит, то git pull не позволит вам либо вытащить, либо удалить файлы без отслеживания.

Это две простые команды, но вы получите ошибку, если попытаетесь запустить их с крючка.

GIT устанавливает некоторые переменные окружения до запуска хуков. Вы можете обойти это с помощью одного из двух решений, и я покажу вам оба.

Первый — переопределить переменные окружения, передавая информацию напрямую. Вторая полностью стирает переменные. Я буду использовать первый вариант в этом примере и второй вариант, когда мы будем работать с триггером композитора. Замените комментарий, который я добавил выше, где написано «Развернуть TODO на сайт», следующим текстом:

1
2
3
4
$git = «git —git-dir=/var/www/demo/.git/ —work-tree=/var/www/demo/»;
 
   exec(«$git fetch -q origin»);
   exec(«$git reset —hard origin/master»);

Это переопределяет переменные окружения и вызывает вышеупомянутые функции. Добавленный параметр -q говорит GIT, что он «тихий», запрещая GIT отображать любые сообщения.

Теперь нам нужно проверить триггер Composer. Давайте разбить это на два шага. Сначала мы проверяем триггер, а затем запускаем Composer. Заменить второй комментарий TODO следующим:

1
2
3
4
5
6
7
8
9
$msg = exec(«$git log -n 1 —format=format:%s%b»);
   if(strpos($msg, «[trigger:composer]») !== false){
       echo $yellow .
       echo » -> Triggering install — get a » .
 
       //run composer
 
       echo » -> » .
   }

Первая строка извлекает сообщение о git log используя команду git log и передавая в специальном формате, чтобы исключить любую дополнительную информацию. Затем мы проверяем, есть ли в строке специальное слово триггера, и выводим третий шаг и сообщение ОК. Мы проверяем ключевое слово Composer, но вы можете реализовать несколько ключевых слов для других функций, таких как: миграция в Laravel или запуск модульных тестов. Добавьте что-нибудь, чтобы улучшить ваш рабочий процесс.

Последний шаг — выполнить Composer. Composer имеет две команды: composer install composer update .

Команда install не читает файл composer.json если обнаруживает composer.lock , и поскольку некоторые люди могут добавить composer.lock в свой файл .gitignore, безопаснее запускать composer update (он всегда смотрит на файл composer.json ,

Вторая проблема заключается в том, что иногда Composer использует GIT для загрузки пакетов, и эти попытки терпят неудачу из-за переменных среды. Так что вот хорошее место, чтобы просто удалить переменную окружения «GIT_DIR». Замените комментарий для запуска Composer следующим текстом:

1
2
3
chdir(«/var/www/demo»);
   putenv(«GIT_DIR»);
   exec(«composer update»);

Этот код прост. Мы перемещаем процесс PHP в папку сайта, а затем удаляем GIT_DIR среды GIT_DIR чтобы GIT функционировал нормально. Последняя строка выполняет Composer.


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

1
2
chmod a+x ~/demo.git/hooks/pre-receive
chmod a+x ~/demo.git/hooks/post-receive

Затем создайте GIT-репо в папке сайта. Мы получим ошибку, если попробуем запустить наши хуки, потому что папка сайта не является репозиторием GIT. Чтобы исправить этот тип:

1
2
3
cd /var/www/demo
git init
git remote add origin /home/vagrant/demo.git

Первые две строки создают репо, а затем мы добавляем пустой репозиторий как источник этого репо.

Вы также должны добавить свой открытый ключ к авторизованным хостам этого сервера, чтобы вы могли получить доступ к серверу через GIT без пароля. Вы можете скопировать свой открытый ключ, набрав на своем компьютере (не на виртуальной машине):

1
cat ~/.ssh/id_rsa.pub |

Затем просто вставьте его на сервер в файле ~/.ssh/authorized_keys :

1
vim ~/.ssh/authorized_keys

Просто добавьте его в файл, но оставьте все, что уже есть внутри.

Далее нам нужно добавить IP этого сервера в наш файл hosts. Чтобы найти IP, введите:

1
ip -4 -o addr show label eth*

Это показывает вам IP всех сетевых устройств на этой виртуальной машине. Добавьте тот, который подключается к вашей локальной сети. Если вы не можете определить, какой IP-адрес использовать, скопируйте и вставьте его в свой браузер. Если он подключается, то у вас правильный IP-адрес.

Возьмите IP-адрес и добавьте его в файл hosts на вашем компьютере (а не в файл hosts на виртуальной машине). Файл hosts на Mac находится в etc/hosts :

1
sudo vim /etc/hosts

Затем добавьте следующую строку:

1
2
#Format: IP_address site_name
192.168.0.110 demo.dev

Если это работает, вы сможете перейти к http://demo.dev в вашем браузере. Пока вы еще на вашем Mac, создайте папку и инициализируйте репозиторий GIT:

1
2
3
4
5
6
7
8
mkdir ~/demo
cd ~/demo
git init
echo «Hello World» > index.php
git add .
git commit -am «added index.php»
git remote add staging [email protected]:demo.git
git push staging master

Если все прошло хорошо, вы должны увидеть ответ от наших хитов GIT. Переход к http://demo.dev должен привести к появлению сообщения «Hello World» в вашем браузере.


Таким образом, вы можете создать промежуточную среду, которая имитирует функциональность типичного PAAS. Если у вас возникли проблемы с последующим продвижением или вам нужно настроить несколько промежуточных сред, я создал скрипт, который полностью автоматизирует процесс. Для получения дополнительной информации вы можете посетить stagr.gmanricks.com .

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