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
コメント