ConoHaへのサーバー引っ越しレジュメ (DeleGate-Nginx/Postfix/Dovecot, Let's Encrypt)
transition
- TOP
- Old Archives
- ConoHaへのサーバー引っ越しレジュメ (DeleGate-Nginx/Postfix/Dovecot, Let’s Encrypt)
概要
作業概要は以下の通りだ
- サーバーをDTI(@ServerMan)からConoHaに変更する
- サーバーOSをCentOS (6.9)からArch Linuxに変更する
- WebサーバーをDeleGateからNginxに変更する
- WebコンテンツシステムをPureBuilder2からPureBuilder Simplyに変更する
- Mimir YokohamaのWebコンテンツを別サーバーのWordPressから新サーバーのPureBuilder Simplyに変更する
- Webメニューを完全JavaScriptフリーにする
- Postfix/Dovecotを引っ越しする
- DNSサーバーをConoHaとし、DNSの設定を変更する
- 一部のドメインを廃止とする
- 一部のドメインの役割を変更する
- Let’s EncryptによるSSL証明書を取得し、HTTPSに対応する
- 同証明書にメールも対応させる
なお、あまり詳細な解説はしていない。 Linuxやサーバーに関する基本的な事項に対して理解していないまま実施するのは危険であるため、 「コピペ仕様」にはしていない。 詳細に対してエラーが生じるなどの理由でより情報が欲しい場合はあるだろうが、 「言っていることが理解できない」のであれば、サーバー構築をするにはまだ危険なレベルにあると思ったほうが良いだろう。
承前: 開発
PureBuilder Simplyの開発
今回のために新しいコンテンツシステムであるPureBuilder Simplyを開発した。 この詳細は別に譲ろう。
テンプレートの開発
PureBuilder SimplyはPandocテンプレート+eRubyテンプレートというテンプレートを扱うことができる。 PureBuidler Simplyにテーマファイルがあるわけではないので自分で書く前提である。
今回は複数の表示デザインがあるのだが(現在のところは表示されるのはアーティクルモードとプロモーションモードの2つだけだが)これは全てPandocテンプレートとCSSで実現している。
もちろん、このようなテンプレートの開発はWeb屋の腕の見せ所だろう。
CSS
サイトはそれほど華やかなデザインではないが、技術的に劣っているわけではない。 その最たるものがCSSのみで書かれたハンバーガーメニューとドロワーだろう。
ポイントを簡単に言うと
- ドロワーは
fixed
で上部に最初からある。display: none
で、高さは比較的新しい単位であるvh
である - ハンバーガーメニューはtransitionを使っている
z-index
でメニューのほうが上になるようにする- 状態変遷は次のような方法でコントロールしている
- 表示されないチェックボックスを用意し、操作対象を
label
で関連づける。これによりlabel
で囲まれた要素をクリックするとチェックボックスがトグルする - CSSの
+
セレクタは同じ親要素を持つ次の兄弟要素に適用される - チェックボックスにはチェックが入っているときに適用される疑似要素
:checked
がある - そこで、チェックボックス本体の直後に対象となるセクションコンテンツを置くことでチェック状態によって状態をトグルできる
- ドロワーは
fixed
なのでどこに書いても構わないので、このセクションコンテンツの中におく。場所としてはメニューの位置に基づくのが良いだろう
- 表示されないチェックボックスを用意し、操作対象を
見た目はWordPress時とあまり変わっていないが、性能は大幅に向上した。
速度
キャッシュの効かない初回アクセスで従来のWordPressページが5.57s、新しいページは約400msと10倍程度高速化した。
ConoHaサーバーのスタートアップ
立ち上げ
ConoHaのサインアップは10分もあれば可能で、即座にサーバーを使いはじめられる。
サーバー仕様は東京リージョンの1GBプランである。
512GBプランは安いが、性能が十分でなく、またマイグレーションができないため、1GBプランとしている。
この時点でサーバー選択が可能なので、Arch Linuxを選択する。 また、この時点である程度のセットアップが可能だ。 ここでSSH公開鍵の登録が可能である。
ssh-keygen -f ~/.ssh/conoharoot.rsa
のようにして専用に生成しておく。
そしてconoharoot.rsa.pub
を登録する。
名前からもわかるように、ここで登録する鍵はroot鍵である。
また、開放するポートも選択できる。 ここで開放するポートはサーバーよりも上流でフィルタリングされる。 ここで透過していないポートに対するアクセスはサーバーに到達しない。
ただし、結果的にSSHポートの変更はサーバーに負担がかかるものになっている。 少なくともパスワードログインは禁止すべきだろう。
現時点ではSSHのみを通過させる。
初期設定
ConoHaのArch
Linuxは標準インストールではなく、ある程度調整されている。
主にSSHログインが可能で、SSH公開鍵が登録され、パスワード認証不可となっている、といったことだ。
こうした内容は/etc/cloud/conoha-init/conoha-init.sh
によって確認可能だ。
複数のサーバーを接続する予定であれば変更すべき点は多いが、そうでなければ作業は平凡だ。
アップデート
まずはアップデートする。 20MB/sも出るため、超早い。
pacman -Syu
Zsh
私としてはZshがないと話にならないので入れておく。
pacman -S zsh grml-zsh-config zsh-completions
これ移行はZshでの作業
一般ユーザーの追加
もちろん、一般ユーザーは登録されていない。
useradd -m -s /bin/zsh -G bin,disk,wheel jrh
この時点で一旦再起動しないとパスワード設定ができないので、再起動しておく。
パスワードの設定
passwd jrh
その上でvisudo
を使って%wheel
に対するsudoを許可する。
pacaurとyaourtのインストール
AURパッケージも扱う予定であるため、pacaurを入れておく。
# su - jrh
% gpg --recv-keys 487EACC08557AD082088DABA1EB2638FF56C0C53
% sudo pacman -S git
%git clone --depth=1 "https://aur.archlinux.org/cower.git"
%cd cower
%makepkg -si
%cd ..
%cower -d pacaur
%cd pacaur
%makepkg -si
これでAURからのパッケージインストールが可能になったので、Yaourtを入れておく。 作業が明確に自動化されていたり、システマチックに行えるのならYaourtはいらないかもしれないが、 まとめて検索するためには欲しい。
% pacaur -S yaourt
必要なソフトのインストール
ここでいう「必要なソフト」は私の取り扱い上の話だ。
% yaourt -S ruby openbsd-netcat rsync mercurial postfix dovecot nginx fcgiwrap certbot certbot-nginx vim
一般ユーザーでの鍵ログインの準備
サーバーで受け入れの準備をする
% mkdir .ssh
ローカルで鍵を生成しておく。
% ssh-keygen -f ~/.ssh/conoha.rsa
~/.ssh/config
に設定する。
これは名前によるアクセスを可能にするためである。
(同一ホストに対する異なる鍵でのアクセスのため、鍵を指定せずに済むようにでもある)
もちろん、読み替えること;
Host conoha-root
User root
Port 22
HostName conoha.site.static.cnode.io
IdentityFile ~/.ssh/conoharoot.rsa
Host conoha
User jrh
Port 22
HostName conoha.site.static.cnode.io
IdentityFile ~/.ssh/conoha.rsa
rootでは作業できるので、転送する。
% ssh conoha-root 'cat > /home/jrh/.ssh/authorized_keys' < ~/.ssh/conoha.rsa.pub
サーバー側でパーミッションの設定を行う
% sudo chown -R jrh:jrh .ssh
% chmod go-a -R .ssh
% chmod go-a .
そしてsshdリロード
% sudo systemctl reload sshd
DNS設定
ドメインを複数持っていない場合はいきなり完全移行できなかったりするので、 一時的にサブドメインを作るなどする必要がある。
ConoHaコントロールパネルのDNSからDNSの設定を行う。 (DNSの設定ってなんだ、という者はサーバーを立てるにはまだ早い。修行してくるべし)
これは本番サーバーのものを含む。 ただし、稼働中の本番サーバーのアドレスをこの時点で変更してはならない。
そして、DNSサーバーをConoHaのものに変更する。
今回の場合従来はドメインサービス提供のDNSを使用していたため、同サービスのメニューから変更を行った。
WebとLet’s Encrypt
Nginxの立ち上げとテスト
従来がDeleGateで、Nginxにするため互換性は全くない。
Nginxは単純にstartすればアクセス可能な状態だが、移行のための準備をしていく。
まずは、Archの記述に合致するようにserver-avilable
ディレクトリを読むようにしたほうが良いだろう。
http {
include mime.types;
include /etc/nginx/servers-avilable/*;
...
}
これで/etc/nginx/server-avilable
を作ればそこに配置したファイルを読むようになった。
この時点でrestartすると…
Dec 19 18:45:42 archlinux nginx[9339]: 2017/12/19 18:45:42 [warn] 9339#9339: could not build optimal types_hash, you should increase either types_hash_max_size: 1024 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size
とのことなので増やす。
http {
include mime.types;
include /etc/nginx/servers-avilable/*;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
types_hash_max_size 4092;
...
}
配置するファイルはArchwikiに従ったもので大丈夫だ。
server {
listen 80;
listen [::]:80;
server_name domain.tld;
root /usr/share/nginx/html;
location / {
index index.htm index.html;
}
# ACME challenge
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/lib/letsencrypt;
}
}
domain.tld
は適切なドメインに置き換えること。
ここで、あまり書かれていない重要なこと。
root
というのはドキュメントルートで、locationの起点となる。
つまり、
location /foo {
root /usr/share/nginx/html;
}
であるとき、/foo/bar.html
にアクセスすると読まれるファイルは/usr/share/nginx/html/foo/bar.html
であって、/usr/share/nginx/html/bar.html
ではない。
そのような単純なマッピングを行いたい場合はroot
ではなくalias
を使う。
ACME
challengeはhttp://domain.tld/.well-known/acme-challenge/randomnumber
に対して行われるため、
root
で正しい。
だが、このディレクトリがないので作っておいたほうが良いようだった。
% sudo mkdir -p /var/lib/letsencrypt/.well-known/acme-challenge
あとはcertbotを使えば良いのだが…
% sudo certbot certonly --email webmaster@domain.tld --webroot --webroot-path /var/lib/letsencrypt/ -d domain.tld
その前にConoHaのサーバー設定でHTTPをあけておかなくてはならない。
そして、IPv4とIPv6両方をあけておくこと。
別々になっていることに気づかず、ACME
Challengeのリクエストが到達せずに(/var/log/nginx/access.log
を見ても記録されていない)随分とハマってしまった。
移行作業
各ドメインごとのドキュメントルートを作り、ファイルを配置、 さらに対応したドメインごとの設定ファイルを作る。
今回の場合、Mimir Yokohamaのページは既にPureBuilder Simplyによる静的ファイルへのビルドが完了しているし、 移行対象のものに関してもPureBuilder2で静的ファイルにビルドされているものなので、単純にファイルを配置するだけの簡単なお仕事である。
Aki SIE関連のアドレスはdiscontinuedなので、301を返す。
server {
listen 80;
listen [::]:80;
server_name aki-sie.com akisie.com aki-sie.yokohama akisie.yokohama;
return 301 http://www.mimir.yokohama/;
}
http://journal.reasonset.net/
に関しては301でリダイレクトしていたので、これも反映する
server {
listen 80;
listen [::]:80;
server_name journal.reasonset.net;
return 301 http://chienomi.reasonset.net$request_uri;
}
NginxのLet’s encryptの対応
メールサーバーの移行まで完了した時点で作業を行うのだが、 certbotで必要なドメインをすべて署名してもらったら、1SSL対応化を行う。
設定例は以下
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:433 ssl http2;
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name domain.tld;
index index.html;
location / {
root /var/www/domain.tld/doc;
}
# ACME challenge
location ^~ /.well-known/acme-challenge {
root /var/lib/letsencrypt;
}
}
メールサーバーの移行
機能させるために一旦古い証明書で作業しているため、Let’s Encryptの証明書が取れたら証明書ファイルを変更してreload/restartすること。
Postfix
Postfixに関してはCentOS 6とArch Linuxではファイル配置が異なり、 バージョンの違いから設定ファイルの違いも大きく互換性に乏しい。
そこで、CnetOSの設定ファイルを/etc/postfix.cent
としてコピーする。
このほか、/etc/alias*
も忘れずに移行する必要がある。
また、一旦古い証明書ファイルもコピーした。
設定ファイルの違いを見るため、diffを取る。
% diff /etc/postfix.cent/main.cf /etc/postfix/main.cf > main.diff
% diff /etc/postfix.cent/master.cf /etc/postfix/master.cf > master.diff
このdiffファイルをkwriteで2開く。 今回はNemoのsftp機能を使って開いた。
このdiffを元に手作業で変更箇所を反映していく。 主にssl, auth, virtual関連の変更を反映する必要があった。
virtual関連のファイルは/home/mailuser
にあったため、これをコピーする。
ただし、これはvirtualメールボックスを含むため、移行完了までは継続的にアップデートする必要がある。
この前にvirtual用に設定していたmailuser
を設定する必要もあった。
% sudo useradd --no-create-home --uid=20000 --shell /bin/nologin --system -U -M mailuser
だが、これだけではグループが適正な値にならない。 そこで、グループIDを変更した上で、ユーザーの所属する主グループIDも変更する。
% sudo vigr
% sudo vipw
Postfixをrestartして完了。
Dovecot
Dovecotに関しては設定ファイルをコピーしてそのまま使うことができた。
Dovecotの設定ファイルとして/home/mail
を使っていたので、これをコピーする。
Dovecotをrestartして完了。
上流
DNSを変更してもDNSキャッシュの関係でまだ旧サーバーにもメールが届く。 ある程度はaliasを使って転送しても良いのだが、素直にPostfixで受け取りつつ、Maildirのファイルを同期していくのが良いだろう。
DeleGateを使っていたため、DeleGateのSMTP転送機能を使う方法もあるのだが、うまく動作しなかったのと、TLS接続を受け付けることができないため、諦めた。
セキュリティ関連
複雑な話になるので省略。
そこまで難しいことをしているわけではないが、 普通の対策と、らしい対策とで簡単には突破できないようにしている。
後処理(旧サーバー)
DovecotとDeleGateは停止してしまう。
Postfixは5日程度稼働したら停止してしまっていいだろう。3
その後、バックアップ(主にログや設定など)をとったらサーバー破棄である。
おまけ: ConoHaについて
DNS
ConoHaのDNSは高速である上に非常に設定しやすい。
これまで使用していたお名前.comのもの、XDomainのものは非常に設定しづらかったので、 これだけでもConoHaにする価値はあるレベルだ。
料金
コンピューティングリソースはDTIとあまり変わらないが、料金は約倍になった。
ただし、ConoHaの柔軟性やメリットを考えればそう悪くない。 両方持つと少々負担は大きいが4、一気に完全移行したためDTIを解約でき5、許容すべきコストアップだろう。
速度
速い。
「コンピューティングリソースは大きく変わらない」といったが、速度は明らかにあがった。 特にネットワークの高速化とストレージの高速化の恩恵は大きく、Webの応答性は明確に向上した。
柔軟性
DTI VPSは色々と柔軟性が足りず、困った。 特に、OSのバージョンをあげようにもサーバーがひとつしかないので、できない。 ConoHaなら
- インスタンスが立てられるのでサーバー仕様変更もできる
- OSが選べる。さらにカスタムイメージのアップロードも可能
- サーバーのアップグレードが簡単にできる(512MBプランを除く)
ファイアウォール
上流でフィルタリングしてくれるのはとても嬉しい。 設定が楽になる、というのもあるが、サーバーの耐障害性が勝手にあがる上に、まあまあ重いiptablesでの処理量が減るため、パフォーマンスが改善する。 リソースが限られている中では非常に嬉しい。