開発者ドキュメント

Ubuntu14.04にNginxを使用してHHVMをインストールする方法

序章

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バージョンでも同様ですが、コマンドと構成ファイルの場所が異なる場合があります。

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

このチュートリアルのすべてのコマンドは、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

また、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を開きます。

  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.htmlおよびindex.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のテストと調整

実行できる最初のテストは、/etc/alternatives/phpを指すPHPコマンドラインインターフェイス(cli)/usr/bin/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)のエラーログでエラーを探します。

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

変数を調べている間、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モジュールが必要になります。 このような場合は、pgsqlの場合など、サードパーティのリソースに転送される場合がありますが、最初にHHVMの公式ドキュメントを参照してください。

結論

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

モバイルバージョンを終了