さくらのVPSの512Mプランで、HHVMを使ってWordPressをできるだけ安定するように動かしてみた。

WordPressの表示高速化によく利用されるHHVMですが、安定稼働させるにはある程度のメモリ容量が必要になります。使いたいのはやまやまですが、このブログのようにあんまりPVが多くない場合、メモリが多いサーバを使うのはもったいない気がします。
というわけで、さくらのVPSの512MプランでHHVMを利用するために試行錯誤してみました。

この記事は「WordPress Advent Calendar 2015に参加したかった人達の Advent Calendar 2015」の12/12のエントリーです。

 

まずはHHVMとNginxをインストール

CentOS7にHHVMとNginxをインストールします。インストールの方法は割愛。いろんなブログエントリーがあると思うので検索してみてください。yumでインストールできるようにするサードパーティのレポジトリもあるので、それを利用するのが楽かなー。

ここで、NginxとHHVMで動かしてみたわけですが、メモリ周りの調整がシビアでよく落ちる(´・ω・`)
いろいろ試したら、管理画面での操作の処理で落ちることが多い感じでした。

 

代替策を考える

動くことは確認できたので、安定性を確保したい。せめて月1メンテくらいで済むようにできれば使えるかなと。
管理画面での処理をなんとかすれば、表示閲覧はHHVMの恩恵を受けられるわけなので代替策を考えました。

で、思いついたのが管理画面をphp-fpmで処理させ、サイト表示部分だけをHHVMで処理するという方法。というわけで、試してみました。

 

設定してみる

設定ファイルの一部を掲載しますが、これだけじゃ動かないのでいろいろやってみてくださいね(ΦωΦ)

user    nginx nginx;
pid /run/nginx.pid;

worker_processes    auto;
worker_rlimit_nofile    100000;

events {
    worker_connections  1024;
    multi_accept        on;
    use         epoll;
}

http {
    server_tokens       off;
    sendfile        off;
#       tcp_nopush      on;
#       tcp_nodelay     on;

    log_format      main    '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log      /var/log/nginx/access.log   main;
    error_log       /var/log/nginx/error.log    warn;

    keepalive_timeout           300;
    client_header_timeout       300;
    client_body_timeout     300;
    reset_timedout_connection   on;
    send_timeout            300;
    client_max_body_size        64m;

    default_type    text/html;
    charset     UTF-8;
    index       index.php index.html index.htm;

    include     mime.types;
    include     proxy.conf;
    include     sites-enabled/*;

    upstream hhvm {
        server 127.0.0.1:9000;
    }

    upstream backend {
        server 127.0.0.1:8000;
    }
    
    upstream php {
        server 127.0.0.1:9001;
    }

    upstream admin {
        server 127.0.0.1:8001;
    }
}
server {
    listen      80;
    server_name example.com;
    root        /var/www;
    include         conf.d/wp-proxy.conf;
}

server {
    listen      8000;
    server_name example.com;
    root        /var/www;
    
    include     conf.d/restrictions.conf;
    include     conf.d/wp-hhvm.conf;
}

server {
        listen          8001;
        server_name     example.com;
        root            /var/www;

        include         conf.d/restrictions.conf;
        include         conf.d/wp-php.conf;
}

 

まず、プロキシで/wp-adminへのアクセスをポート8001に、それ以外をポート8000に流すように設定。
hhvmはfastcgiモードで動かし、ポート8000の方のアクセスの場合に利用するように設定。
php-fpmはポート8001のアクセスの場合に利用するように設定。

あとは、それぞれがNginxで安定して動くようにメモリ周りの設定を適宜変更すればOK。とりあえず動くようになりました。記事公開時はこの構成で動いてますよ(・∀・)

 

まとめ

まぁはっきり言っておすすめはしません。

これでもたまに落ちるので、安定稼働させたい場合はメモリ多いサーバにするか、別の構成を考えましょう。最近PHP7もリリースされましたしー。
データベースの方の最適化も行えばもっと早くなるかなとは思うので、もうちっと手を入れてみようかなと思います。先にPHP7にしてしまうかもしれませんがー( ˘ω˘)

こんなこともできるという一例として記憶の片隅にでもおいておいていただければいいかなーと思います。
では、ヾ(・д・。)マタネー♪

この記事を書いた人

たぬき@首席技監

アーシタンと蔵守の技術周り担当。主にワードプレス(WordPress)、サーバ管理なんかをやっています。