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 (на себе не испытывал).

ссылка на оригинал статьи http://habrahabr.ru/post/208778/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *