...

воскресенье, 12 января 2014 г.

[Перевод] HHVM, Nginx и PHP (а также Laravel)

HHVM + Nginx + PHP + LaravelМножество людей интересовалось установкой 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 (на себе не испытывал).

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий