Развёртывание в облаке Heroku

Эта пошаговая статья описывает, как развернуть веб-приложение Symfony на облачной платформе Heroku. Её содержимое основывается на первоначальной статье, опубликованной Heroku.

Установка

Чтобы создать новый вебсайт Heroku, для начала зарегистрируйтесь в Heroku или выполните вход с помощью своих сертификатов. Далее, скачайте и установите на вашем копмьютере Heroku Toolbelt.

Вы также можете прочитать справочник начало работы с PHP в Heroku, чтобы ближе познакомиться с особенностями работы с PHP-приложениями в Heroku.

Подготовка ваших приложений

Развёртываение приложения Symfony в Heroku не требует никаких изменений в коде, но требует некоторых минимальных настроек в его конфигурации.

По умолчанию, приложение Symfony будет записывать логи в каталог вашего приложения var/log/. Это не идеально, так как Heroku использует эфемерную файловую систему. В Heroku, наилучшим способом работы с логами являетсяиспользование Logplex. А лучший способ отправлять данные записей в Logplex - это написать STDERR или STDOUT. К счастью, Symfony использует для ведения логов отличную библиотеку Monolog. Поэтому, новое место назначения лога - это простое изменение файла конфигурации.

Откройте файл app/config/config_prod.yml, найдите раздел monolog/handlers/nested (или создайте его, если он ещё не существует) и измените значение path с "%kernel.logs_dir%/%kernel.environment%.log" на "php://stderr":

1
2
3
4
5
6
7
8
# app/config/config_prod.yml
monolog:
    # ...
    handlers:
        # ...
        nested:
            # ...
            path: 'php://stderr'

Когда приложение будет развёрнуто, запустите heroku logs --tail, чтобы оставить поток логов из Heroku открытым в вашем терминале.

Создание нового приложеия в Heroku

Чтобы создать новое приложение Heroku, которое вы можете загрузить, используйте команду CLI create:

1
2
3
4
5
$ heroku create

Создание mighty-hamlet-1981 в организации heroku... окончено, стек is cedar
http://mighty-hamlet-1981.herokuapp.com/ | [email protected]:mighty-hamlet-1981.git
Удалённый Git добавлен в heroku

Теперь вы готовы развёртывать приложение так, как объясняется в следующем разделе.

Развёртывание вашего приложения в Heroku

До того, как вы впервые выполните развёртывание, вам нужно сделать ещё три шага, которые описываются ниже:

  1. Создайте Procfile
  2. Установите окружение prod
  3. Загрузите ваш код в Heroku

1) Создайте Procfile

По умолчанию, Heroku будет запускать веб-сервер Apache вместе с PHP, чтобы обслуживать приложения. Однако, к приложениям Symfony применяются особенные условия: корень документа находится в каталоге web/, а не в корневом каталоге приложения.

Создайте новый файлпод названием Procfile (без расширения) в корневом каталоге приложения и просто добавьте следующее содержимое:

1
web: vendor/bin/heroku-php-apache2 web/

Note

Если вы предпочитаете использовать Nginx, который также доступен в Heroku, вы можете создать для него файл конфигурации и указать на него из вашего Procfile, как описывается в документации Heroku:

1
web: vendor/bin/heroku-php-nginx -C nginx_app.conf web/

Если вы предпочитаете работать в консоли управления, выполните следующие команды, чтобы создать файл Procfile и добавить его в хранилище:

1
2
3
4
5
$ echo "web: vendor/bin/heroku-php-apache2 web/" > Procfile
$ git add .
$ git commit -m "Procfile for Apache and PHP"
[master 35075db] Procfile for Apache and PHP
 1 file changed, 1 insertion(+)

2) Установите окружение prod

Во время развёртывания, Heroku запускает composer install --no-dev, чтобы установить все зависимости, необходимые вашему приложению. Однако, типичное post-install-commands в composer.json, например, для установки ресурсов или очистки (или разогрева) кешей, по умолчанию запускаются, используя окружение Symfony dev.

Это явно не то, что вам нужно - приложение работает в "производстве" (даже если вы используете его просто для эксперимента или в качестве окружения инсценировки), поэтому любые шаги построения должны использовать то же окружение prod.

К счастью, решение этой проблемы очень простое: Symfony возьмёт переменную окружения под названием SYMFONY_ENV, и будет использовать это окружение, если больше ничего ясно не сказано. Так как Heroku представляет все config vars в качестве переменных окружения, вы можете использовать одну команду для подготовки вашего приложения к развёртыванию:

1
$ heroku config:set SYMFONY_ENV=prod

Caution

Имейте в виду, что зависимости из composer.json, перечисленные в разделе require-dev никогда не устанавливаются во время развёртывания в Heroku. Это может вызвать проблемы, если ваше оркружение Symfony полагается на такие пакеты из require-dev в секции require.

3) Загрузите ваш код в Heroku

Далее, наконеу пришло время, развернуть ваше приложение в Heroku. Если вы делаете это впервые, то вы можете увидеть следующее сообщение:

1
2
3
Аутентичность хоста 'heroku.com (50.19.85.132)' не может быть установлена.
Отпечаток RSA-ключа - 8b:48:5e:67:0e:c9:16:47:32:f2:87:0c:1f:c8:60:ad.
Вы уверены, что хотите продолжить подключение (да/нет)?

В этом случае, вам нужно подтвердить, напечатав yes и нажав клавишу <Enter> - в идеале, после того, как вы `убедились, что отпечаток RSA-ключа правильный`_.

Далее, разверните ваше приложение, выполнив эту команду:

 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
$ git push heroku master

Инициализация репозитория, готово.
Подсчёт объектов: 130, готово.
Дельта-сжатие, используя до 4 потоков.
Сжатие объектов: 100% (107/107), готово.
Написание объектов: 100% (130/130), 70.88 KiB | 0 bytes/s, готово.
Всего 130 (дельта 17), использовано повторно 0 (дельта 0)

-----> Обнаружено PHP-приложение

-----> Установка окружения времени прогона...
       - PHP 5.5.12
       - Apache 2.4.9
       - Nginx 1.4.6

-----> Установка PHP-расширений:
       - opcache (автоматические; пакетированные, используя 'ext-opcache.ini')

-----> Установка зависимостей...
       Версия Composer 64ac32fca9e64eb38e50abfadc6eb6f2d0470039 2014-05-24 20:57:50
       Загрузка хранилищ компоновщика с информацией пакетов
       Установка зависимостей из файла блокировки
         - ...

       Генерирование оптимизированных файлов автозагрузки
       Создание файла "app/config/parameters.yml"
       Очистка кеша для окружения dev с отладкой true
       Установка ресурсов с использованием документальной копии
       Установка ресурсов для Symfony\Bundle\FrameworkBundle into web/bundles/framework
       Установка ресурсов для Acme\DemoBundle into web/bundles/acmedemo
       Установка ресурсов для Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution

-----> Построение окружения времени прогона...

-----> Обнаружение типов процессов
       Procfile объявляет типы -> web

-----> Сжатие... готово, 61.5MB

-----> Запуск... готово, v3
       http://mighty-hamlet-1981.herokuapp.com/ развёрнут в Heroku

To [email protected]:mighty-hamlet-1981.git
 * [new branch]      master -> master

И это всё! Теперь, если вы откроете свой браузер, либо вручную нажав на URL, который дал вам heroku create, либо используя Heroku Toolbelt, приложение ответит:

1
2
$ heroku open
Открытие mighty-hamlet-1981... готово

Вы должны увидеть ваше приложение Symfony в вашем браузере.

Caution

Если вы сделаете свои первые шаги в Heroku, используя свежую установку стандартной версии Symfony, то вы можете столкнуться с ошибкой 404 "Страница не найдена". Это потому, что маршрут для / определяется AcmeDemoBundle, но AcmeDemoBundle загружается только в окружении dev (проверьте ваш класс AppKernel). Попробуйте открыть /app/example из AppBundle.

Шаги пользовательской компиляции

Если вы хотите выполнить дополнительные пользовательские команды во время разработки, вы можете воспользоваться пользовательскими шагами компиляции Heroku's. Представьте, что вы хотите удалить фронт-контроллер dev из вашего окружения производства в Heroku, чтобы избежать потенциальной уязвимости. Добавление команды для удаления web/app_dev.php в post-install-commands Composer сработает, но также удалит контроллер в вашем локальном окружении разработки в каждом composer install или composer update соответственно. Вместо этого, вы можете добавить пользовательскую команду Composer под названием compile (это имя ключа - соглашение Heroku) в раздел scripts вашего composer.json. Перечисленные команды подключаются к процессу развёртывания Heroku:

1
2
3
4
5
6
7
{
    "scripts": {
        "compile": [
            "rm web/app_dev.php"
        ]
    }
}

Это также очень полезно для построения ресурсов в системе производства, например с помощью Assetic:

1
2
3
4
5
6
7
{
    "scripts": {
        "compile": [
            "bin/console assetic:dump"
        ]
    }
}

Построение ресурсов может зависеть от узловых пакетов, например, uglifyjs или uglifycss для уменьшения ресурсов. Установка узловых пакетов во время развёртывания требует установку узла. Но на данный момент, Heroku компилирует ваше приложение, используя пакет построения PHP, который определяется автоматически в присутствии файла composer.json, и не включает в себя установку узла. Так как пакет построения Node.js имеет старшинство над пакетом PHP (см. пакеты построения Heroku), добавление package.json, перечисляющего все ваши узловые зависимости, заставляет Heroku выбрать пакет Node.js:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
    "name": "myApp",
    "engines": {
        "node": "0.12.x"
    },
    "dependencies": {
        "uglifycss": "*",
        "uglify-js": "*"
    }
}

При следующем развёртывании, Heroku компилирует ваше приложение, используя пакет построения Node.js и ваши npm-пакеты устанавливаются. С другой стороны, теперь игнорируется ваш composer.json. Чтобы скомпилировать ваше приложение с обоими пакетами, Node.js и PHP, вам нужно использовать оба из них. Чтобы переопределить автоопределение пакета построения, вам нужно ясно установить его:

1
2
3
4
5
6
7
8
9
$ heroku buildpacks:set heroku/nodejs
Пакет построения установлен. Следующий релиз вашего приложения будет использовать
heroku/nodejs.
Запустить git push heroku master, чтобы создать новый релиз, используя этот пакет.
$ heroku buildpacks:set heroku/php --index 2
Пакет построения установлен. Следующий релиз вашего приложения будет использовать:
  1. heroku/nodejs
  2. heroku/php
Запустить git push heroku master, чтобы создать новый релиз, используя эти пакеты.

При следующем развёртывании, вы можете получить преимущества обоих пакетов построения. Эта установка также позволяет вашему окружению Heroku с пользой использовать основанные на узлах автоматизированные инструменты построения вроде Grunt или gulp.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.