春ですね。
春は変化の季節。そして引っ越しの季節。
この度、徒労日記は長らく間借り(というより居候)していた友人のさくらVPSから立退き命令を喰らいました。
そうして検討の末、決めたのはAmazonのコンパクトなVPSサービスLightsail。
その移行の行程を記します。
Amazon Lightsail
引越し先検討
前のさくらVPSはメモリ2Gプランだったようです。3コアで1,580円/月~。なかなか豪華。
自分で設定したnginxでのabはこんな数値。
$ ab -n 1000 -c 100 http://dolls.tokyo/ Concurrency Level: 100 Time taken for tests: 4.757 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 51037000 bytes HTML transferred: 50891000 bytes Requests per second: 210.21 [#/sec] (mean) Time per request: 475.726 [ms] (mean) Time per request: 4.757 [ms] (mean, across all concurrent requests) Transfer rate: 10476.80 [Kbytes/sec] received
210/secと粗末なBlogにはもったいないスペックです。
しかし収益性もない趣味サイトにこんなにお金をかけるのも違和感があります。
そのため自宅仮想マシンサーバも考えました。
でもIPv6化した我が家にてv4のサイトを公開するのにはマルチセッションなどの変化球が必要です。そして何よりNURO乗り換えというWAN側の変化がこれから起きる段階。
それらを加味し、結局自宅鯖はあきらめました。
そうして安価なVPSを探すうち、見つけたのがWordpressの動作保証がされ、コストに優れていたAmazonのVPSサービス Amazon Lightsail | AWS。
月$3.5でオールインワン
LightsailはWordpressセットアップ済みのイメージが用意されており,数分でサイトが公開できるそうです。
サーバスペックはローエンドながら
- CPU:仮想1コア
- メモリ:512MB
- ストレージ:20GB SSD
- IP:静的IPグローバルアドレス1個
とオールインワン。
他のサービスとの契約・連携は必要なく、月額3.5USDのみで使えるため最安の部類です。
コスパはもちろん、自分にとって魅力だったのはこの2点。
- 最小(?)スペックでも検証されているWordpress環境
- Lightsailに対するWordpress運用のナレッジの多さ
自分が見様見真似で作った環境ではなく、世界的ベンダーが提供し運用されているWordpress環境は非常に興味があります。最小スペックで動かさなくてはならない、となればなおのこと。
そしてAWSはもちろん、VPSを借りるのは初めて。多くのナレッジが公開され、そのまま適用できる環境は大きなアドバンテージです。
なおWordpressのイメージはbitnamiスタックにより作られており、設定パスやらIDやらにやたらと”bitnami”という文字列が現れます。
bitnamiと何度も打つ間、ベトナムを思い出すのは私だけではないはず。
先にLightsailのベンチマーク結果
当記事の環境設定を行った後のLightsailの速度はこのようになりました。
httpdはnginxではなく、Apacheです。
$ab -n 1000 -c 100 http://dolls.tokyo/ Concurrency Level: 100 Time taken for tests: 54.027 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 41122000 bytes HTML transferred: 40811000 bytes Requests per second: 18.51 [#/sec] (mean) Time per request: 5402.658 [ms] (mean) Time per request: 54.027 [ms] (mean, across all concurrent requests) Transfer rate: 743.30 [Kbytes/sec] received
18/secとかなり落ちました。それでも、当ページのPVから見れば相応とも言えます。
Lightsailスタートアップ
それでは実際に構築していきます。
まずはAWSのアカウントを作るところからでした・・・そこは割愛。
インスタンスの起動
アカウントでログイン後、AWSマネジメントコンソールからLightsailのスタートページへ。
言語を選んだ後、早速インスタンスの作成が始まります。
「インスタンスロケーション」が東京となっていることを確認し、[Linux]→[Wordpress]と選択。
[OSのみ]から各ディストリのイメージを立ち上げる事も可能。今回は前述のメリットを享受したいため、Wordpressイメージ一択です。
タイムゾーンとプランを選択します。
価格により各リソース他、外部へのデータ転送量も決まります。
拡張したい場合、動的なスケールはできない模様。
一度スナップショットを取り、そのイメージで別のインスタンスを立ち上げることになります。
リソース名は適当に入れます。スペックを装飾文字として入れるのがブームのようです。
タグ等は触らずに、そのまま[インスタンスの作成]を押します。
ネットワークの設定
インスタンスの起動を2,3分待ったら、[ネットワーキング]をセットアップします。
まず[静的IPの作成]を押し、作成インスタンスに割り当てる固定グローバルIPを取得します。
固定IPは1インスタンスにつき1個無料。しかし、長時間割り当てないまま確保しておくと課金されるとのこと。
よくある質問 – Amazon Lightsail | AWS
インスタンスに 1 時間以上アタッチされていない静的 IP に対しては、0.005 USD/時間という少額の料金を課金しています。
次に[DNSゾーンの作成]を押し、Aレコードを作成します。
取得している固定ドメイン名を入力し、[レコードの追加]をクリック。www.などのサブドメインは使用していないため、Aレコードを”@.dolls.tokyo”とし、「解決先」を作成した静的IP定義にします。
SSHキーの取得
コンソールには完成度の高いWebーCLIが提供されています。
でも構築時はおなじみのTeratermを使いたい。
外部ツールでSSH接続するためには、SSHキーをダウンロードします。
Lightsail管理画面の右上、[アカウント]から[アカウント]を選択。[SSHキー]タブにある「東京 (ap-northeast-1)」横の[ダウンロード]を押して.pemファイルをローカルに保存しておきます。
管理パスワードの取得
SSHでコンソールにログイン。
- ID:bitnami
- PASS:パスワードなし。秘密鍵(SSHキー)によるログイン
まずは管理パスワードを取得します。
パスワードはホームディレクトリ直下のファイルに書かれています。
$ cat bitnami_application_password XXXXXXXXXXXXX
アップデート
bitnamiイメージをapt update & apt upgradeで最新化。
Wordpress本体及びプラグインも管理画面から最新化しておきます。
Webアクセス確認
この時点で”http://固定IPアドレス/”をブラウザで開けば、もうオリジナルのWordpressトップページが表示されます。
Wordpress管理画面は”http://固定IPアドレス/wp-login.php”でアクセス。
- ID:user
- PASS:取得した管理パスワード
もし、Wordpressを1から始めるならこれで完了。確かに簡単スピーディー。
さくらVPSからLightsailへのWordpress移行
ここからが本番・・・。
フォルダ構造の検討
提供されるbitnamiイメージのフォルダ構造は私にとって独特に思えました。
|-- home | `-- bitnami | |-- apps -> /opt/bitnami/apps | |-- htdocs -> /opt/bitnami/apache2/htdocs = `-- stack -> /opt/bitnami |-- opt | |-- bitnami | | |-- apps | | | |-- bitnami | | | | `-- banner | | | |-- phpmyadmin | | | | |-- conf | | | | |-- htdocs | | | | `-- licenses | | | `-- wordpress | | | |-- bin | | | |-- conf | | | |-- htdocs | | | |-- licenses = = = `-- tmp
WordPressの本体ファイルは/opt/bitnami/apps/wordpress/htdocsに配置されていて、そこをDocumentRootとして直接公開しています。
$ sudo cat /opt/bitnami/apps/wordpress/conf/httpd-prefix.conf # App url moved to root DocumentRoot "/opt/bitnami/apps/wordpress/htdocs"
自分はMovable typeの時代からホームフォルダ直下にpublic_htmlを置き、そこをDocumentRootとするスタイルを脈々と貫いてきました。CMSの本体はそのサブフォルダとして配置しています。
さくらVPSから丸ごとエクスポートするとWordpress本体も入ってくるため、その構造を貫く事もできます。
でもbitnamiイメージのWordpressにはAMPなどのプラグインもセットされておりそれも試してみたい・・・。
そうして何度かインスタンスを作り直して試した結果、これまでのフォルダ構造を諦めることにしました。
bitnamiイメージの構造を正とし、配下のhtdocsにコンテンツを移行します。
Wordpress本体もそのまま使い、データベースも流用します。
エクスポートとインポート
さくらにてDBとファイルのバックアップ
mysqldump -u root -p WordPressデータベース名 > ~/YYYYMMDD_Mysql.dump sudo tar cvzf ~/YYYYMMDD_Fullbackup.tar.gz /usr/share/nginx/puglic_html --exclude "*.tar.gz" --exclude "*.zip"
BackWPupで取れるフルバックアップはWordpressフォルダ配下のみのため、手動で保存します。
Lightsailではファイルを一度ホーム直下で解凍します。
その後、/opt/bitnami/apps/wordpress/htdocs/wp-content配下のオリジナルフォルダをリネームし、解凍したファイル内のフォルダに置き換えます。
|-- htdocs | |-- wp-admin | |-- wp-content | | |-- cache | | |-- languages | | |-- plugins ←移行フォルダにオリジナルからフォルダをコピー | | |-- plugins-org ←リネームしたオリジナルフォルダ | | |-- themes ←移行フォルダ | | |-- themes-org ←リネームしたオリジナルフォルダ | | |-- upgrade | | |-- uploads ←移行フォルダ = = `-- uploads-org ←リネームしたオリジナルフォルダ
pluginフォルダについてはオリジナルフォルダに移行フォルダをマージする形にし、bitnamiイメージの構成を活かします。
MySQLのインポートと修正
データベースをインポートします。
mysql -u root -p bitnami_wordpress < ~/YYYYMMDD_Mysql.dump
bitnami_wordpressがbitnamiイメージのDB名。MySQLのrootパスワードは最初に確認した管理パスワード。
またWordpress本体のフォルダ位置が変わるため、wp-contentのパスをおなじみDatabase Search and Replace Script in PHPで一気に書き換えます。
旧:http://dolls.tokyo/wp-content → 新:http://dolls.tokyo/wp-content
移行確認
ここまで来たら確認用PCのhostsファイルにレコードを追加し、ドメイン名でアクセスしてみます。
http://アクセスなので警告は出ていても、Edgeなどで一通り確認できます。
本番サイトを止めて設定
レジストラのDNSをLightsailへ
ここからは旧サイトへのアクセスを新サイトへ向けるので停止が発生します。
お名前.comにアクセスし、[ネームサーバーの変更]にてLightsailのDNSに変更。
各所のDNSが完全に切り替わるには1晩くらい時間がかかりました。
細かい設定変更を実施
DNSの更新を待つ間、公開に向けて細かい設定を実施します。
まずはbitnamiの右下バナーの削除。
$ sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1
WordPressのアドレスの変更。
本来管理画面内から設定できる項目が、Bitnamiイメージではグレーアウトして変更できません。
直接ファイルを書き換えます。
AWS LightsailでWordPressを構築しSSL化する方法 | カレリエ
vi /opt/bitnami/apps/wordpress/htdocs/wp-config.php define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/'); define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/'); ↓ define('WP_SITEURL', 'http://dolls.tokyo/'); define('WP_HOME', 'http://dolls.tokyo/');
デフォルトで無効化されているxmlrpc.phpを許可します。
これをやらないとJetpackが連携に失敗します。
ぼくのかんがえたさいきょうのWordpress@AWS環境(セキュリテイ設定編) – Qiita
vi /home/bitnami/apps/wordpress/conf/htaccess.conf # add setting of security <Directory "/opt/bitnami/apps/wordpress/htdocs/"> <Files xmlrpc.php> Order allow,deny Deny from all </Files> <Files wp-config.php> Require all denied Require ip 18.180.150.140 </Files> <Files readme.html> Order allow,deny Deny from all </Files> <Files wp-cron.php> Require all denied Require ip 18.180.150.140 </Files> </Directory>
2020/04/11 追記
wp-config.phpとwp-cron.phpへのアクセスを許可しないと、BackWPupが403エラーとなり動作しません。
そしてApache 2.4系はただAllow fromでIPを書いても動かないそうです。
ということで上記書式でグローバルIPのみを許可しています(ローカルIPは許可しても動きませんでした)
Let’s EncryptでSSL有効化
これまでと同様、Let’s Encryptを利用してSSL化します。
まずdigで独自ドメインのIPアドレス更新を確認。
$dig dolls.tokyo A ; <<>> DiG 9.10.3-P4-Ubuntu <<>> dolls.tokyo A ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17128 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;dolls.tokyo. IN A ;; ANSWER SECTION: dolls.tokyo. 34 IN A 18.180.150.140 ;; Query time: 0 msec ;; SERVER: XXX.XXX.XXX.XXX#53(XXX.XXX.XXX.XXX) ;; WHEN: Fri Apr 03 06:13:53 UTC 2020 ;; MSG SIZE rcvd: 56
Let’s Encryptの配置はWordPressをLightsailに移行した(メール以外) | わぷけんを参考にさせていただきました。
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto $ sudo chmod 700 /usr/bin/certbot-auto $ sudo certbot-auto certonly --webroot -w /opt/bitnami/apps/wordpress/htdocs -d あなたのドメイン --email あなたのメールアドレス $ sudo cp /etc/letsencrypt/live/あなたのドメイン/cert.pem /opt/bitnami/apache2/conf/server.crt $ sudo cp /etc/letsencrypt/live/あなたのドメイン/privkey.pem /opt/bitnami/apache2/conf/server.key $ sudo cp /etc/letsencrypt/live/あなたのドメイン/fullchain.pem /opt/bitnami/apache2/conf/server-ca.crt $ sudo /opt/bitnami/ctlscript.sh restart apache
httpのアクセスをhttpsに転送します。
$sudo vi /opt/bitnami/apps/wordpress/conf/httpd-app.conf <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^xmlrpc\.php$ "http\:\/\/0\.0\.0\.0\/" [R=301,L] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule>
上手くいったら、cronで90日前の自動更新を設定しておきます。
Lightsailでの新生活開始
以上で、さくらVPSからLightsailという新居への引っ越しは完了です。
GoogleのLighthouseで計測してみました。
希望のプラグインを入れていくと、やはりレスポンスの鈍さが見えます。
それでも高可用性のAmazonのサーバが$3.5というのは魅力的。
しばらくは慎重に確認しながら、狭くも新しい住まいを楽しみたいと思います。