前書き

HHVMは、PHPおよびhttp://hacklang.org/[Hack]コードを実行するためのオープンソースの仮想マシンです。 HHVMはFacebookによって開発およびサポートされており、その事実は最近HHVMにますます注目を集めています。

HHVMは、ジャストインタイム(JIT)コンパイルアプローチのため、他のPHPエンジンとは異なります。 HHVMは、PHPコードを中間バイトコードにコンパイルしてから、x64マシン命令に直接コンパイルします。 これにより、他のエンジンの動作と比較して、より多くの最適化とより高いパフォーマンスが可能になります。

HHVMは強力で高速ですが、他の仮想マシン(例: JVM)。 したがって、HHVMは、PHP-FPMなどの他のより軽量なPHPインタープリターと比較して、より多くのRAMとCPUを必要とします。 私たちのテストでは、まともなパフォーマンスには少なくとも1 GBのRAMを備えたDropletが必要であることが示されました。

この記事では、HHVMをインストールしてNginxと統合する方法を示します。

前提条件

このガイドはUbuntu 14.04でテストされています。 説明されているインストールと構成は、他のOSまたはOSバージョンでも同様ですが、構成ファイルのコマンドと場所は異なる場合があります。

このチュートリアルでは、次のものが必要です。

  • 1 GB以上のRAMを備えたUbuntu 14.04ドロップレット

  • 非ルートsudoユーザー(https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04[Ubuntu 14.04での初期サーバーセットアップ]を参照)

  • Nginxがインストールされている(https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04[How Ubuntu 14.04にLinux、Nginx、MySQL、PHP(LEMP)スタックをインストールするには])

このチュートリアルのすべてのコマンドは、非rootユーザーとして実行する必要があります。 コマンドにルートアクセスが必要な場合は、先頭に「+ sudo +」が付きます。

インストール

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"

リポジトリを追加したら、Ubuntuのソフトウェアマネージャーであるaptを作成する必要があります。aptでイ​​ンストールできる新しいパッケージがあることに注意してください。 これは、次のコマンドでaptのキャッシュを更新することで実行できます。

sudo apt-get update

最後に、次のコマンドを使用してHHVMをインストールできます。

sudo apt-get install hhvm

上記のコマンドは、HHVMをインストールして初めて起動します。 HHVMがDropletで自動的に起動および停止することを確認するには、次のコマンドを使用してHHVMをデフォルトのランレベルに追加します。

sudo update-rc.d hhvm defaults

設定

HHVMには、Nginxとの統合を非常に簡単にするスクリプトが付属しています。 デフォルトのNginxインストールがある場合、次のような引数なしでスクリプトを実行できます。

sudo /usr/share/hhvm/install_fastcgi.sh

このスクリプトを実行すると、構成ファイル `+ / etc / nginx / hhvm.conf `がデフォルトのNginxサーバーブロック構成 ` / etc / nginx / sites-enabled / default +`に追加されます。 FastCGI構成がなく、デフォルトのNginx構成でのみ機能します。

PHP-FPM用など、カスタムFastCGI構成を使用してデフォルトのサーバーブロックを既に変更している場合は、以前のFastCGI構成を次のように手動で置き換える必要があります。

/ etc / nginx / sites-enabled / default

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

また、 `+ 127.0.0.1:9000 `でサービスにアクセスできるようにするデフォルトのHHVM設定を変更していないことを前提としています。 この設定は、以下を含むメインのHHVM設定ファイル ` / etc / hhvm / server.ini +`から取得されます。

/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がTCPポート9000でリッスンすることを決定する変数 `+ hhvm.server.port +`に気付くかもしれません。 さらに、特に指定がない限り、デフォルトでローカルホストでリッスンします。

HHVMは高負荷の環境で考慮されるため、最初に行うことができる構成変更は、HHVMがTCPポートではなくソケットをリッスンするようにすることです。 したがって、NginxとHHVMの間の通信に必要なCPUとメモリは少なくなります。

ソケットでリッスンするようにHHVMを設定するには、 `+ vim `などを使用して、お気に入りのエディターでファイル ` / etc / hhvm / server.ini +`を開きます。

sudo vim /etc/hhvm/server.ini

次に、「+ hhvm.server.port +」で始まる行を削除し、その場所に次の行を追加します。

/etc/hhvm/server.ini

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

構成ファイルを保存し、次のコマンドを使用してHHVMを再起動します。

sudo service hhvm restart

次に、Nginxにこの変更を認識させる必要があります。 この目的のために、編集のためにファイル `+ / etc / nginx / hhvm.conf +`を開きます:

sudo vim /etc/nginx/hhvm.conf

このファイルでは、 `+ fastcgi_pass +`ディレクティブがHHVMソケットを指し、次のようになっていることを確認してください。

fastcgi_pass ;

この変更を有効にするには、Nginxも再起動する必要があります。 このためには、次のコマンドを使用します。

sudo service nginx restart

スクリプト `+ / usr / share / hhvm / install_fastcgi.sh `は時間を節約できますが、特にNginxサーバーブロックに関しては、手動で調整する必要があるものがあります。 たとえば、デフォルトのサーバーブロック設定は、ディレクトリリストが禁止されている間は、インデックスファイルとして ` index.html `および ` index.htm `ファイルのみとして開きます。 これは確実に変更し、インデックスファイルとして ` index.php`ファイルを含める必要があることの1つです。 これを行うには、お気に入りのエディターでデフォルトのサーバーブロックの構成ファイルを再度開きます。

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

次に、「+ server 」部分に移動し、インデックスのある行に「 index.php +」を追加して、次のようにします。

/ etc / nginx / sites-enabled / default

index index.html index.htm index.php;

この設定を有効にするには、Nginxを再起動します。

sudo service nginx restart

HHVMのテストと調整

実行できる最初のテストは、PHPコマンドラインインターフェース(cli)の `+ / usr / bin / php `で、これは ` / etc / alternatives / php `を指します。これは、HHVMバイナリ ` / 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

HHVMの前にPHPをインストールしていた場合、古いPHPからの出力が表示される場合があります。 これを変更し、HHVMを指すようにするには、次のコマンドを実行します。

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

次に、よく知られている + phpinfo()+`関数を使用して、HHVMの設定とオプションを確認できます。 この目的のために、デフォルトのドキュメントルート-+ / usr / share / nginx / html`内にお気に入りのエディターで` + info.php`という新しいファイルを作成します。

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

新しいファイルには以下を含める必要があります。

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

<?php
phpinfo();
?>

すべてのNginx WebファイルがNginxユーザーの `+ www-data `によって所有されていることを確認することは常に良い習慣です。 次のコマンドで、このファイルの所有権を「 www-data」に変更します。

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

次に、DropletのIPでこのファイルにアクセスしてみてください。 ブラウザに配置するURLは、「+ http:///info.php+」のようになります。

ブラウザの結果は次のようになります。

image:https://assets.digitalocean.com/articles/HHVM_ubuntu1404/HHVMinfo.png [HHVMのPHP情報]

同様のページが表示されない場合は、まず前提条件のインストール手順に正しく従っていることを確認してください。 次に、Nginx( + / var / log / nginx / error.log +)およびHHVM( + / var / log / hhvm / error.log +)のエラーログでエラーを探します。

ブラウザに戻ると、このページは通常のPHPで `+ phpinfo()`によって生成されたページに似ていることに気付くかもしれません。 実際、変数の大部分は、接頭辞 ` hhvm。+`で始まるHHVM固有の変数を除いて、通常のPHPの変数と同じです。

変数を調べる際に、「+ memory limit +」は17179869184バイトに等しく、17 GBを少し超えていることに注意してください。 このような高いメモリリソース制限により、数GBのRAMを持つDropletが確実に強制終了され、応答しなくなります。 この値をドロップレットの使用可能なRAMよりも低い値に減らして、ドロップレット上の他のサービスがRAM不足に悩まされないようにする必要があります。

一般的な例として、Dropletに2GBのRAMが搭載されている場合、約1.2GBをHHVM専用にすると安全です。 これを実現するには、お気に入りのエディター( + sudo vim / etc / hhvm / php.ini +)でファイル `+ / etc / hhvm / php.ini `を編集し、 `;の後に新しい変数を追加します。 php options + `セクション:

/etc/hhvm/php.ini

memory_limit =

同様に、PHPの設定と変数を必要に応じて変更できます。 次のコマンドを使用して変更を加えるたびに、HHVMを再起動してください。

sudo service hhvm restart

次に、一般的なWebアプリケーションを使用して、より複雑なテストを実行できます。 HHVMは、通常のPHPや一般的なすべてのPHPフレームワークと100%互換性がないことを知っておくことが重要です。 この記事の執筆中に行ったテストでは、WordPressなどの多くのPHP Webアプリケーションが正常に動作するように見えることが示されました。 ただし、公式には、http://hhvm.com/frameworks/ [サポートされているフレームワーク]の数は制限されています。

完全なフレームワーク/ Webアプリケーションでテストする場合、HHVM固有の考慮事項はありません。 インストールおよび操作手順は、通常のLEMPスタックの場合と同じである必要があります。 これは、デフォルトで、HHVMがすべてのほとんどのPHPモジュールにバンドルされており、優れた互換性を提供しているためです。

それでも、まれに、HHVM用の追加モジュールをインストールする必要がある場合があります。 たとえば、PostgreSQLをデータベースサーバーとして使用する場合、 `+ pgsql`モジュールが必要になります。 そのような場合は、 `+ pgsql +`の場合のようにサードパーティのリソースに転送される場合でも、最初にhttp://docs.hhvm.com/manual/en/index.php[HHVMの公式ドキュメント]を参照してください。

結論

この記事で示したように、HHVMは簡単にインストール、構成、およびNginxと統合できます。 十分なリソースがある場合は、ぜひ試してみて、HHVMのユニークなJITコンパイラがパフォーマンスと安定性の点でどのように機能するかを確認してください。 複雑な機能と比類のないトラフィックを持つFacebookのようなサイトがそれを信頼するのには、正当な理由がなければなりません。 ただし、トラフィックの少ない小規模なサイトの場合は、PHP-FPMなどのメモリフットプリントの低いソリューションの方が適している場合があります。