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バージョンでも同様ですが、コマンドと構成ファイルの場所が異なる場合があります。
このチュートリアルでは、次のものが必要になります。
- 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公開鍵をインポートする必要があります。
- 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のキャッシュを更新することで実行できます。
- sudo apt-get update
最後に、次のコマンドを使用してHHVMをインストールできます。
- sudo apt-get install hhvm
上記のコマンドは、HHVMをインストールし、初めて起動します。 ドロップレットを使用してHHVMが自動的に開始および停止するようにするには、次のコマンドを使用して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構成を次の構成に手動で置き換える必要があります。
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
から取得されます。
; 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
で始まる行を削除し、その場所に次の行を追加します。
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 unix:/var/run/hhvm/hhvm.sock;
この変更を有効にするには、Nginxも再起動する必要があります。 この目的のために、次のコマンドを使用します。
- 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
を追加して、次のようにします。
index index.html index.htm index.php;
この設定を有効にするには、Nginxを再起動します。
- sudo service nginx restart
HHVMのテストと調整
実行できる最初のテストは、/etc/alternatives/php
を指すPHPコマンドラインインターフェイス(cli)/usr/bin/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の設定とオプションを確認できます。 この目的のために、デフォルトのドキュメントルート内にinfo.php
という新しいファイルを作成します—お気に入りのエディタで/usr/share/nginx/html
。
- sudo vim /usr/share/nginx/html/info.php
新しいファイルには次のものが含まれている必要があります。
<?php
phpinfo();
?>
すべてのNginxWebファイルがNginxユーザーwww-data
によって所有されていることを確認することは常に良い習慣です。 したがって、次のコマンドを使用して、このファイルの所有権をwww-data
に変更します。
- 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
セクションの後に新しい変数を追加します。
memory_limit = 1200M
同様の方法で、PHPの設定と変数をニーズや好みに合わせて変更できます。 次のコマンドを使用して変更するたびに、必ずHHVMを再起動してください。
- 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などのメモリフットプリントの低いソリューションが依然として適切な選択肢であることがわかります。