Установка HHVM на Nginx в Ubuntu 14.04
Ubuntu | Комментировать запись
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: HHVM, NGINX, Ubuntu 14.04