やっとブログの引っ越しが完了しました。
準備期間を含めると2週間の大仕事でした・・・

引っ越しで実現した項目

  1. ドメインの引っ越し
  2. SSL通信化
  3. Apache > nginx への変更
  4. wordpressのマルチサイト化
  5. 実装のDockerコンテナ化


1.ドメインの引っ越し

旧ドメインのdummytop.orgの期限がもうじき切れるので、この機会にドメインを集約(不要なドメインは放棄)することにしました。
ドメインが変わるので、過去の検索実績等は捨てることになりますが止む無しです。

2.SSL通信化

Googleの仕様変更の後ずっと放置していたので、引っ越しに合わせて対応することにしました。
使用した証明書は無料のLet’s Encryptです。
設定/実行自体はすごく簡単だったのですが、インストールに苦労しました。
ググると「yumでインストールできる」と書いてあるのに、インストールできません・・・、リポジトリの追加等色々試してみたのですが、最終的にコレに落ち着きました。

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

これは other linux で表示されるインストール方法で、yumリポジトリの追加等必要がないので、一番シンプルなインストール方法だと思います。
ちなみに今回使用したdockerのalpine linuxコンテナだと、これだけでインストールできます。

apk add certbot

ただし、このインストール方法だとnginxのプラグインがインストールされないようなので、少し注意が必要です。
それ以外はとても簡単だったので、迷ってる人はまずは試してみるのがお勧めです。

3.Apache > nginxへの移行

nginxへ移行する理由は特にありません。メリットもありませんし、完全に気分だけで移行してみました。
nginxとfastPHPの設定はdockerコンテナをそのまま利用したのですごく簡単でした。
唯一大変だったのが rewriteの置換 です。
nginxは.htaccessが無いので、wordpressで必要なrewrite処理をnginxの設定に入れ込まないといけません。
今回マルチサイト化もしたので余計に大変でした。色々ググったり試したりして結局以下の3行をdefault.confに追加することでうまくいきました。

# for multi site replace
if (!-e $request_filename) {
  rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
  rewrite ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 last;
  rewrite ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 last;
}

4.wordpressのマルチサイト化

これも必須ではなかったのですが、複数ブログがあるとwordpressのv-up等が結構面倒くさいのでマルチにしてみました。
困った点:引っ越しツールが使えない!!!
引っ越し用のプラグインはシングルサイト用でマルチサイト用は有償だったので大変困りました。
対策:DB内容の直変更w
色々試行錯誤した結果、ローカルにお試しサイトを作って、マルチサイト版のDB・ディレクトリ構成を調査した後に、直接DBを書き換えました。

5.実装のdockerコンテナ化

将来的にサーバーの引っ越し等も考えられるので、今回コンテナ化も行いました。
実質一番大変だったのがこの作業です。
コンテナ構成は nginx + wordpress(php含む)+ mysql の3層構成です。
wordpressのコンテナはfastPHPも含んだもので、設置がとても簡単です。(Apacheサーバまで含んだお手軽コンテナもあります!)
このあたりがdockerのメリットですね
wordpress:alpineにバグがあったり等で苦労はしましたが、dockerとdocker-composeを適当に調べる程度で構築できました。
完成した docker-compose.yml

version: '3'
services:

wordpress:
  image: wordpress:fpm-alpine
  depends_on: - mysql
  container_name: momiji-wp
  restart: unless-stopped
  volumes:
   - www:/var/www/html
  environment:
    WORDPRESS_DB_HOST: mysql
    WORDPRESS_DB_USER: xxxx
    WORDPRESS_DB_PASSWORD: xxxxxxxx
    WORDPRESS_DB_NAME: wordpress

nginx:
  build: ./nginx
  depends_on:
   - wordpress
  container_name: momiji-www
  restart: unless-stopped
  ports:
   - "80:80"
   - "443:443"
  volumes:
   - ./nginx/nginx_conf:/etc/nginx/conf.d
   - certkeys:/etc/letsencrypt
   - www:/var/www/html

mysql:
  image: mysql:5.7
  container_name: momiji-db
  restart: unless-stopped
  volumes:
   - db:/var/lib/mysql
  environment:
    MYSQL_DATABASE: wordpress
    MYSQL_USER: xxxx
    MYSQL_PASSWORD: xxxxxxxx
    MYSQL_ROOT_PASSWORD: xxxxxxxx

volumes:
  www:
  db:
  certkeys:

volumeでwww(wordpressのインストトールディレクトリ)、db(mysqlのDB領域)、certkeys(証明書情報)を永続化(コンテナを削除(再構築)しても消えない)しました。

6.その他

証明書の有効期限が90日なので、定期的にチェックする必要がありますが、手作業ではやりたくありません。
そこでcrondを仕込むのですが、ホスト側 or コンテナ内で随分迷いました。
結局「引っ越し時の簡易化のために、コンテナ内で閉じる」を優先してコンテナ内にcrondを仕込みました。
併せて、logrotateとこれらを監視するsupervisordを導入しました。
それともう一つこだわったのが「コンテナ入れ替え時に手作業が発生しない」です。

今回dockerを試行錯誤して、そのメリットをすごく感じました。

  • コンテナで独立している
    PHPをv-upする場合に、コンテナを入れ替えるだけで実現できます。(直接インストールしているとそう簡単にはいきませんよね・・・)
  • 定義ファイルだけで全く同じ構築ができる
    テストサーバで構築したのと同じ作業を本番サーバで行う必要がありません。
  • コンテナの入れ替えが簡単である
    これが一番重宝しました。
    nginxで動かないのでapacheで試したり、phpのバージョンを下げてみたり 等々の作業が簡単に行えます。

これらのメリットを活かすために、コンテナ作成後手作業が発生しないように構築しました。
(実際には証明書の初回認証は必要なのですが、生涯1度きりなのでvolumeとして保持することで回避)

出来上がったnginxサーバのDockerfileはこんな感じです

from nginx:alpine

RUN apk add certbot \
  && apk add supervisor \
  && apk add logrotate \
  && printf "#!/bin/sh\n/usr/bin/certbot renew --logs-dir /var/log/letsencrypt --max-log-backups 200\n" > /etc/periodic/daily/certbot_renew \
  && chmod 755 /etc/periodic/daily/certbot_renew \
  && echo "daemon off;" >> /etc/nginx/nginx.conf \
  && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime\
  && echo -e \
    /var/log/nginx/*.log { \\n\
        missingok \\n\
        weekly \\n\
        notifempty \\n\
        rotate 10 \\n\
        compress \\n\
    } \
    > /etc/logrotate.d/nginx \
  && echo -e \
    /var/log/crond/*.log { \\n\
        missingok \\n\
        weekly \\n\
        notifempty \\n\
        rotate 10 \\n\
        compress \\n\
    } \
    > /etc/logrotate.d/crond \
  && unlink  /var/log/nginx/access.log \
  && unlink  /var/log/nginx/error.log \
  && touch   /var/log/messages \
  && mkdir   /var/log/crond

ADD svr_conf/supervisord.conf /etc/supervisord.conf
ADD certopt/options-ssl-nginx.conf /etc/certopt/options-ssl-nginx.conf
ADD certopt/ssl-dhparams.pem /etc/certopt/ssl-dhparams.pem

CMD ["supervisord", "-c", "/etc/supervisord.conf"]

Dockerはぜひ一度触ってみるとよいと思います。
AWSでサーバを臨時借用して短期実行等にも打ってつけですね。
同じようなことを考えている方がいれば、参考になれば幸いです。

おまけ
dockerを使用する場合には、コンテナのサイズにも注意が必要です。
コンテナで独立している ≒ コンテナ毎に環境が存在する(重複している)
からです。
そんな時にはalpine linux版が小さくてお勧めです。


例えば、wordpress+phpのコンテナでこれだけの差があります!
大きな差ですね。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です