Множество людей интересовалось установкой HHVM на Nginx для использования с Laravel. Давайте приступим.
HHVM (или HipHop Virtual Machine) — транслятор исходного кода, созданный компанией Facebook. HipHop программно превращает исходный код, написанный на языке PHP, в высоко оптимизированный код на C++, а затем использует компилятор g++ для его компиляции.
Вступление
Как и в большинстве моих статей, я буду использовать Ubuntu 12.04 LTS как сервер для установки нашего добра. Однако, мы вполне можем установить это все на Mac с помощью Brew (nginx и hhvm). Информация об установке HHVM на другие платформы (включая новые версии Ubuntu) может быть найдена здесь.
Ну что же, поехали!
Установка основы
Сначала, установим базовые вещи, необходимые для нашей цели:
$ sudo apt-get update
$ sudo apt-get install -y unzip vim git-core curl wget build-essential python-software-properties
Установка Nginx
Далее, установим Nginx. Почему он идет первым? Так как при установке пакета hhvm-fastcgi, он [пакет] изменит некоторые конфигурации Nginx, если обнаружит его.
$ sudo apt-get install -y nginx
Установка HHVM FastCGI
Судя по блогу HHVM мы можем установить HHVM с FastCGI. Следующий код установит HHVM и настроит для работы с FastCGI.
$ 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 это по сути собственная версия PHP, поэтому нам не нужно устанавливать PHP отдельно. После установки вы можете использовать HHVM как обычный PHP. Для примера, вы можете исполнять php-файлы:
$ hhvm some_file.php
Так как у нас, вероятно, есть Composer и PHPUnit, которые предполагают доступность из командной строки, мы можем создать симлинк php на hhvm:
$ sudo ln -s `which hhvm` /usr/local/bin/php
Теперь мы можем использовать PHP как обычно!
$ php -v
HipHop VM v2.3.2 (rel)
Compiler: tags/HHVM-2.3.2-0-gf951cb8d8812c59344d5322454853b584b668636
Repo schema: 5b5a4fc9cde5a5d014d1dfdb491bf74e4e700131
HHVM Fast-CGI
Я использую Vagrant, и я хочу, чтобы моим корневым каталогом была директория /vagrant. Для изменения корня, нам нужно настроить как HHVM, так и Nginx.
Давайте начнем с HHVM. Файл для редактирования: /etc/hhvm/server.hdf Вот однострочная команда для выполнения:
# Change doc root from /var/www/ to /vagrant/
$ sudo sed -i 's/SourceRoot = /var/www//SourceRoot = /vagrant//' /etc/hhvm/server.hdf
Затем перезапускаем HHVM для применения изменений:
$ sudo service hhvm-fastcgi restart
Настраиваем Nginx
Теперь настроим Nginx. Я создам новый конфигурационный файл под названием vagrant:
# Create and edit our new configuration file
$ sudo vim /etc/nginx/sites-available/vagrant
Здесь вы можете увидеть конечное содержимое этого файла:
// File /etc/nginx/sites-available/vagrant
server {
root /vagrant;
index index.html index.htm index.php;
server_name localhost; # 192.168.33.10.xip.io if you are using Vaprobash
include hhvm.conf; # Include HHVM's configuration file for Nginx
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location ~ /.ht {
deny all;
}
}
Два важных замечания
Во-первых, мы не определяем блок location. Установка Nginx до HHVM представляет возможность HHVM увидеть Nginx и создать файл /etc/nginx/hhvm.conf для вас. Файл hhvm.conf, который мы подключаем, уже имеет блок location, нужный PHP.
Во-вторых, файл hhvm.conf предполагает корневой каталог /var/www. Это перезаписывает настройку root/vagrant. Нам нужно изменить это, чтобы наш vagrant-файл определял корневой каталог путем удаления директивы root в файле hhvm.conf:
$ sudo vim /etc/nginx/hhvm.conf
# Then comment out the line 'root /var/www' and save
Сам файл /etc/nginx/hhvm.conf:
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;
}
Теперь включим виртуальный хост, который мы только что создали:
$ sudo ln -s /etc/nginx/sites-available/vagrant /etc/nginx/sites-enabled/vagrant
Теперь предстоит перезапустить HHVM-FastCGI и Nginx для вступления в силу изменений. Но сначала, создадим тестовый php-файл.
Немного PHP
Создадим простой тестовый файл:
$ vim /vagrant/index.php
Что-то простое вроде этого:
<?php
echo phpinfo(); // Expected output: HipHop
Дело за малым. Просто перезапускаем hhvm-fastcgi и nginx. После этого, вы сможете увидеть index.php при подключении к IP-адресу сервера (или к 192.168.33.10.xip.io, если вы юзаете Vaprobash) в браузере.
$ sudo service hhvm-fastcgi restart
$ sudo service nginx reload
Вы должны увидеть «HipHop» в браузере.
Laravel
В нашем случае установка Ларавела ничем не отличается от обычной установки оного. С тех пор, как мы симлинкнули PHP, все должно работать как часы. Давайте попробуем.
Установка Composer
Это будет обыкновенная глобальная инсталляция:
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
Установка Laravel
Теперь нам предоставляется возможность создать новый laravel-проект. Я назову его hhlaravel:
# Move to /vagrant so we install Laravel
# into /vagrant/hhlaravel
$ cd /vagrant
$ composer create-project laravel/laravel hhlaravel
Можете попить чая или кофе, пока установятся все зависимости :)
Последний шаг: настройка Laravel
Давайте сделаем маленький твик и установим корневой каталог в /public:
# Fast CGI document root
$ sudo sed -i 's/SourceRoot = /vagrant//SourceRoot = /vagrant/hhlaravel/public//' /etc/hhvm/server.hdf
# Nginx document root
sudo sed -i 's/root /vagrant;/root /vagrant/hhlaravel/public;/' /etc/nginx/sites-available/vagrant
# Reload configuration
$ sudo service hhvm-fastcgi restart
$ sudo service nginx reload
Все готово! Можете проверить работоспособность с помощью браузера.
Предостережения и примечания
Вам захочется уделять намного больше внимания на логи ошибок. По умолчанию, HHVM никаких ошибок в браузер не выводит. Проверьте лог ларавела:
# Show last 50 lines written out to laravel log
$ tail -n 50 -f /vagrant/hhlaravel/app/logs/laravel.log
Проверьте лог HHVM:
$tail -n 50 -f /var/log/hhvm/error.log
Вы также можете получать stack trace в ваши логи путем изменения конфигурации сервера.
Отредактируйте /etc/hhvm/server.hdf и добавьте директивы InjectedStackTrace и NativeStackTrace.
Log {
Level = Warning
AlwaysLogUnhandledExceptions = 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
}
}
}
И наконец, вы можете добавить немного вывода в окно браузера путем добавления настроек Debug'а в /etc/hhvm/server.hdf:
Debug {
FullBacktrace = true
ServerStackTrace = true
ServerErrorMessage = true
TranslateSource = true
}
Однако помните, что журналы ошибок будут иметь более подробную информацию об ошибке. Здесь есть статья об использовании remote debugger'а для HHVM (на себе не испытывал).
Автор: duse