ブログが遅い?!サーバの設定を見直してWordPressを軽量化する

2020年2月21日システムWordPress

ブログが遅い?!サーバの設定を見直してWordPressを軽量化する
ブログが遅い?!サーバの設定を見直してWordPressを軽量化する

どうも、UT(@ut_1029)です。

WordPressでブログを開設して記事数が多くなってくると「ページの表示速度が遅い」などが起こってきます。今回はWordPressを軽量化する手順について紹介します。ぜひご覧ください。

今回のWordPressの軽量化については「とにかく速いWordPress」を参考にしました。

軽量化の作業

  • PHPアクセラレータOPcacheAPCuを導入
  • MariaDBクエリキャッシュを有効化
  • gzip圧縮を有効化
  • ブラウザキャッシュを有効化
  • HHVMを導入
  • Nginxを導入
  • 翻訳アクセラレータを導入

WordPressの軽量化についていろいろな方法を紹介します。Webページの表示速度が遅いと読者や訪問者のストレスに繋がり、閲覧ユーザ数などの低下につながります。

WordPressの軽量化についての情報は、Webサイトを運用する際に利用できる技術となっているので、ぜひ理解し実践するとスキルアップにつながると思います。

サーバについての知識がない人は難しい手順が多いと思いますが、ぜひ導入を考えてみて下さい。

PHPアクセラレータ導入でWebサイト軽量化

PHPをチューニングしてWordPressのブログWebサイトの軽量化を行います。

OPcacheを導入

PHPアクセラレータは、バイトコードをキャッシュして高速化を実現しています。
PHPは、PHPソースコードを一度バイトコードに変換してPHP仮想マシンバイトコードを実行しています。 なので、PHPソースコードバイトコードへ変換する処理を省くことが出来るっということです。

OPcacheは、peclコマンドを使用してインストールします。
※バージョンについては、「https://pecl.php.net/package/ZendOpcache」を参照。

$ sudo pecl install zendopcache-7.0.5

設定ファイルは、「apc.ini」とします。
→/etc/php.d/apc.ini

[opcache]
zend_extension = /usr/lib64/php/modules/opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.blacklist_filename = /etc/php.d/opcache*.blacklist

KVSのAPCuを導入

APCuは、peclコマンドを使用してインストールします。
※バージョンについては、「https://pecl.php.net/package/APCu」を参照。

$ sudo pecl install apcu-4.0.10

設定ファイルは、「apc.ini」とします。
→/etc/php.d/apc.ini

[apcu]
extension = apcu.so
apc.enabled = 1
apc.enable_cli = 1
apc.shm_size = 64M
apc.mmap_file_mask = /tmp/apc.XXXXXX

MariaDBを設定してWebサイト軽量化

MariaDBをチューニングして、WordPressのブログWebサイトの軽量化を行います。

MariaDBでクエリキャッシュを有効化

クエリキャッシュとは、一度発行された参照系クエリ(SELECT文)の実行結果をメモリ上にキャッシュし、同じクエリが発行された時にキャッシュの結果を利用します。それにより、データベースの実行負荷を軽減したり、結果のレスポンス向上を行うことが出来ます。

データの更新時にメモリ上のキャッシュを破棄するので、実行結果がおかしくなることはありません。

MariaDBの設定でクエリキャッシュを有効にします。

[mysqld]
innodb_buffer_pool_size = 512M
query_cache_size = 64M

innodb_buffer_pool_sizeは、InnoDBのデータやインデックスをキャッシュするために必要なメモリ領域のサイズです。
※CentOS7のMariaDB5.5では、デフォルトが128MBとなっています。

設定する値の基準としては、

  • innodb_buffer_pool_size
    • データベースサイズの最大値の120%以上
  • query_cache_size
    • データベースサイズの最大値の10%以上

が目安です。

ここでは、データベースサイズの最大値を400MBとしています。よって、「innodb_buffer_pool_sizeを512MB」で「query_cache_sizeを64MB」に設定します。

Webサーバを設定してWebサイト軽量化

Webサーバをチューニングして、WordPressのブログWebサイトを軽量化します。

gzip圧縮を有効化

gzip圧縮とは、WebサーバがブラウザへHTTPレスポンスするHTMLやCSSなどのファイルをgzip圧縮して送信するようにします。

gzip圧縮でテキストファイルだと、4分の1ほどのサイズまで圧縮することが出来ます。それによりHTTP通信時の転送量を減らすことが出来るので通信時間を短縮されます。

Apacheの設定ファイルを変更します。
→/etc/httpd/conf/httpd.confの末尾

# gzip setting
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE text/javascript application/x-javascript application/javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

適用するとレスポンスヘッダのContent-Encodingフィールドが「gzip」となっていることが確認できます。
→Chromeだと、デベロッパーツールのNetworkタブで確認できます。

ブラウザキャッシュを利用

ブラウザキャッシュを利用するようHTTPレスポンスヘッダの"Expireフィールド“と"Cache-Controlフィールド“を設定します。

今回の設定では、「MIME Typeがtext/htmlの場合は10秒、その他の場合は600秒」と指定します。

Apacheの設定ファイルを変更します。
→/etc/httpd/conf/httpd.confの末尾

# expire setting
ExpiresActive On
ExpiresDefault "access plus 600 seconds"
ExpiresByType text/html "access plus 10 seconds"

PHPをHHVMへ切り替えてWebサイト軽量化

PHPHHVMにして、WordPressのブログWebサイトを軽量化します。

HHVMを導入する

HHVMとは、HipHop Virtual Machineの略です。

HHVMは、米フェイスブックが開発したPHP互換の実行環境(JITコンパイラ)です。特徴としては、PHPのコードをJITコンパイルし高速で動作させることが出来ます。
※JITは、Just In Timeの略です。

HHVMについて詳しくは、「速すぎて笑った!HHVMでWordPressを爆速化してPHP 7と比較してみたら…」を参照すると理解が深まります。

HHVMは、PHPと完全な互換性があるわけではないそうです。なので、テーマやプラグインによっては動作が保証されない場合があります。

HHVMのインストールに必要なパッケージを先にそろえます。

$ sudo yum update -y
$ sudo yum install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc,numactl}-devel \ {ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel \ lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel \ {unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel \ glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel \ mariadb mariadb-server {fribidi,libc-client}-devel make -y
$ sudo yum install inotify-tools -y

続いてHHVM 3.12をインストールします。

$ sudo rpm -Uvh http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.12.0-1.el7.centos.x86_64.rpm

インストールを確認するためにHHVMのバージョンを表示します。

$ hhvm --version
HipHop VM 3.12.0 (rel)
Compiler: tags/HHVM-3.12.0-0-g440e6a096b2db8a449b9690a72f2f1792530e86a
Repo schema: 033b8dedf4af99b892f2488b103a8d67a58ff816

systemdとHHVMの設定ファイルの一部を修正します。HHVMの待ち受けのポート番号を、9001番から「9000番」に変更し、タイムゾーンを設定します。
※これは環境にもよる作業です。

$ sudo cp -p /usr/lib/systemd/system/hhvm.service /etc/systemd/system/
[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)
[Service]
ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi
[Install]
WantedBy=multi-user.target
/etc/systemd/system/hhvm.service

修正が済んだら、修正後のserviceファイルをsystemdに認識させます。

$ sudo systemctl daemon-reload

HHVMの設定ファイルを修正します。
→/etc/hhvm/server.iniを以下のように修正します。

; php options
;pid = /var/log/hhvm/pid
; hhvm specific 
hhvm.pid_file = "/var/log/hhvm/pid"
hhvm.server.port = 9000
hhvm.server.type = fastcgi
(略)
[date]
date.timezone = UTC
default_socket_timeout = 120
memory_limit = 256M

PHP7を停止して、HHVMを有効化します。

$ sudo systemctl disable php-fpm
$ sudo systemctl stop php-fpm
$ sudo systemctl enable hhvm
$ sudo systemctl start hhvm

WebサーバをNginxにしてWebサイト軽量化

Nginxを導入

Nginxは、ApacheのようなWebサーバとして利用されています。リバースプロキシキャッシュやFastCGIキャッシュなどのキャッシュ機能が充実していることが特徴です。

Nginxをインストールして、バージョンを確認します。

$ sudo yum install nginx
$ nginx -V
nginx version: nginx/1.9.13
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
(略)

WebサーバApacheからNginxに切り替えます。

$ sudo systemctl disable httpd
$ sudo systemctl stop httpd
$ sudo systemctl enable nginx
$ sudo systemctl start nginx

ブラウザでNginxのウエルカム画面が表示されることを確認します。

WordPressを動作させられるように設定を行っていきます。
→/etc/nginx/nginx.confを修正します。

(略)
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    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;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  3;
    gzip  on;
    server_names_hash_bucket_size 128;
    include /etc/nginx/conf.d/*.conf;
}
  • keepalive_timeout
    • キープアライブの秒数の調整
  • gzip
    • onにしてgizp圧縮の有効化
  • server_names_hash_bucket_size
    • バーチャルホストで設定するホスト名が長い場合でも問題がないように

WordPressを動作させるバーチャルホストの設定も行います。
→/etc/nginx/conf.d/http.confとして保存します。※server_nameは、自身のホスト名

server {
        listen 80;
        server_name ec2-xxx.xxx.compute.amazonaws.com;
        root  /var/www/html;
        index index.php index.html index.htm;            
        location / {
                try_files $uri $uri/ /index.php?$args;
        }
        location ~* /\. {
                deny all;
        }
        location ~ [^/]\.php(/|$) {
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                                return 404;
                }
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

WordPressを設定してWebサイト軽量化

WordPressの設定を変更して、WordPressのブログを軽量化します。

翻訳アクセラレータを導入

WordPressは、原文の英語をアクセスごとに、リアルタイムに翻訳処理を行っています。日本語も翻訳をアクセス毎に行っています。

翻訳アクセラレータは、一度翻訳した内容をキャッシュすることで高速化を行います。

今回はプラグインの「001 Prime Strategy Translate Accelerator」を導入します。

プラグインをダウンロードします。

$ cd /var/www/html/wp-content/plugins
$ wget https://downloads.wordpress.org/plugin/001-prime-strategy-translate-accelerator.1.1.0.zip
$ unzip 001-prime-strategy-translate-accelerator.1.1.0.zip

ブラウザでWordPressの管理画面にログインして、プラグインを有効化します。

各設定項目を以下のように設定します。

  • キャッシュを有効にする
    • チェックを入れる
  • キャッシュタイプ
    • APCを選択
  • サイトに表示される翻訳された文章
  • ログイン/サインアップ画面の翻訳
  • 管理画面の翻訳
    • キャッシュを使用を選択

まとめ

今回はWordPressを軽量化する方法について紹介しました。この軽量化の方法については、WordPress以外のWebサイトを運用する際に使うことが出来るスキルです。
→より詳しいWordPressの軽量化については「とにかく速いWordPress」をぜひご覧ください。

ぜひこの機会に理解し、実践することをおススメします。

ちなみに自分は、WebサーバNginxにして、gzip圧縮を使用するように実践しました。

UT
UTの日常

当ブログ(UTの日常)を運営しているUTは「プログラミング関係の仕事をしている30代1児の父親」です。詳しくは「UTのプロフィール」をご覧ください。

2020年2月21日システムWordPress