HHVM を導入して、PHP実行環境を高速化する

FreeNAS サーバー
スポンサーリンク

HHVM を導入して、PHP実行環境を高速化する

前回セットアップした、http2が動く、サーバーに

Brotliを導入してパフォーマンスチューニングを試みました。

しかしまだまだパフォーマンス向上の余地があります。では次はどこへ着手すれば良いか。

PHP実行環境を、PHP-FPMからHHVM に変更する

最初の記事で、PHP実行環境にPHP-FPMを採用しましたが、さらに動作が軽量なHHVMを導入します。

HHVMとは

Facebookが開発した、C++で実装されたPHP実行環境(JITコンパイラ)です。正式名称をHipHop Virtual Machineと言います。

HHVMのインストール

事前準備

まずは、事前に必要なパッケージを導入します。

rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
yum -y install cmake psmisc binutils-devel boost-devel jemalloc-devel numactl-devel
yum -y install ImageMagick-devel sqlite-devel tbb-devel bzip2-devel openldap-devel
yum -y install readline-devel elfutils-libelf-devel gmp-devel lz4-devel pcre-devel
yum -y install libxslt-devel libevent-devel libyaml-devel libvpx-devel libpng-devel
yum -y install libzip-devel libicu-devel libmcrypt-devel libmemcached-devel libcap-devel
yum -y install libdwarf-devel unixODBC-devel expat-devel libedit-devel libcurl-devel
yum -y install libxml2-devel libxslt-devel glog-devel oniguruma-devel ocaml gperf
yum -y install encalibjpeg-turbo-devel zeromq-devel

HHVMのインストール

yum install -y http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.15.3-1.el7.centos.x86_64.rpm

HHVMの設定

HHVMのインストールが完了したら、次はHHVMの設定を行います。

vim /etc/hhvm/server.ini

以下の項目を例のように編集します。

hhvm.server.request_timeout_seconds = 300
date.timezone = Asia/Tokyo
default_socket_timeout = 300

最後に下記のコマンドを実行して、HHVMを起動します。

systemctl enable hhvm
systemctl start hhvm

/etc/nginx/sites-available/hoge.comを編集

これだけでは、HHVMは動作しません。/etc/nginx/sites-availableの中にある、各ドメイン毎の設定ファイルを編集します。

[aside type=”normal”] 補足
ここでは例として、hoge.comという設定ファイルがあるとして、説明を続けます。 [/aside]

下記コマンドを実行して、hoge.comを編集します。

/etc/nginx/sites-available/hoge.com

location ~ \.php$ {以下の、fastcgi_passを下記の通り変更します。

fastcgi_pass 127.0.0.1:9001;

同じくlocation ~ \.php$ {以下に下記の記述を追記します。

fastcgi_send_timeout    5m;
fastcgi_read_timeout    5m;
fastcgi_connect_timeout 5m;
fastcgi_pass_header     "X-Accel-Expires";
fastcgi_buffer_size     256k;
fastcgi_buffers         800 256k;
fastcgi_busy_buffers_size       256k;
fastcgi_temp_file_write_size    256k;
fastcgi_cache_valid     200 302 7d;
fastcgi_pass_header     "X-Accel-Expires";
fastcgi_pass_header     "X-Accel-Redirect";
fastcgi_pass_header     "X-Accel-Buffering";
fastcgi_pass_header     "X-Accel-Charset";
fastcgi_pass_header     "X-Accel-Limit-Rate";

/etc/nginx/nginx.confの修正

/etc/nginx/nginx.confの中身を以下の通りに書き換えます。

user nginx;
worker_processes        auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 2048;
    multi_accept       on;
    accept_mutex_delay 100ms;
    use                 epoll;
}

http {
    include             mime.types;

    open_file_cache     max=100 inactive=20s;
    access_log          off;

    client_header_timeout 10;
    client_body_timeout 10;
    reset_timedout_connection on;
    send_timeout 10;
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 100;

    server_tokens off;
    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;

    gzip                on;
    gzip_vary           on;
    gzip_proxied        any;
    gzip_http_version   1.1;
    gzip_types          text/plain
                        text/xml
                        text/css
                        application/xml
                        application/xhtml+xml
                        application/rss+xml
                        application/atom_xml
                        application/javascript
                        application/x-javascript
                        application/x-httpd-php;
    gzip_disable        "MSIE [1-6]\.";
    gzip_disable        "Mozilla/4";
    gzip_comp_level     2;
    gzip_buffers        4 8k;
    gzip_min_length     3k;

    output_buffers      1 32k;
    postpone_output     1460;

    fastcgi_cache_path  /usr/local/nginx/cache levels=1:2 keys_zone=wpcache:10m max_size=50M inactive=30m;

    connection_pool_size        256;
    client_header_buffer_size   1k;
    large_client_header_buffers 4 2k;
    request_pool_size           4k;
    if_modified_since           before;
    ignore_invalid_headers      on;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   10;
    types_hash_max_size 2048;
    proxy_cache_path  /var/cache/nginx/cache1 levels=1 keys_zone=cache1:128m;
    proxy_cache cache1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache_valid 200 404 30m;


    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    brotli on;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enable/*;
    include /usr/share/nginx/modules/*;
#    server {
#        listen       80 default_server;
#        listen       [::]:80 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

HHVMとnginxの再起動

設定が完了したら、下記のコマンドを実行してHHVMとnginxを再起動します。

systemctl restart hhvm
systemctl restart nginx

これでHHVMの導入は完了です。

まとめ

これで更にサーバーのパフォーマンス向上ができました。
しょぼんブログでは、キャッシュ無しの状態でのトップページ表示にかかる時間は1.46秒、2回目以降の表示にかかる時間は1.20秒ほどに改善されました。

これでだいぶパフォーマンスの向上を実現できました。これ以上はサーバーの設定等で、パフォーマンスチューニングすることはちょっと難しいかも知れませんね・・・

Source: HHVM

コメント

タイトルとURLをコピーしました