Блог веб-разработчика v 1.0.0
Symfony2, AngularJS, React, Gulp, PhpStorm и много других страшных слов

Развертывание Symfony2 дев-окружения на Vagrant

3 года назад
5573 просмотра
Symfony2 Vagrant Перевод

Что будем делать?

Vagrant + Puppet. Что и зачем?

Вам понадобится знать всего пару вещей о Vagrant и Puppet для понимания этой статьи. Vagrant создает виртуальные машины используя какой-либо провайдер (в нашем случае VirtualBox). Vagrant запускает Puppet на созданной виртуальной машине и Puppet установит на нее необходимый софт (Apache, MySQL и т.д.). Этот процесс называют развертыванием.

Зачем использовать Vagrant?

Когда мы используем Vagrant для создания виртуальной машины, то избавляем себя от опасности испортить нашу "персональную" виртуальную машину. Люди использовали виртуальные машины для разработки многие годы. Но у них полно недостатков: неудобно пробрасывать внутрь USB устройства, без сложной и длительной настройки синхронизации папок приходилось использовать IDE или текстовый редактор прямо из ВМ. Это пожирало ресурсы вашей реальной машины. Поддержание одинаковой версии ПО на ВМ среду команды было просто адской болью для разработчиков. Почему бы просто не скопировать Vagrantfile и пару манифестов для Puppet вместо всего этого? Вместо передачи гигабайт образов ВМ просто закинуть настройки Vagrant и Puppet в вашу систему контроля версий.

Далее мы так и поступим, развернув окружение для Symfony2 на виртуальной машине.

Создание Symfony проекта через Composer

Давайте позволим Composer сделать за нас всю работу по созданию нового проекта:

curl -s https://getcomposer.org/installer | php
php composer.phar create-project symfony/framework-standard-edition symfony2 'dev-master'
cd symfony2

После установки вы должны увидеть что-то вроде “Some parameters are missing. Please provide them.”.

На вопрос  “Would you like to install Acme demo bundle? [y/N]” отвечайте Y, чтобы было что посмотреть ради примера.

Идем дальше. На вопрос про настройки просто жмите Enter, оставляя все настройки по умолчанию.

Мы запускаем дев-окружение, поэтому давайте изменм пару строк в .htaccess файле. Замените строки о app_dev.php на это:

# /web/.htaccess
RewriteRule ^app_dev.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
RewriteRule .? %{ENV:BASE}/app_dev.php [L]

А так же немного поправьте app_dev.php, чтобы он не ругался 403-й ошибкой об ограничении доступа. Закоментируйте эти строки:

# /web/app_dev.php
// header('HTTP/1.0 403 Forbidden');
// exit('You are not allowed to access this file. Check '.basename(FILE).' for more information.');

У нас есть Symfony2 проект, но мы не сможем на нем разрабатывать без веб-сервера. Давайте переложим на Vagrant всю эту "тяжелую" работу по установке.

Настройка Vagrant

Vagrant имеет кучу возможностей прямо из коробки, и не так уж сложно его настроить. Установите последнюю версию, откройте терминал в директории проекта:

vagrant init hashicorp/precise32

Теперь откройте создавшийся Vagrantfile в любом текстовом редакторе и давайте настроим развертывание через Puppet, а так же прокинем 8080 порт на 80 в виртуальной машине. На этом настройка Vagrant завершится.

# /Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.network "forwarded_port", guest: 80, host: 8080

  # Enable provisioning with Puppet stand alone.  Puppet manifests
  # are contained in a directory path relative to this Vagrantfile.
  # You will need to create the manifests directory and a manifest in
  # the file default.pp in the manifests_path directory.
  #
  config.vm.provision "puppet" do |puppet|
    puppet.manifests_path = "manifests"
    puppet.manifest_file  = "site.pp"
  end

end

Развертывание через Puppet / Зависимости Symfony

В действительности....Symfony2 потрясающий и мощный фреймворк, но с высоким порогом вхождения. Чтобы избавиться от ручной работы и запустить Symfony приложение нам понадобятся три вещи:

  • Установить необходимый софт на ВМ
  • Настроить VirtualHost для Apache2
  • Настроить Apache для запуска с нужными правами

Установка необходимого ПО на ВМ

Puppet скрипт будет довольно простым, все что нам нужно это установить на ВМ Apache, PHP, mod_rewrite и MySQL. Создайте папку manifests в вашем проекте и внутри файл sites.pp с таким содержимым:

# /manifests/site.pp
exec {"apt-get update":
  path => "/usr/bin",
}

package {"apache2":
  ensure => present,
  require => Exec["apt-get update"],
}

service { "apache2":
  ensure => "running",
  require => Package["apache2"]
}

package {['mysql-server', 'mysql-client']:
  ensure => installed,
  require => Exec["apt-get update"]
}

service { 'mysql':
  ensure  => running,
  require => Package['mysql-server'],
}

package { ["php5-common", "libapache2-mod-php5", "php5-cli", "php-apc", "php5-mysql"]:
  ensure => installed,
  notify => Service["apache2"],
  require => [Exec["apt-get update"], Package['mysql-client'], Package['apache2']],
}

exec { "/usr/sbin/a2enmod rewrite" :
  unless => "/bin/readlink -e /etc/apache2/mods-enabled/rewrite.load",
  notify => Service[apache2],
  require => Package['apache2']
}

Настройка VirtualHost

Для начала создадим символьную ссылку внутри ВМ на /var/www из нашей /vagrant директории:

# /manifests/site.pp
file {"/var/www":
  ensure => "link",
  target => "/vagrant",
  require => Package["apache2"],
  notify => Service["apache2"],
  replace => yes,
  force => true,
}

А теперь давайте настроим простой vhost указывающий на нашу папку web в Symfony проекте. Эта настройка так же должна оказаться в нашем git-репозитории. Создадим файл vhost.conf в папку manifests/assets с таким содержимым:

# /manifests/assets/vhost.conf
<VirtualHost *:80>
    ServerName symfony.dev
    DocumentRoot /vagrant/web
    <Directory /vagrant/web>
        # enable the .htaccess rewrites
        AllowOverride All
        Order allow,deny
        Allow from All
    </Directory>

    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>

А теперь укажем Puppet создать символьную ссылку на этот файл в sites-available Apache:

# /manifests/site.pp
file { "/etc/apache2/sites-available/default":
  ensure => "link",
  target => "/vagrant/manifests/assets/vhost.conf",
  require => Package["apache2"],
  notify => Service["apache2"],
  replace => yes,
  force => true,
}

Настройка запуска Apache от имени пользователя Vagrant

Это дев-окружение, так что можно позволить себе небольшой хак чтобы не возится с правами на папки. Хак честно стащен у Jeremy Kendall. Все что нужно, это заставить Apache использовать пользователя и группу Vagrant, это позволит писать в кеш и логи без каких-либо проблем.

# /manifests/site.pp
exec { "ApacheUserChange" :
  command => "/bin/sed -i 's/APACHE_RUN_USER=www-data/APACHE_RUN_USER=vagrant/' /etc/apache2/envvars",
  onlyif  => "/bin/grep -c 'APACHE_RUN_USER=www-data' /etc/apache2/envvars",
  require => Package["apache2"],
  notify  => Service["apache2"],
}

exec { "ApacheGroupChange" :
  command => "/bin/sed -i 's/APACHE_RUN_GROUP=www-data/APACHE_RUN_GROUP=vagrant/' /etc/apache2/envvars",
  onlyif  => "/bin/grep -c 'APACHE_RUN_GROUP=www-data' /etc/apache2/envvars",
  require => Package["apache2"],
  notify  => Service["apache2"],
}

exec { "apache_lockfile_permissions" :
  command => "/bin/chown -R vagrant:www-data /var/lock/apache2",
  require => Package["apache2"],
  notify  => Service["apache2"],
}

Теперь запускам vagrant up из директории проекта и наблюдаем как оживает наше Symfony2 приложение. Перейдите на http://127.0.0.1:8080 чтобы увидеть первую страницу приложения.

В заключение

Теперь у нас есть рабочий Symfony2 проект, живущий на виртуальной машине. Мы можем начать разработку незамедлительно. Чтобы увидеть реальные преимущества использования Vagrant и Puppet вы можете скопировать проект на другой компьютер, запустить composer install и vagrant up и проект запустится без лишних вопросов и настроек. Вы можете заниматься разработкой даже под разным ОС, в том числе OSX, Windows или Linux.

Исходный код урока можно посмотреть тут: https://github.com/nater1067/Vagrant-Symfony-2 

От переводчика

Все что написано выше опробовано буквально вчера и отлично работает. Конено, конфиг довольно примитивный и топорный, но тем не менее полностью рабочий.

В статье все команды запускаются из терминала, но я использовал PhpStorm для запуска Vagrant. Из меню Tools -> Vagrant можно делать все без консоли и довольно удобно.

Это очень вольный перевод, так что не придирайтесь к непереведенным словам. Весь смысл сохранен очень хорошо, а где-то даже лучше.

Оригинальная статья: http://nater1067.github.io/blog/2014/08/25/spinning-up-symfony-2-development-environments-with-vagra...
Что еще почитать
Авторизация в тестах PHPUnit в Symfony2
3 года назад
2841 просмотр
Рано или поздно вам понадобится иммитировать авторизованного пользователя в PHPUnit тестах. Советы из документации полезны, но не совсем удобны.