このブログのサーバーを引っ越した

このブログはさくらのVPSにWordPressを設置しているものですが、年末にV3 1GプランからV4 1G SSDプランに乗り換えました。

動機、目的はこんな感じ。

  • 以前はsambaを設置してWindowsマシンからSSH経由で利用していたが、Windows側でトリッキーな設定が必要で安定しないため現在は使用していない。そのため、旧プランの100GBのストレージは必要なくなっている。SSD化によってパフォーマンスの向上が期待できる。
  • Let’s Encryptを利用してHTTPS対応にする流れに乗りたいが旧サーバーのUbuntu 14.04 LTSではaptでletsencryptが入らない。16.04 LTSならaptで入るのでこの機会に16.04 LTSに上げたい。
  • Ubuntuを14.04から16.04に上げるとPHPが5系から7系に上がるのでパフォーマンスの向上が期待できる。
  • OneNoteで構築手順や設定内容を書いてサーバーの構成を管理していたが、構成管理ツールを導入して効率化したい。

そこでまずは色々選んでいきます。

  • サーバーはさくらのVPS 1G SSDプラン。そもそもの動機なので。
  • 構成管理ツールはansibleを採用。特に他と比較検討したわけではなく、以前に少し触ったことがあるので学習コストの節約を期待しました。playbookの作成、実行はWSL上で行うことにしました。
  • 移行時のダウンタイムを最小化するために事前にサーバーの設定を煮詰めておく必要があります。また、今後サーバーの構成を変更する際の事前検証用の環境があると便利です。これには以前からAzureのサービスは利用していたこと、起動時にのみ課金されるので費用を抑えられることからAzureのVMを採用しました。これも特に他との比較検討はしていません。

ざっくりと移行完了までの流れ

  1. 事前作業
    1. 新サーバーを追加契約
    2. ネームサーバーでanis774.netのTTLを5分に変更
    3. 検証用環境としてUbuntu 16.04 LTSをインストールしたAzureのVMを準備
    4. ネームサーバーに検証用環境に向けたサブドメインを追加
    5. 旧環境互換になるようにパッケージをインストール、設定する環境構築用playbookを記述、検証用環境に対して実行してapacheのデフォルトのページが表示されることを確認。
    6. サーバーからWordPressのデータのダンプを取得するplaybookとダンプしたデータをサーバーにリストアするplaybookを記述。旧本番環境からダンプしたデータを検証用環境にリストアしてWordPressが動作することを確認。この際に検証用環境のドメインが違うためリストアしたDBにログインして一部設定をSQLで直接変更する作業を行いました。 UPDATE wp_options SET option_value=”http://hoge.anis774.net” WHERE option_value=”http://anis774.net”;
    7. playbookにletsencryptのインストールから証明書の取得、apacheの設定までを行うroleを追加。検証用環境に対して流して結果を確認。
    8. WordPressの管理画面から”WordPress アドレス (URL)”、”サイトアドレス (URL)”の設定を”http://~”から”https://~”に変更
    9. WordPressにSearch Regexプラグインを追加し記事中のhttpへのリンクをhttpsへ一括置換。サイドバーに設置しているiframeのリンク先が”http://~”になっている部分を”//~”に変更。適当ないくつかの記事でリンクを踏んでみて挙動を確認。
    10. 検証用環境を停止
  2. 移行作業
    1. 新サーバーに対して環境構築用playbookを実行。
    2. 旧サーバーのWordPressでログインしないとコメントできないように設定を変更。WordPressのユーザーは私一人なので実質コメントができない状態になる。
    3. バックアップ、リストア用のplaybookを用いて旧サーバーから新サーバーへデータを移行。
    4. ネームサーバーのanis774.netのAレコードを新サーバーに向けて更新。
    5. 作業用PCの回線を自宅のWiFiからLTEに切り替えてnslookupコマンドでanis774.netのIPアドレスを確認、新サーバーに向くまで待機。
    6. 頃合いを見て旧サーバーを停止。コメントを開放。
    7. TTLを元に戻す。
  3. 事後作業
    1. 旧サーバーを解約。

これでダウンタイム無しでサーバーを移行することができました。

今後の展望としてはサーバーからpostfixで発射したメールが未着になることが低頻度で起こり、その度に面倒な対応が必要になっているので、これを少ない手間で解決するためにSendGridの導入を進めています。さくらのVPSユーザーであれば無料プランを特典付きで契約できるので導入を決めました。

今回作成したplaybookには認証情報等がべた書きされているので、この辺りをキレイにして公開するかも知れませんししないかも知れません。

ちなみにパフォーマンスの改善は体感できていません。HTTPS対応で相殺されたんでしょうかね…

SiteGurad WP Plugin 1.3.3のCAPTCHA関連ログイン不可からの復旧

SiteGurad WP Pluginを管理画面から1.3.3に更新して少し経ってから、またSiteGurad WP Pluginの更新を知らせるメールが来たので管理画面にログインして更新しようとしたところ、ログインが出来なくなっていました。いろいろ試したのですが、ふと更新履歴を見たところ

1.3.4

・ Fix an issue where CAPTCHA might fail in 1.3.3

なるほど…サイトから1.3.4をダウンロードしてSCPで配置したらログインが可能になりました。

WordPressのxmlrpc.phpへのアクセス数をLogwatchで通知する

WordPressのxmlrpc.phpへの大量アクセスで時々サーバーが息をしなくなってしまうので、IPアドレスでアクセス制限をかけています。ただ、毎回アクセスログを見てアクセス元のIPアドレスを確認するのも面倒です。

日頃からLogwatchでサーバーの状態を確認しているので、ここでxmlrpc.phpへのアクセス数の集計も見られると便利だと思い設定しました。Ubuntu 12.04.4 LTSにtaskselからLAMP環境を構築しWordPressを設置した状態を前提にしています。

まずLogwatchをインストール。

sudo aptitude install logwatch
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
sudo cp /usr/share/logwatch/default.conf/services/* /etc/logwatch/conf/services/

/etc/logwatch/conf/logwatch.conf の最低限の設定を変更します。

TmpDir = /tmp
Output = mail

MailTo = myname@example.com

ここで動作確認

sudo /etc/cron.daily/00logwatch

メールが届けばOKです。

/etc/logwatch/conf/services/services に wp-xmlrpc-access-count.conf を作成

Title = "WordPress xmlrpc.php Access Count"
LogFile = http

/etc/logwatch/scripts/services にログの集計を行うスクリプト wp-xmlrpc-access-count を追加

#!/usr/bin/python
import sys;

ipcount = {}
for line in sys.stdin.readlines():
    if "xmlrpc.php" in line:
        ip = line.split(" ", 1)[0]
        if (ip in ipcount):
            ipcount[ip] = ipcount[ip] + 1
        else:
            ipcount[ip] = 1

count_length = 0
for ip, count in sorted(ipcount.items(), key=lambda x:x[1] * -1):
    if count_length == 0:
        count_length = len(str(count))

    print ((ip + ":").ljust(17) + str(count).rjust(count_length) + " Time(s)")

スクリプトの動作確認

logwatch -service wp-xmlrpc-access-count -output stdout

これで集計結果が表示されればOKです。

この設定を行うにあたってLogwatch にサービス・フィルタを追加するを参考にしました。

Limit Login Attemptsプラグインはxmlrpc.phpへのブルートフォースアタックも防ぐのか

ふと不安になって調べてもわからなかったので実験しました。iPhoneにWordPressアプリをインストールして3G回線でまずは正しいID/パスワードでログイン、アクセスログを見て自分のIPアドレスを確認しました。
今後は出鱈目なID/パスワードでログインを連打してLimit Login Attemptsの設定画面を確認。iPhoneのIPアドレスが登録されてブロック対象に自動設定されていることを確認しました。