お名前VPSからConohaへの移行 (4)

 前回までの手順でWordpressのデータの移行は完了しました。続いてWebサイトのHTTPS化をLet’s Encryptを利用して行ってゆきます。

certbotの導入

 Let’s Encryptそのものについて改めて述べる必要はないと思います。まずは、証明書の導入を自動的に行ってくれるツールである、certbotの導入を行います。これはaptで一発で入ります。

% sudo apt install certbot python3-certbot-nginx

 なお、ここから先の作業を行うには、サーバ移行をしようとしているドメインの名前解決先のIPアドレス (Aレコード) を、移行先のIPアドレスに変更してからでないとできません。これは、Let’s Encryptの導入スクリプトが、実際に名前解決を試みて正しいレスポンスが返ってくるかどうかを確認しているためです。ここでDNSのAレコードの変更を行ってください。移行先のホストの名前解決の結果が変わったら、次に進みます。ちなみに筆者の環境では、10分程度で変更が確認できました。

# お名前.comでAレコードの変更を行った直後 (2021/3/3 23:14頃)
% dig www.starplatinum.jp

; <<>> DiG 9.16.1-Ubuntu <<>> www.starplatinum.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27870
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.starplatinum.jp.           IN      A

;; ANSWER SECTION:
www.starplatinum.jp.    300     IN      A       157.7.222.152

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Mar 03 23:14:48 JST 2021
;; MSG SIZE  rcvd: 64

# 6分程度で名前解決の結果が変わった (2021/3/3 23:20頃)
% dig www.starplatinum.jp

; <<>> DiG 9.16.1-Ubuntu <<>> www.starplatinum.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34062
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;www.starplatinum.jp.           IN      A

;; ANSWER SECTION:
www.starplatinum.jp.    300     IN      A       160.251.76.216

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Mar 03 23:20:43 JST 2021
;; MSG SIZE  rcvd: 64

 移行元と移行先のOSが同じであれば、移行元のサーバのcertbotのディレクトリや設定ファイルをそのまま移行先にコピーすることで、ダウンタイムなしで移行するという荒業も可能なようですが、今回はホストOSがCentOSからUbuntuに代わっていることもあり、ダウンタイムを許容して真面目に移行を行うことにしました。

 名前解決先の変更が完了したら、nginxの設定ファイルのserver_nameを本来あるべき名前に戻します。この時、ファイルの中身を単純に書き換えると、現在のホスト名 (VPSに自動的に割り当てられたホスト名) でアクセスできなくなってしまうので、既存のファイルと別名で同じディレクトリ (/etc/nginx/sites-enabled/) に設定ファイルをコピーし、それを編集するようにしましょう。こうすることにより、どちらのホスト名でも Webサイトにアクセスできるようになります。

 以下が元々存在した設定ファイルで、…cnode.ioのドメインをコメントアウトして無効化し、逆にstarplatinum.jpのドメインのコメントアウトを外して有効にしています。ついでに、wwwありとなしの両方を受け付けるように設定しておきます。

# *** Per Site Configuration ***
# すべてをメインサイトにリダイレクトする.
# ifステートメントは利用せず, 個別のserverステートメントで定義する.
# 理由は http://wiki.nginx.org/IfIsEvil を参照.
server {
        server_name  _;
        return 302 $scheme://www.starplatinum.jp$request_uri;
        # return 302 $scheme://v160-251-76-216.k2a5.static.cnode.io$request_uri;
}

server {
    server_name starplatinum.jp www.starplatinum.jp;
    # server_name v160-251-76-216.k2a5.static.cnode.io;
    root /var/www/vhosts/starplatinum;
(以下略)

 以下はコピーしたファイルです。基本そのままでいいのですが、先頭のserverブロックは無効にしておかないとnginxが正しく起動しないので、ここだけコメントアウトしておきます。名前は任意でOKですが、ここではcnode.confとしています。

# *** Per Site Configuration ***
# すべてをメインサイトにリダイレクトする.
# ifステートメントは利用せず, 個別のserverステートメントで定義する.
# 理由は http://wiki.nginx.org/IfIsEvil を参照.
#server {
#        server_name  _;
#        # return 302 $scheme://www.starplatinum.jp$request_uri;
#        return 302 $scheme://v160-251-76-216.k2a5.static.cnode.io$request_uri;

server {
    # server_name starplatinum.jp www.starplatinum.jp;
    server_name v160-251-76-216.k2a5.static.cnode.io;
    root /var/www/vhosts/starplatinum;
(以下略)

 ”sudo systemctl restart nginx” でnginxを再起動し、ドメイン名でアクセスしたときに移行先のホストにアクセスがいくことを確認します。なお、この時点ではHTTPSはまだ有効化されていないので、HTTPにアクセスしたときに/var/log/nginx/access.logに記録が残ればOKということになります。管理人はMacを利用していますが、curlで確認しました。

certbotの起動

 さて、いよいよcertbotを起動して証明書の発行を受けます。ここまでの手順を間違いなく実施していれば、以下のように何事もなく進むはずです。

% sudo certbot --nginx -d starplatinum.jp -d www.starplatinum.jp
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): starplatinum@gmail.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for starplatinum.jp
http-01 challenge for www.starplatinum.jp
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/starplatinum.conf
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/starplatinum.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/starplatinum.conf
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/starplatinum.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://starplatinum.jp and
https://www.starplatinum.jp

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=starplatinum.jp
https://www.ssllabs.com/ssltest/analyze.html?d=www.starplatinum.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

certbotの自動起動の確認

 aptでインストールを行ったことで1日に2回、自動的にcertbotを起動して証明書の有効期限を確認し、30日を切ったら自動的に更新を行うタスクがsystemctlに登録されます。最後に念のためにタスクの登録状態を確認しておきます。以下のようになって入ればOKです。

% sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Wed 2021-03-03 22:57:35 JST; 15h ago
    Trigger: Thu 2021-03-04 17:24:00 JST; 3h 21min left
   Triggers: ● certbot.service

Mar 03 22:57:35 160-251-76-216 systemd[1]: Started Run certbot twice daily.

 これで移行先ホストに対して証明書が発行されたことになります。HTTPSでアクセスすると、今度はサイトが”一応”表示されるはずです。管理人のサイトでは、以下のようになりました。

 これは、Wordpressの内部ではまだ (VPSに自動的に割り当てられた) 旧ホスト名が有効だと思っているため、コンテンツの一部が正しく表示されないためです。旧ホスト名で接続すれば正しく表示されるはずなので、ここでWordpressにログインし、”設定” – “WordPressアドレス (URL)” と “サイトアドレス (URL)” を移行先ドメインのものに変更・保存します (本サイトの場合は”https://www.starplatinum.jp”)。ここでリダイレクトが発生してログイン画面に戻されますが、この時点で画像などのコンテンツが正しく表示されるようになるはずです。

その他諸々の作業

 基本的にこれで移行は完了ですが、Wordpress本体以外にも、こまごまとしたことがありました。これは個々人によって異なるかと思いますが、管理人が実施した作業を簡単に紹介しておきます。

バックアップデータの移動と復元

 先にバックアップを取得しておいた、/var/www/vhosts/starplatinum/のtarイメージを移行先サーバに転送し、復元しておきましょう。管理人のサイトでは、最新の通貨レートを自動的に取得・ファイルに書き込み、そのデータに基づいて外貨ベースの製品価格の日本円の価格を計算・表示するページがありますが、これらのコンテンツはWordpressの導入ディレクトリ直下にフォルダを作成しておいてありましたが、バックアップ対象にはなっていませんでした。なので、これらを移行元から持ってきたデータからコピーして復元する必要がありました。

cronタスクの復元

 上記の通貨レートの自動取得は、cronにタスクを登録して行っていました。当然ではありますがこれらは移行されていないので、手動で移行する必要があります。cronのタスクは、crontabに登録されているものと、/etc/cron.(hourly|daily|weekly|monthly) というディレクトリの下にスクリプトとして設置されているものの2種類があるので、自分で登録したタスクがあったら忘れずに移行しておきましょう。

 ディレクトの下に置いたスクリプトがなぜか動かなくてしばらく悩みましたが、どうやらUbuntuでは拡張子 (厳密にいうと”.”) があるとダメなようで、名前変更して拡張子を取ったら動くようになりました。

逆引きの設定

 Let’s Encryptの作業実施前に行ったAレコードの登録情報で、ドメイン名→IPアドレスの名前解決は変更されていますが、IPアドレス→ドメイン名の、いわゆる逆引きはそのままになっています。すでにご案内の通り、Conoha VPSではデフォルトで設定されている逆引き名がありますが、公式ヘルプの手順を参考にして変更しておきましょう (当該ドメインでメールサーバを立てない限り = Webサーバとして利用する限りにおいては、特に困ることはありませんが)。

ads.txtの復元

 先ほど、ads.txtが肥大化していたため一時的に退避しておきましたが、それを元に戻します。とはいっても、肥大化したファイルを移行先ホストにそのまま持っていくメリットはないと思われるため、このページの手順に従って新たにgoogleから当該ファイルを新規に取得・設置します。ファイルを設置した後に、所有者とグループをnginxに変更しておいてください。

いちおう完了!

 ここまでの手順で、移行先のサーバでWordpressのコンテンツが表示され、HTTPSも利用できるようになったはずです。ひょっとしたらその他にまだ細々とした作業が残っているかもしれませんが、何かあったらまた書くと思います。

コメントする