WordPressをHTTP/2+PHP7.0に移行した@ConoHa

はてなから移行して3ヶ月位ですがサーバー移したので書いておきます。

経緯

ネットオウルのミニバード(月250円!)でWordPressを動かしていました。
激安なレンサバの割には結構まともでいい感じだったのですが、4サイトほど詰め込んだあたりでデータベースが遅いのかレスポンスが急激に落ちてしまいました。

PHP7が速いとかSSL対応した方がいいとかいろいろ聞くので思い切って全部やってみました。

VPS

1GBのVPSで絞りこみました。お名前、さくら、GMOクラウド、ConoHaくらいが候補に上がると思います。

GMOクラウドはコンパネがクソすぎ、さくらはSSDが30GB&日割り不可、お名前はHDD、ということでConoHaです。

ぶっちゃけ美雲このはが可愛いのでConoHaにしました。(ConoHa選ぶ人は一度は思ってるはず…)
キャプチャ2

ついでに紹介URL置いときます。このリンクから登録すると1000円クーポンもらえるはずです。

構築

ConoHa VPS 1GB
CentOS 7.2(ConoHaで用意されているもの)
諸々の設定は済ませておきます。

nginx

HTTP/2対応のためにnginx1.9.5以降が必要です。公式のリポジトリを使いました。


リポジトリファイルを作っておきます。

# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

一応確認しておきます。

# yum clean all
# yum info --enablerepo=nginx nginx
Available Packages
Name        : nginx
Arch        : x86_64
Epoch       : 1
Version     : 1.9.10
Release     : 1.el7.ngx
Size        : 608 k
Repo        : nginx/x86_64
Summary     : High performance web server
URL         : http://nginx.org/
License     : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
            : a mail proxy server.

あとはそのままインストールして大丈夫です。

# yum install --enablerepo=nginx nginx
PHP7.0

自前でビルドするのは面倒だったのでremiリポジトリを使いました。

$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo rpm -ivh ./remi-release-7.rpm

確認します。

$ ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo  nginx.repo       remi-safe.repo
CentOS-CR.repo         CentOS-Media.repo      epel.repo          remi-php70.repo
CentOS-Debuginfo.repo  CentOS-Sources.repo    epel-testing.repo  remi.repo

インストール。

$ sudo yum --enablerepo=epel,remi,remi-php70 install php70

パスを通しておきます。

$ source /opt/remi/php70/enable
$ php -v
PHP 7.0.2 (cli) (built: Jan  6 2016 15:25:31) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.4.0RC4, Copyright (c) 2002-2016, by Derick Rethans
SSL

巷で話題のLet’s encryptを使いました。
公式とこちらを参考にしました。


実行するといきなり依存関係がインストールされます。注意。

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help
Bootstrapping dependencies for RedHat-based OSes...
usage:
  letsencrypt-auto [SUBCOMMAND] [options] [-d domain] [-d domain] ...
The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates.  By
default, it will attempt to use a webserver both for obtaining and installing
the cert. Major SUBCOMMANDS are:
  (default) run        Obtain & install a cert in your current webserver
  certonly             Obtain cert, but do not install it (aka "auth")
  install              Install a previously obtained cert in a server
  revoke               Revoke a previously obtained certificate
  rollback             Rollback server configuration changes made during install
  config_changes       Show changes made to server config during installation
  plugins              Display information about installed plugins

早速取得します。
-wはnginxのドキュメントルートを、-dはドメインを指定します。
初回実行時にはメールアドレスや利用規約の同意が必要です。

# ./letsencrypt-auto certonly --webroot -w /usr/share/nginx/html -d hoge.hoge.com

キャプチ3ャ
うまくいくと、できたよ!的なものが出ます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/blog.lablus.com/fullchain.pem. Your cert will
   expire on 2016-04-27. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

証明書は/etc/letsencrypt/liveにドメインごとのフォルダに入って置かれます。
nginxの設定はこんな感じでしょうか。

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name  hoge.hoge.com;
    ssl_certificate /etc/letsencrypt/live/hoge.hoge.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hoge.hoge.com/privkey.pem;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;
    root  /usr/share/nginx/html;
    index index.php
    # 以下省略

設定ができたらSSLをチェックしてくれるサービスで確認しておくといいと思います。


みたらスコアがBだったので直しておきたい。

HTTP/2
  • 事実上SSL(TLS)が必要(Chromeだとhttpsの時のみHTTP/2対応)
  • nginxは1.9.5以降が必要

上の設定ファイルに書いてありますがserverのlistenにhttp2を加えるだけです。

Chromeだと、HTTP/2で通信しているかはプラグインで簡単に確認できます。


右端の稲妻が青だとHTTP/2です。
キャプチャ8

WordPress

このままだとWordPressのリンクやら色々が非SSLのままです。プラグインなどで対応できるみたいですが面倒なので一気に書き換えてしまいました。
mysqldumpで簡単にmysqlをダンプできます。

mysqldump -uroot -p -hlocalhost database_name > backup.sql

ダンプしたものに入っているhttp://hoge.hoge.comからhttps://hoge.hoge.comに置換します。

vim backup.sql
:%s;http://hoge.hoge.com;https://hoge.hoge.com;gc

置換済みのダンプをリストアします。

mysql -uroot -p -hlocalhost database_name < backup.sql

あとはjsやcss等がSSLで読み込まれているか確認するだけです(ごちゃ混ぜになっているとアドレスバーが緑になりません)。
ChromeだとDeveloperToolsのコンソールやnetworkタブのfilterでmixed-content:displayedと入力して確認できます。
キャプチャ1

余談ですがプロトコル部を省略して書くとhttp、httpsどちらでも読み込まれます。(知らなかった…)

<script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jquery.ui/1.11.4/jquery-ui.min.js"></script>

最後にnginxでSSLにリダイレクトするようにしました。

server {
    listen 80;
    listen [::]:80;
    server_name  hoge.hoge.com;
    return 301 https://hoge.hoge.com$request_uri;
}

結果

PHPは超簡易的にWordPressのクエリの実行速度を見てみました。
CeltisPackというプラグインを使うとhtmlの最後の方にクエリの実行速度が表示されます。
こんな感じのを書いておいてもいいかもしれません。

<?php echo get_num_queries(); ?> queries. <?php timer_stop(1); ?>

で、10回読み込んで平均しました。両方共ConoHa 1GB、CentOS7.2です。クエリの数が大体40個位。

nginx1.8.1+php5.4.16nginx1.9.10+php7
0.326 sec0.165 sec

管理画面では体感的に速く感じると思います。

HTTP/2の方はよくわかりませんが並列してガンガン読み込まれているのは確認できました。
chrome_2016-01-31_17-27-36

とりあえずキャッシュ使わずに高速化できたので満足です。
ではまた。

WordPressをHTTP/2+PHP7.0に移行した@ConoHa

コメントを残す

メールアドレスが公開されることはありません。