Установка HHVM на Nginx в Ubuntu 14.04

HHVM (или HipHop Virtual Machine) – это открытая виртуальная машина для выполнения кода PHP и Hack. HHVM разработана и поддерживается компанией Facebook.

HHVM существенно отличается от других машин PHP благодаря JIT-компиляции. HHVM компилирует PHP-код в промежуточный байт-код, а затем непосредственно в команды и операторы 64-битных машин. Это позволяет оптимизировать работу и достичь более высокой производительности.

Виртуальная машина HHVM быстрая и мощная, потому, конечно, очень требовательна к ресурсам (впрочем, как и многие другие VM, например, JVM). HHVM требует больше оперативной памяти и ресурсов процессора по сравнению с другими, более легкими PHP-интерпретаторами (например, PHP-FPM). Как показали результаты тестирований, для нормальной производительности необходим сервер с 1 Гб оперативной памяти минимум.

Данное руководство поможет установить HHVM и настроить взаимодействие с Nginx.

Требования

Примечание: Данное руководство было выполнено на Ubuntu 14.04. Описанные в нём действия актуальны и для других операционных систем и версий. Однако при этом нужно учитывать разницу в командах и расположении конфигурационных файлов.

Для выполнения руководства понадобится:

  • Сервер Ubuntu 14.04 с 1Гб RAM минимум.
  • Не-root пользователь с доступом к sudo (об этом можно прочитать здесь).
  • Предварительно настроенный сервер Nginx (инструкции по установке можно найти здесь).

Установка HHVM

Для системы Ubuntu 14.04 существует специальный репозиторий HHVM. Чтобы добавить этот репозиторий, нужно импортировать открытые ключи GnuPG:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449

После этого можно установить репозиторий HHVM:

sudo add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main"

Затем нужно обновить список пакетов системы при помощи пакетного менеджера apt.

sudo apt-get update

Теперь можно установить HHVM:

sudo apt-get install hhvm

Данная команда установит и запустит HHVM. Чтобы HHVM запускалась и останавливалась вместе с сервером, добавьте HHVM в стандартные уровни запуска:

sudo update-rc.d hhvm defaults

Настройка HHVM

HHVM поставляется со скриптом, который позволяет упростить настройку взаимодействия с Nginx.

Примечание: Далее подразумевается, что Nginx уже установлен.

Запустите скрипт при помощи следующей команды без аргументов:

sudo /usr/share/hhvm/install_fastcgi.sh

Этот скрипт добавляет конфигурационный файл /etc/nginx/hhvm.conf в стандартный блок server (/etc/nginx/sites-enabled/default). Он работает только со стандартными настройками Nginx без дополнительной конфигурации FastCGI.

Если стандартный блок server уж содержит пользовательские настройки FastCGI (например, для PHP-FPM), нужно заменить эти настройки FastCGI следующим кодом:

location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
include        fastcgi_params;
}

Этот код настраивает Nginx для использования HHVM при обработке файлов .php и .hh.

Чтобы обновить настройки, перезапустите Nginx.

sudo service nginx restart

Также предполагается, что конфигурация HHVM по умолчанию не была изменена, и HHVM обслуживается на 127.0.0.1:9000. Этот параметр содержится в главном конфигурационном файле HHVM, /etc/hhvm/server.ini:

; php options
pid = /var/run/hhvm/pid
; hhvm specific
hhvm.server.port = 9000
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc

Обратите внимание на переменную hhvm.server.port, которая определяет порт, прослушиваемый HHVM (в данном случае 9000). Кроме того, если не указано иное, по умолчанию HHVM будет слушать локальный хост.

Машина HHVM предназначена для окружений с высокой нагрузкой, потому первое, что нужно изменить, – это настроить HHVM для прослушивания сокета вместо порта. Это сократит расход ресурсов сервера и памяти на взаимодействие Nginx и HHVM.

Чтобы настроить сокеты HHVM, откройте файл /etc/hhvm/server.ini в текстовом редакторе:

sudo vim /etc/hhvm/server.ini

Удалите строку hhvm.server.port, а на её место внесите следующую:

hhvm.server.file_socket=/var/run/hhvm/hhvm.sock

Сохраните настройки, а затем перезапустите HHVM.

sudo service hhvm restart

Затем нужно сообщить об этом изменении веб-серверу Nginx. Для этого откройте следующий файл:

sudo vim /etc/nginx/hhvm.conf

Убедитесь, что директива fastcgi_pass указывает на сокет HHVM и выглядит так:

fastcgi_pass unix:/var/run/hhvm/hhvm.sock;

Снова перезапустите Nginx:

sudo service nginx restart

Скрипт /usr/share/hhvm/install_fastcgi.sh экономит время, но всё-таки остаются настройки, которые нужно исправить вручную. Особенно это касается блоков server.

Например, конфигурации блока server по умолчанию открываются как индексные файлы index.html и index.htm, а листинг каталога запрещен. Первая настройка, которую точно нужно изменить – добавить файлы index.php. Для этого снова откройте конфигурационный файл блока server по умолчанию:

sudo vim /etc/nginx/sites-enabled/default

Найдите раздел server и добавьте index.php к другим индексным файлам:

index index.html index.htm index.php;

Снова перезапустите веб-сервер:

sudo service nginx restart

Тестирование и тонкая настройка HHVM

Первое тестирование можно выполнить при помощи интерфейса командной строки PHP usr/bin/php, который указывает на /etc/alternatives/php, который в свою очередь указывает на бинарный файл /usr/bin/hhvm.

/usr/bin/php --version

После запуска этой команды на экране появится версия HHVM и сведения о репозитории:

HipHop VM 3.8.1 (rel)
Compiler: tags/HHVM-3.8.1-0-g3006bc45691762b5409fc3a510a43093968e9660
Repo schema: 253b3802ce1bcd19e378634342fc9c245ac76c33

Если PHP был установлен ранее HHVM, на экране может появиться старый вывод PHP. Чтобы исправить это, запустите команду:

sudo /usr/bin/update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60

После этого можно использовать функцию phpinfo(), чтобы просмотреть настройки и опции HHVM. Для этого создайте файл info.php в стандартном каталоге document root, /usr/share/nginx/html.

sudo vim /usr/share/nginx/html/info.php

Добавьте в него код:

<?php
phpinfo();
?>

Также рекомендуется убедиться в том, что файлы Nginx принадлежат пользователю www-data. Чтобы изменить владельца этих файлов, введите команду:

sudo chown www-data: /usr/share/nginx/html/info.php

Теперь попробуйте открыть этот файл при помощи IP сервера. для этого введите в браузер следующий URL-адрес. На экране появится страница, указывающая версию HHVM и предоставляющая другие сведения.

Если страница не появилась, значит, произошла ошибка. Убедитесь, что все вышеперечисленные инструкции выполнены верно. Проверьте логи ошибок Nginx (/var/log/nginx/error.log) и HHVM (/var/log/hhvm/error.log).

Обратите внимание: данная страница очень похожа на ту, что появляется при использовании phpinfo() для PHP. На самом деле, большинство переменных HHVM идентично переменным РНР, за исключением индивидуальных переменных (среди которых префикс hhvm.).

Изучая переменные, следует отметить, что ограничение памяти равно 17179869184 байт, а это немного больше 17 Гб. Такой высокий лимит памяти, конечно, может привести к сбою сервера с небольшим объёмом RAM. Необходимо уменьшить это значение, чтобы другие сервисы не пострадали от недостатка оперативной памяти.

К примеру, если на сервере 2GB оперативной памяти, разумно было бы выделить 1.2 GB для HHVM. Для этого отредактируйте /etc/hhvm/php.ini:

sudo vim /etc/hhvm/php.ini

Добавьте новую переменную после опции ; php options:

memory_limit = 1200M

Аналогичным образом можно изменить любую настройку PHP. Не забудьте перезапустить HHVM после изменения настроек:

sudo service hhvm restart

После этого можно провести более сложное тестирование. Сейчас важно знать, что HHVM не полностью совместим с обычным PHP, а также со всеми популярными фреймворками PHP. Официальное количество поддерживаемых фреймворков ограничено.

При тестировании с фреймворком или веб-приложением не должно рассматриваться ничего индивидуального для HHVM. Установка и инструкции по использованию должны быть такими же, как для обычного стека LEMP; это потому, что по умолчанию HHVM поставляется в комплекте со многими модулями PHP, обеспечивающими хорошую совместимость.

Однако в некоторых довольно редких случаях нужно установить дополнительные модули для HHVM. К примеру, при работе с PostreSQL понадобится модуль pgsql. В таком случае обратитесь к официальной документации HHVM.

Заключение

Как видите, HHVM легко установить, настроить и интегрировать с Nginx. Серверы с большим объёмом ресурсов могут пользоваться преимуществами уникального производительного JIT-компилятора HHVM. В целом, HHVM идеально подойдёт для обслуживания объёмных сайтов со сложным функционалом и высоким трафиком. Для небольших сайтов с более низким трафиком рекомендуется подобрать другое решение с меньшим потреблением памяти.

Tags: , ,

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