序章

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

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

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

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

前提条件

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

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

  • 1GB以上のRAMを搭載したUbuntu14.04ドロップレット
  • ルート以外のsudoユーザー( Ubuntu 14.04を使用したサーバーの初期設定を参照)
  • Nginxがインストールされました(記事 Ubuntu 14.04 にLinux、Nginx、MySQL、PHP(LEMP)スタックをインストールする方法のステップ1に従ってください)

このチュートリアルのすべてのコマンドは、root以外のユーザーとして実行する必要があります。 コマンドにrootアクセスが必要な場合は、その前に sudo.

インストール

Ubuntu 14.04には、公式にサポートされているHHVMリポジトリがあります。 このリポジトリを追加するには、次のコマンドを使用してGnuPG公開鍵をインポートする必要があります。

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

その後、次のコマンドを使用してHHVMのリポジトリを安全にインストールできます。

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

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

  1. sudo apt-get update

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

  1. sudo apt-get install hhvm

上記のコマンドは、HHVMをインストールし、初めて起動します。 ドロップレットを使用してHHVMが自動的に開始および停止するようにするには、次のコマンドを使用してHHVMをデフォルトのランレベルに追加します。

  1. sudo update-rc.d hhvm defaults

構成

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

  1. 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を再起動する必要があります。

  1. sudo service nginx restart

また、サービスにアクセスできるようにするデフォルトのHHVM構成を変更していないことも前提としています。 127.0.0.1:9000. この設定は、メインの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.server.port これは、HHVMがTCPポート9000でリッスンすることを決定します。 さらに、特に指定がない限り、デフォルトでローカルホストでリッスンします。

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

ソケットでリッスンするようにHHVMを構成するには、ファイルを開きます /etc/hhvm/server.ini などのお気に入りのエディタで vim:

  1. sudo vim /etc/hhvm/server.ini

次に、で始まる行を削除します hhvm.server.port、およびその代わりに次のものを追加します。

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

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

  1. sudo service hhvm restart

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

  1. sudo vim /etc/nginx/hhvm.conf

このファイルで、 fastcgi_pass ディレクティブはHHVMソケットを指し、次のようになります。

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

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

  1. sudo service nginx restart

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

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

次に、 server 分割して追加 index.php インデックスのある行で、次のようになります。

/ etc / nginx / sites-enabled / default
index index.html index.htm index.php;

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

  1. sudo service nginx restart

HHVMのテストと調整

実行できる最初のテストは、PHPコマンドラインインターフェイス(cli)を使用することです。 /usr/bin/php これは /etc/alternatives/php、これは用語でHHVMバイナリを指します /usr/bin/hhvm.

  1. /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を指すようにするには、次のコマンドを実行します。

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

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

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

新しいファイルには次のものが含まれている必要があります。

/usr/share/nginx/html/info.php
<?php
phpinfo();
?>

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

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

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

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

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

ブラウザに戻ると、このページがによって作成されたページに似ていることに気付くかもしれません。 phpinfo() 通常のPHPで。 実際、ほとんどの変数は、HHVM固有の変数を除いて、通常のPHPの変数と同じです。 hhvm. プレフィックス。

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

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

/etc/hhvm/php.ini
memory_limit = 1200M

同様の方法で、PHPの設定と変数をニーズや好みに合わせて変更できます。 次のコマンドを使用して変更するたびに、必ずHHVMを再起動してください。

  1. sudo service hhvm restart

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

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

それでも、ごくまれに、HHVM用に追加のモジュールをインストールする必要がある場合があります。 たとえば、PostreSQLをデータベースサーバーとして使用する場合は、 pgsql モジュール。 このような場合は、最初にHHVMの公式ドキュメントを参照してください。 pgsql.

結論

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