HHVM, Nginx и Laravel

Минимальные требования

Так же как и во многих остальных статьях в своем блоге, я полагаю что у вас установлена Ubuntu 12.04 LTS в качестве сервера. Хотя установить систему можно и на Mac с помощью Brew (). Информация по установке HHVM на серверные машины, включая последние версии Ubuntu, можно найти здесь. Итак, начнем.

Необходимые установки

Для начала, установим минимальные зависимости

~~~{.bash} sudo apt-get update sudo apt-get install -y unzip vim git-core curl wget build-essential python-software-properties


### Установка Nginx
Теперь установим Nginx. Сначала надо установить Nginx, так как **hhvm-fastcgi** вносит изменения в установку Nginx.
### Установка HHVM FastCGI
Теперь самое главное. Как написано в [блоге HHVM](http://www.hhvm.com/blog/1817/fastercgi-with-hhvm){:target="_blank"}, мы можем установить HHVM c FastCGI. В результате мы получим установленный HHVM уже настроенный для работы с FastCGI.
~~~{.bash}
echo deb http://dl.hhvm.com/ubuntu precise main | sudo tee /etc/apt/sources.list.d/hhvm.list
sudo apt-get update
sudo apt-get install -y --force-yes hhvm-fastcgi

Обратите внимание, что я добавил опцию —force-yes. Это убережёт нас от проблем с зависимостями, с которыми я столкнулся при установке HHVM.

Настройка HHVM

По сути HHVM — это своеобразная версия PHP, так что нам не придётся устанавливать PHP дополнительно. После установки вы можете использовать HHVM в качестве PHP, то есть можете запускать php файлы следующим образом:

~~~{.bash} hhvm some_file.php


Так как вы наверняка используете различные компоненты (composer, phpunit), которые предполагают, что ваш PHP запускается в терминале, через команду php (технически php-cli). Чтобы избежать проблем создадим ссылку на **hhvm**.
~~~{.bash}
sudo ln -s `which hhvm` /usr/local/bin/php

Теперь можно запускать php как обычно

~~~{.bash} php -v HipHop VM v2.3.2 (rel) Compiler: tags/HHVM-2.3.2-0-gf951cb8d8812c59344d5322454853b584b668636 Repo schema: 5b5a4fc9cde5a5d014d1dfdb491bf74e4e700131


### HHVM FastCGI
Я использую **vagrant**, и предпочитаю чтобы каталог `/vagrant` был корневым для моих документов. Для изменения настроек корневого каталога по умолчанию, нам надо настроить HHVM и Nginx.
Давайте начнем с HHVM. Надо отредактировать файл `/etc/hhvm/server.hdf`. Вот как можно это сделать при помощи одной строки кода:
~~~{.bash}
sudo sed -i 's/SourceRoot = \/var\/www\//SourceRoot = \/vagrant\//' /etc/hhvm/server.hdf

Теперь перезагрузим HHVM

~~~{.bash} sudo service hhvm-fastcgi restart


### Настройка Nginx
Теперь настроим Nginx. Я создам новый файл настроек:
~~~{.bash}
sudo vim /etc/nginx/sites-available/vagrant

Вот мой законченный вариант:

~~~{.nginx}

Файл /etc/nginx/sites-available/vagrant

server { root /vagrant; index index.html index.htm index.php;

server_name localhost; # 192.168.33.10.xip.io если вы используете Vaprobash

include hhvm.conf; # Подключение файла конфигурации HHVM для Nginx

location / { try_files $uri $uri/ /index.php?q=$uri&$args; }

location ~ /.ht { deny all; } }


### Два важных замечания
**Первое:** в отличие от Nginx c PHP5-fpm, нам не надо объявлять блок **location**. Если вы устанавливаете Nginx до HHVM, то последний создаст для вас файл  /etc/nginx/hhvm.conf. Версия файла hhvm.conf, который мы используем содержит блок location нужный для PHP.
**Второе:** файл hhvm.conf считает, что корень вашего сервера находится по адресу `/var/www`. А это перезаписывает настройки /root/vagrant. Нам надо это исправить следующим образом:
~~~{.bash}
sudo vim /etc/nginx/hhvm.conf
# Затем закомментируйте строчку  'root /var/www' и сохраните

Вот примерное содержание файла /etc/nginx/hhvm.conf

~~~{.nginx} location ~ .php$ {

root /var/www

fastcgi_keep_conn on; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; }


Теперь активируем только что созданный виртуальный хост
~~~{.bash}
sudo ln -s /etc/nginx/sites-available/vagrant /etc/nginx/sites-enabled/vagrant

Теперь надо перезагрузить Nginx и HHVM чтобы изменения вступили в силу. Но сначала создадим php файл для проверки.

Запускаем PHP

Создадим простой PHP файл, что проверить нашу настройку.

~~~{.bash} vim /vagrant/index.php


Добавим в него что нибудь простое
~~~{.php}
<?php
echo phpinfo(); // Ответ: HipHop

Теперь можно перезапустить Nginx и hhvm-fastcgi. После этого, если вы откроете в браузере адрес вашего сервера, то вы должны увидеть созданный вами php файл.

~~~{.bash} sudo service hhvm-fastcgi restart sudo service nginx reload


Вы должны увидеть в своем браузере “HipHop”
### Laravel
После всех проделанных настроек, установка Laravel не должна создать каких-либо проблем. Так как мы создали ссылку на PHP, все должно просто работать. Проверим.
#### Установка Composer
Процесс установки ничем не отличается от стандартного:
~~~{.bash}
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Установка Laravel

Теперь создадим проект на Laravel при помощи Composer

~~~{.bash} cd /vagrant composer create-project laravel/laravel hhlaravel


Сделайте перерыв на кофе, пока Laravel устанавливается со всеми своими зависимостями.
#### Последний шаг: настройка Laravel
Нам неободимо совершить небольшой трюк для настройки корневого каталога:
~~~{.bash}
sudo sed -i 's/SourceRoot = \/vagrant\//SourceRoot = \/vagrant\/hhlaravel\/public\//' /etc/hhvm/server.hdf
sudo sed -i 's/root \/vagrant;/root \/vagrant\/hhlaravel\/public;/' /etc/nginx/sites-available/vagrant
sudo service hhvm-fastcgi restart
sudo service nginx reload

Мы закончили, в своем браузере вы должны увидеть приветственную страницу Laravel.

Замечания

Следите за логом ошибок. HHVM не выдаёт ошибок в окне браузера по умолчанию.

Проверьте лог Laravel

~~~{.bash}

Показать последние 50 строк записанных в лог laravel

tail -n 50 -f /vagrant/hhlaravel/app/logs/laravel.log


**Посмотрите внимательно на лог HHVM**
~~~{.bash}
tail -n 50 -f /var/log/hhvm/error.log

Вы также можете настроить свой сервер так, чтобы стек вызовов сохранялся в логе. Отредактируйте файл /etc/hhvm/server.hdf добавив директивы InjectedStackTrace и NativeStackTrace.

Log {
  Level = Warnустановка LaravelExceptions = true
  RuntimeErrorReportingLevel = 8191
  UseLogFile = true
  UseSyslog = false
  File = /var/log/hhvm/error.log
  InjectedStackTrace = true
  NativeStackTrace = true
  Access {
    * {
      File = /var/log/hhvm/access.log
      Format = %h %l %u % t \"%r\" %>s %b
    }
  }
}

Напоследок, вы можете настроить выдачу некоторых ошибок в браузер добавив настройки отладки в ваш файл /etc/hhvm/server.hdf.

Debug {
 FullBacktrace = true
 ServerStackTrace = true
 ServerErrorMessage = true
 TranslateSource = true
}

Но все же более подробная информацию хранится в логах. Вот ссылка на статью, описывающую настройку удаленного отладчика для HHVM (сам пока не пробовал)