前書き
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などのメモリフットプリントの低いソリューションの方が適している場合があります。