AWS + KUSANAGIのHTTPS環境にブログを移行した手順
※本ページはプロモーションが含まれていますこのブログのPV増加に伴い、サーバ移転を検討していました。
サーバは、急なアクセス増加にもプランを変更することでサーバの処理能力を上げて手軽に対応できるAWS(Amazon Web Service)に決定し、ついでにHTTPSに対応しようといろいろな方法を模索しました。
HTTPSについてはこちらの記事で:「ブロガーのためのHTTPS(SSL証明書)入門 」
一からサーバを設定したり、AWSで簡単にWordPress環境が作れるAMIMOTOを検討しましたが、自分でサーバを設定するのは初期設定もメンテナンスも面倒臭いし、AMIMOTOは簡単で便利でしたが価格がネックになり導入をためらっていました。
関連:「AWSとAMIMOTOでHTTP/2対応の高速WordPress環境を構築する方法。もちろんhttps対応」
そんな中、AWSを含む各種クラウドサーバで高速で動作するWordPress環境を簡単に構築できる「KUSANAGI」が、無料SSL証明を発行してくれる「Let's Encrypt」に対応し、HTTP/2とHTTPSの環境が簡単に作れるアップデートを行ったという情報を目にしました。
関連:「KUSANAGI バージョンアップ情報 7.8 | KUSANAGI」
KUSANAGIの使用料は無料で、基本的にAWSの料金しかかかりません。そしてAWSは「t2.micro」というインスタンスなら1年間無料で使うことができます。(月間30万PVのこのブログを動かしても性能の半分も使っていないので、PVがもう少し増えても無料枠でがんばれそうです。)
まだ稼働していない新しブログを構築するなら比較的簡単にできましたが、移転となるとかなり苦労しました。
そこで僕が実際に行った手順を紹介します。
ブログを最初からはじめる場合はこちらの記事が参考になります。
関連:「AWS + KUSANAGIでHTTPSに対応した新規のWordPressブログを設定する方法 | 経験知」
※KUSANAGI7.8での移行手順です。環境によって手順や方法が変わってくる可能性もあるので移行の際は自己責任でお願いします。
また、コマンドラインの知識やviがある程度使える必要があります。
前提条件
通常のブログの移転なら、現状のブログを動かしたまま新しいサーバにWordPressをインストールし、既存のブログのバックアップ等からブログ環境を再構築し、実際に動かして問題がなければDNSの変更をして移行完了という形になると思います。
このようにすればブログを止めること無く移行できるはずです。
しかし、KUSANAGIでHTTPSを設定するには、プロビジョニング(WordPressを構築する)段階で、新しいサーバに既存のドメインでアクセスできるようになっている必要があります。これはLet's EncryptからSSL証明書を取得するのに必要で、新しいサーバにブログのドメインでアクセス出来ないとSSL証明書が取得できず、設定がうまく行きません。
HTTPで稼働して後からLet's Encryptを使ったSSL証明書取得ができればよいのですが、2016年2月現在の時点ではできなさそうです。
なので、先にDNSを設定し、新しいサーバにアクセスできるようになってからプロビジョニングを行いました。そのため一時的にNginxのWelcome画面やWordPressのインストール画面が表示される時間ができてしまうので、KUSANAGIの設定ができたらソッコーでメンテナンス画面にします。
作業はアクセス数が一番少ない早朝3時から行いました。
KUSANAGIがWordPress設定後にLet's Encryptの設定ができるようになればスムーズに移行できるはずなので、それを待つのも良いと思います。
バックアップの作成
現行のブログのバックアップを全て取るために「BackWPup」を使ってバックアップファイルを作成する。
AWSアカウント作成
AWSのアカウントを持っていない場合は「AWS アカウント作成の流れとポイント」に従いアカウントを作成し、AWSへログインする。
KUSANAGIのインスタンスの作成
AWSにログインし、「EC2」をクリック。
左メニューの「インスタンス」をクリックし、「インスタンスの作成」をクリック。
「AWS Marketplace」をクリックし、検索窓に「kusanagi」と入力してEnter。
検索結果にKUSANAGIが表示されるので「選択」をクリック。
無料利用枠の「t2.micro」を選択し、「確認と作成」をクリック。
確認画面が出るので、内容を確認しOKなら「作成」をクリック。
キーペアの作成画面が出るので「新しいキーペアの作成」を選択肢、キーペア名を自分が分かりやすい名前で入れる。ここでは「kusanagi」にした。「キーペアのダウンロード」をクリックし、キーペアをダウンロードする。ダウンロードしたpemファイルはサーバにSSHでログインするのに使うので管理しやすい場所に移動し、削除しないよう気を付ける。再ダウンロードは出来ないので要注意。そのご「インスタンスの作成」をクリック。
数分でインスタンスが作成される。
固定IPアドレスの作成
固定IPを設定する。
「EC2のダッシュボード」にアクセスし、左メニューの「Elastic IP」をクリック。
「新しいアドレスの割当」をクリック。
「関連付ける」をクリック。
新しいアドレスの割り当てが完了。
IPアドレスとインスタンスを紐付ける
次に割り当てられたアドレスをインスタンスと紐付ける。
同画面の「アクション」→「アドレスの関連付け」をクリック。
「インスタンス」をタップすると起動しているインスタンスが表示されるので紐付けたいインスタンスをクリック。「関連付ける」をクリック。
関連付け完了。
自分のドメインを取得したサービスで、割り当てられたIPアドレスをDNSに設定する。
ここからがスピード勝負。DNSが完全に浸透するまで、既存のサーバにアクセスできる人もいれば新しいサーバにアクセスしてしまう人がいるのでなるべく早くメンテナンス画面にする。
SSHでサーバに接続
ターミナルを開き、「$」の後にSSHコマンドを入力する。
キーペアで作成したpemファイルが必要になるのでパスを調べておく。面倒臭い場合はターミナルにドラッグアンドドロップすればフルパスが入力される。
$ chmod 600
と入力し(600の後ろには半角スペース)、pemファイルをドラッグアンドドロップしパスを入力しEnter。
$ chmod 600 /path/to/pem
成功したら特に何も表示されず、入力待ちに戻る。
次に、
$ ssh -i
と入力した後(iの後ろは半角のスペースがある)pemファイルをドラッグアンドドロップ。
パスの後にスペースを開け、「centos@」の後にブログのドメインを入力。
全体像はこのようになる。
$ ssh -i /path/to/pem centos@keikenchi.com
Enterを押し接続開始。
ドメインが浸透して新しいサーバにアクセスできるようになっていないとアクセス出来ないので、エラーが出るようなら暫く待つ。
スマホのテザリング通信にして別のネームサーバからアクセスすると早く繋がる場合があるのでそれも試してみる。
「Are you sure you want to continue connecting (yes/no)? 」と聞かれたら「yes」と入力しEnter。
サーバにログインできる。
KUSANAGIの初期設定
KUSANAGIの初期設定をする。
rootユーザになる。
$ sudo su -
KUSANAGIのバージョンを最新にする。
# yum update -y kusanagi*
モジュールをアップデートする。
# yum update -y
KUSANAGIの初期設定をする。
# kusanagi init
初期設定されるので数粉待つ。
しばらくするとタイムゾーンの設定が表示される。キーボードで「asia/tokyo」と入力するとどんどん選択肢が絞られていくので「Asia/Tokyo」が表示されたらEnter。
キーボドタイプの設定。日本語キーボードなら「2」を入力してEnter。
kusanagiというユーザーが作成されるので、パスワード設定を設定する。このパスワードはSFTPやプラグインのインストールやアップデートに使うのでしっかり控えておく。パスワード入力は表示されないが、ちゃんと入力されているので入力が終わったらEnter。(コピペでも入力できる)
もう一度入力しろと言われるので同じパスワードを入力。(Retype new password: )
鍵認証用の鍵作成を行う。適当なフレーズを入力。このフレーズはSFTPで接続するときに使うので控えておく。
もう一度入力しろと言われるので同じフレーズを入力。(Enter same passphrase again:)
mysqlのrootパスワードを設定する。
こちらも、もう一度同じパスワードを入力。(Re-type MySQL root password.)
kusanagiの初期設定完了。
メンテナンス画面
メンテナンス画面を表示させる設定をする。メンテナンスフォルダを作成し、「do_maintenance」というファイルがあればメンテナンス画面を表示するように設定。
メンテナンスフォルダを作成。
# mkdir /home/kusanagi/maintenance
メンテナンス画面用のHTMLファイル「maintenance.html」を作成
# vi /home/kusanagi/maintenance/maintenance.html
こんな感じで作成する
<!DOCTYPE html> <html> <head> <title>メンテナンス中 | サイト名</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style> body { text-align: center; padding: 150px; } h1 { font-size: 50px; } body { font: 20px color: #333; } article { display: block; text-align: left; width: 650px; margin: 0 auto; } a { color: #dc8100; text-decoration: none; } a:hover { color: #333; text-decoration: none; } </style> </head> <body> <article> <h1>メンテナンス中</h1> <p>只今メンテナンス中です。16時30分には終了します。</p> </article> </body> </html>
後でメンテナンス画面を表示させるためのファイルを作成しておく。
# touch /home/kusanagi/maintenance/do_maintenance
自分のIPを「アクセス情報【使用中のIPアドレス確認】」で調べ、コピペしやすいようにしておく。
wordpressのプロビジョニング
WordPressをインストールする。
「kusanagi provision 」の後に作成したいフォルダ名を指定してEnter。ドメイン名にするとわかりやすい。ここでは「keikenchi」にした。
# kusanagi provision keikenchi
言語設定を聞かれるのでja(日本)の2を入力しEnter。
ドメイン入力。このブログなら「keikenchi.com」
もう一度入力を求められるので同じドメインを入力。(Re-type hostname(fqdn) for your website.)
Let’s Encryptの設定。メールアドレスを登録するだけ。自分が受信できるメールアドレスなら何でも良い。ドメインURLのメールアドレスでなくて大丈夫。
もう一度入力。(Re-type mail address.)
WordPressで使うデータベース名を設定。「wordpress」にすると後でちょっとだけ楽。
もう一度入力する。(Re-type database name you create.)
データベースのユーザー名を設定
データベースユーザーのパスワードを設定する。
もう一度パスワードを入力する。(Re-type password for database user )
プロビジョニング完了。
メンテナンス画面を表示させる
nginxのconfigファイルを開く。「プロビジョニング時の名前_http.conf」になっている。「keikenchi」としたので、「keikenchi_http.conf」になる。
# vi /etc/nginx/conf.d/keikenchi_http.conf
「server」内に下記コードを追加。「自分のIPアドレス」に自分のIPを書く
server { … set $maintenance false; if (-e /home/kusanagi/maintenance/do_maintenance) { set $maintenance true; } if ($uri ~ "^/maintenance/") { set $maintenance false; } if ($remote_addr = 自分のIPアドレス) { set $maintenance false; } error_page 503 /maintenance/maintenance.html; location /maintenance/ { root /home/kusanagi; } if ($maintenance = true) { return 503; } … }
nginxを再起動
# systemctl restart nginx
これで自分のIP以外からのアクセスはメンテナンス画面になる。スマホのLTEなど、別のIPになる回線でアクセスしてみてメンテナンス画面になっていればOK。
緊急のスピード勝負はここまで。ただし、ブログが止まった状態なのは変わらないので、ここからもできるだけ早く進める。
ファイルをアップロード
BackWPupで作成したバックアップファイルを解凍し、SFTPで「wp-content」以下の「plugins」「theme」「uploads」をアップロードする。
ここでのFTPソフトはFillezillaを使った。
自分のパソコン内のkusanagi.pemを同じ場所にコピーし、名前を「kusanagi_user.pem」にする(別名でもOK)。
ファイルをテキストエディタで開き、内容を全て削除し保存する。
ターミナルでサーバに接続し、root権限で
# vi /root/kusanagi.pem
を開き内容をコピーして「kusanagi_user.pem」に貼り付ける。
各行の先頭に行番号やスペースが入っている場合は削除してサーバ上のkusanagi.pemと同じ状態にする。
「kusanagi_user.pem」を使ってターミナルで一度ログインする。
$ ssh -i /Path/to/kusanagi_user.pem kusanagi@keikenchi.com
秘密鍵を作った時のフレーズを入力し、「パスワードをキーチェーンに保存」にチェックを入れ「OK」をクリック。
ログインに成功したらすぐ出て構わない。
$ exit
Fillezillaを開きメニューバーの「FileZilla」→「設定」をクリック。
「SFTP」をクリックし、「Add key file…」をクリック。
ファイル選択画面になるので先ほど作成した「kusanagi_user.pem」を選択し開くをクリック。
はいをクリック。
パスワードを求められるので、カギを作った時に使ったパスワードを入力しOKをクリック。
名前をつけ(ココではkusanagi_user.ppkとした)「Save」をクリック。
ファイルパーミッションの変更。
$ chmod 600 /Path/to/kusanagi_user.ppk
Fillezilla左上のサイトマネージャーをクリックし、「新しいサイト」をクリック。「ホスト」に自分のドメインを入力し、「プロトコル」はSFTP。「ログオンの種類」を「通常」にして「ユーザ」は「kusanagi」。パスワードは初期設定で設定したkusanagiのパスワードを入力し「接続」をクリック。
サーバに接続される。
/home/kusanagi/keikenchi/DocumentRoot
にWordPressがインストールされているので(keikenchi部分はプロビジョニング時の名前)、「wp-content」以下に「plugins」「theme」「uploads」をアップロード。画像が多いと時間がかかる。
その間にWordPressの設定。
WordPressの設定
自分のドメインにアクセスするとWordPressの設定画面が表示されるので通常通り設定する。
phpMyAdminをインストール
データベースの移行にphpMyAdminを使用するのでインストールする。
ターミナルでrootになった状態でDocumentRootに移動。「keikenchi」部分はプロビジョニングの名前。
# cd /home/kusanagi/keikenchi/DocumentRoot
phpMyAdminを取得。「phpMyAdmin」で最新版のバージョンを確認し、バージョン番号部分を書き換えて実行。(作業時は4.5.4.1が最新版だった)
# wget https://files.phpmyadmin.net/phpMyAdmin/4.5.4.1/phpMyAdmin-4.5.4.1-all-languages.zip
解凍
# unzip phpMyAdmin-4.5.4.1-all-languages.zip
リネーム
# mv phpMyAdmin-4.5.4.1-all-languages phpmyadmin
nginxの設定ファイルを開く。「keikenchi」部分はプロビジョニングの名前。
# vi /etc/nginx/conf.d/keikenchi_http.conf
自分のIP以外アクセス出来ないように設定を追加。
server { … location /phpmyadmin { allow 自分のIP; deny all; } … }
nginxを再起動。
# systemctl restart nginx
データベースの設定
元のプログのデータベースを復元する。BackWPupで作成したバックアップ内にある、「ドメイン名.sql」を用意する。
自分のドメイン/phpmyadminにアクセスするとphpMyAdminのログイン画面になるので、WordPressに設定したデータベースのユーザ名とパスワードを入力して「実行」をクリック。
WordPressをインストールしたデータベースをクリック。
「check all」にチェックを入れると全てのテーブルにチェックが入る。「チェックしたものを:」を「削除」にする。
削除の確認画面が出るので「はい」をクリックし、テーブルを全て削除。
画面上部の「インポート」をクリックし、「ファイルを選択」をクリックして「ドメイン名.sql」を選択。
画面下部の「実行」ボタンをクリックして実行。
以上でデータベースの設定完了。
ブログへアクセス
データベースの設定が終わり、SFTPのアップロードが終わったらブログ(http)へアクセスする。(必ずSFTPのアップロードが終わってからアクセスする。)
データベースに変更がある場合は再構築を促されるのでボタンをクリックして再構築。
これでブログが表示される。
まだHTTPでしかアクセス出来ないが、一刻も早くメンテナンス画面を終了させたい場合はHTTPSの対応を飛ばしてメンテナンス画面を終了させても良い。稼働しながらでも対応はできるので。
HTTPSへの対応
KUSANAGIのデフォルトのセキュリティグループではSSL通信をする443ポートが開いていないので、セキュリティグループに追加する。
「EC2のダッシュボード」にアクセスし、左メニューの「セキュリティグループ」をクリック。セキュリティグループの「グループ名」が「KUSANAGI for AWS…」を選択し、「インバウンド」タブをクリックし「編集」をクリック。
「インバウンドルールの編集」が開くので、「ルールの追加」をクリック。新しい行が追加されるので、追加されたタイプをクリックし、「HTTPS」を選択肢保存。
これでセキュリティグループの設定が完了。
ブログ内の画像をhttpからはじまるURLで指定していると、HTTPS通信になった時に画像が表示されなくなる。
Search Regexを使うとデータベースの内を一括で変換できるので楽。ただし、強力なので使うときは慎重に、事前バックアップを忘れずに(今の段階では失敗してもすぐやり直せるので楽)
使い方は「Search Regexプラグイン(記事やコメント内容を一括置換) – WordPressプラグインの一覧」がわかりやすい。
僕は「http://keikenchi.com」を「https://keikenchi.com」に置換えた。
KUSANAGIはプラグインをインストールする際にFTPアカウントを求めてくるので、「ホスト名」を「localhost」、「FTPユーザー名」を「kusanagi」、「FTPパスワード」をkusanagiのパスワードを入力して「開始」をクリック。
これでプラグインがインストールできる。
テーマの画像も「http」表記になっていたら「https」に直す必要がある。
HTTPSのURLでアクセスしちゃんと表示されているか確認する。
メンテナンス画面終了
メンテナンス画面を終了する場合は「do_maintenance」を削除する。
# rm /home/kusanagi/maintenance/do_maintenance
「rm: remove regular empty file ‘/home/kusanagi/maintenance/do_maintenance’?」と聞かれたら「y」を入力してEnter
以上で大まかなHTTPS化は完了。
おわりに
一度サービスを止め、ゴリ押しなところもあるので上記方法はあまりオススメできません。実行する場合は自己責任でお願いします。
ようやくHTTPSに対応でき、HTTP/2通信もできるようになりました。
これらに関してはまだ設定すべきことがあるので別の記事で紹介したいと思います。