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