Blog

さくらのVPSに手軽にセキュアで高速なMovable Type用サーバをAnsibleで自動で構築する方法

onagatani 技術ブログ

こんにちわ。久しぶりにブログを書いているonagataniことながたにです。
最近のMTはMTクラウド(フルマネージドのMT環境)やMT for AWSなどがあるので本番環境のサーバにMTを導入する機会もあまりないかもしれません。

とはいえ、既にMTライセンスを持っている。もしくは個人無償ライセンスを利用する場合にVPSを利用すると更に安価にサーバを運用することが可能だったりします。さくらのVPSだと月額635円〜でMTのサーバを運用できます。

VPSなので自由にカスタマイズできますしレンタルサーバよりも高速です。
そこで今回はさくらのVPSをAnsibleで構築する方法を紹介したいと思います。
※ちなみにさくらのVPSは転送量課金がないので転送量課金が気になる方には最高のサーバかと思います。

VPS(仮想専用サーバー)|さくらインターネット - 無料お試し実施中

今回のポイント

  • さくらのVPSにオールインワンのMTサーバを自動構築する (Apache or Nginx、SSL、mysql、MT、PHPなど)
  • セキュリティに考慮した高速なWEB/CMSサーバを1台で構築する
  • sshでの手動のサーバセットアップは行わず「Ansibe」を利用する
  • 全体の所要時間は30分〜1時間程度

Ansible Documentation - Ansible Documentation

対象の読者

MacもしくはLinux環境がある方(Virtualboxも可)、Windowsでの動作は未確認です
簡単なSSHが行える方

構築されるサーバのスペック

Apache2.4 (nginxにする事も可能です):http2、event mpm起動、セキュリティ設定込
php7.4 and php-fpm (optional):apcu and opcache及びini調整込
mysql8:チューニング込
perl5.30
Movable Type PSGI起動:CGIより数倍速いです
Let's Encrypt:自動でSSLを設定します
ImageMagick(optional)
sshd:セキュリティ設定込
Firewalld:webとsshのみ開放します
Postfix:SendGridやSESへリレー設定が行えます。利用方法は以下のページにて

さくらのVPSでPostfixからSendGridへのメールのリレーをAnsibleで設定する方法

ご注意

本番でも利用される事を考慮したセキュリティ設定を実施しますが、完璧ではありません。WAFやCDNを導入しMTはIP制限するなど運用には気をつけて下さい。
この記事を参考にした事でクライアントPCやサーバで問題が発生しても弊社及びながたには保証できないので十分にテストの上ご利用下さい。なお、今回のplaybookはあくまで0からのサーバ構築を想定しています。既に稼働しているサーバなどへは適用出来ませんのでご注意下さい。
playbookのymlなどに手を入れますがgithubのpublicなどにはpushしないように気をつけてください。機密情報の暗号化については別の機会に掲載します。

ステップ1:さくらのVPSを起動する

まずはVPSを起動します。サーバのスペックとしては2コアの1Gメモリ以上が快適でしょう。
https://vps.sakura.ad.jp/

sakura1.png

こちらのURLから2週間お試しが可能です。プランは石狩リージョンの2コア1Gメモリが良いでしょう。起動できたらVPSの管理画面にログインします。

さくらのVPSは標準ではCentOS7が起動されますが、CentOS7のサポート期限もありますので より新しいCentOS8にOSを入れ替えます。(7のままでも問題はありません)

sakura_os.png

サーバの右上のメニューからOS再インストールを行います。標準OS -> CentOS8を選択して起動します。

sakura3.png

OS選択画面の下にあるケットフィルタ(さくらのVPSのファイアーウォール)の設定を行います。なおスタートアップスクリプトは利用しません。
※今回はWEBとSSHを公開します。(基本的にこの項目以外は外部公開しません)

sakura4.png

  1. デフォルトのsshのフィルタは削除します
  2. Webについては全てのIPに対して許可します
  3. カスタムでフィルタを追加し、TCP/22(SSH)を開放します。こちらはSSHの制限になるので固定IPの場合は0.0.0.0/0ではなく127.0.0.1/32などで接続元を制限するとセキュリティが格段にUPします。

※ /32はCIDRという表記方法で127.0.0.1/32なら127.0.0.1だけを意味します。会社や自宅の固定IPに/32を付けるとそのIPは許可されると覚えてください。詳しくはこちら

設定を保存しましたらさくらのVPSの設定は完了です。
次にDNSの設定を行います。

sakura5.png

サーバのネットワーク情報のアドレスををメモします。こちらのアドレスに向けて公開するドメイン名を割り当てます。この記事ではtest.colsis.jpをDNSで割り当てたと想定して説明していきます。WEBへの接続やSSHについては ドメイン名で接続できるようになります。

※ドメインの設定についてはドメインを取得したレジストラ(onamae.comやRoute53)の管理画面で実施してください。

ステップ2:Ansibleの準備

今回のサーバ構築は自動化ツールを使って実施します。Ansibleは構築対象サーバ(今回はさくらのVPS)ではなく、ご自身のMacやLinuxなどのクライアント側のPCにAnsibleを導入します。
※Ansibleの環境がある方はステップ2はskipして頂いて問題ありません。

Untitled(1).png

Macの場合はterminalで下記のコマンドを利用してansibleをインストールします。

# pip install --user ansible
# pip install --user paramiko

CentOSやRHELの場合は以下のようにyumでインストールします

# sudo yum install ansible
# sudo pip install paramiko

参考:https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html

なおansibleは2.9で動作確認しておりますが2系であれば問題ないと思われます。

ステップ3:AnsiblePlaybookの準備

サーバの自動化に利用するansibleのplaybookは自分が開発している IZANAMI を利用します。
Macの場合はterminalで作業ディレクトリに移動してから以下のコマンドを利用するとソースコードがダウンロードされます。

# git clone git@github.com:izanami-team/IZANAMI.git

もしくは以下のアドレスでzipをダウンロードし展開します。
https://github.com/izanami-team/IZANAMI/releases/tag/v2.1.1

プロビジョニング対象サーバを指定する

IZANAMIディレクトリ配下にhostsというファイルがあるのでテキストエディタで編集を行います。

[development]
test.colsis.jp
[staging]
[production]

開発用途を想定してdevelopmentのmt.example.comをさくらのVPSに割り当てたドメイン名に書き換えます。今回は例としてtest.colsis.jpとして進めます(ご自身でDNSに登録したドメイン名に差し替えて下さい)。

対象サーバの個別設定を行う

playbookでは構築するサーバについて個別の設定変更を色々と行う事が可能ですが、今回は最低限必要な設定変更について説明いたします。実際の作業については以下に流れを記載します。

  1. host_vars内のmt.example.com.ymlをコピーしtest.colsis.jp.ymlを作ります
  2. test.colsis.jp.ymlの中身を修正します
  3. サーバ作業用SSHユーザを作成する
  4. Movable Typeのzipファイルを設置
  5. ansible-playbookコマンドを実行しVPSサーバをプロビジョニングします
  6. サーバを再起動して完了となります

test.colsis.jp.ymlを修正する

以下が修正したymlファイルになります

server_hostname: "test-colsis-jp"
root_email: "hogehoge@colsis.co.jp"
letsencrypt: True
apache: True
nginx: False
php: True
owner: "{% if apache | bool %}apache{% else %}nginx{% endif %}"
basic:
  auth: True
  path: /
  user: colsis
  passwd: passwd@1234
mt:
  psgi: True
  file: MT7-R4701.zip
  ver: MT7-R4701
  plugins:
    - PSGIRestart
  config:
    - {name: 'AdminScript', value: 'admin'}
    - {name: 'ImageDriver', value: 'Imager'}
  db:
    name: movabletype 
    user: "{{ vault.mt.db.user }}"
    passwd: "{{  vault.mt.db.passwd }}"
    server: localhost
vhosts:
  - name: test.colsis.jp
    letsencrypt: True
    email: "letsencrypt+test@colsis.jp"
    ssl:
      use:  True
      only: True
postfix:
  relay: False
ssh:
  users: "{{ vault.ssh.users }}"
mysql:
  root:
    password: "{{ vault.mysql.root.password }}"

今回は以下のように修正しています

  1. server_hostname:サーバの識別子です。デフォルトのままでも良いですが変更したほうが良いでしょう
  2. root_email:サーバのlogなどが送信されます。受信できるメールアドレスなら問題ありません
  3. php:公開コンテンツでphpを利用する方が多いようなのでphpはTrueとしています
  4. basic:コンテンツの公開まではサイト全体をBasic認証する場合は多いと思いますのでコメントアウトを解除し、ユーザ名・パスワードを変更しています
  5. vhostsのname:Apacheのvirtualhostのドメイン名になります。公開するドメイン名(今回DNS設定したドメイン)に変更します

※今回はMTのversionはMT7-R4701としています。適宜変更して問題ありません

各設定について

こちらに説明を記載しているので参考にして下さい

ステップ4:sshユーザの作成

さくらのVPSはデフォルトではrootユーザでsshを行いますが、セキュリティ的にあまりよろしくないので公開鍵認証でのログインに変更します。そのためVPSにはrootではなく作業用のsshユーザを作成します。
※ VPSサーバへSSHされる際にご自身の鍵を利用される場合はこの作業は必要ありません。

MacかLinuxのterminalで以下のコマンドで作成します ssh-keygen -t rsa -b 4096 -C "コメント"

# ssh-keygen -t rsa -b 4096 -C "ユーザ名やメールアドレスなどのコメントを記載"
# Enter file in which to save the key (/Users/onagatani/.ssh/id_rsa): ./onagatani.id_rsa #作成するユーザ名+.id_rsaというファイル名で鍵を作成する
# Enter passphrase (empty for no passphrase):  #sshログイン時のパスフレーズを入力する。入力したパスフレーズは忘れないこと
# Enter same passphrase again: #パスフレーズを再入力する

公開鍵を設置する

作成した公開鍵(.pubファイル)をIZANAMIディレクトリ内のroles/sshd/files/public_keys内にsshユーザ名で保存する
※ 例)onagatani.id_rsa.pubをonagataniというファイル名に変更して保存する

/path/to/IZANAMI/roles/sshd/files/public_keys/onagatani

ステップ5:sshユーザ及びDBの設定

ansibleではリモートサーバのSSHユーザも自動で作成されますのでユーザの設定を変更します。
IZANAMIディレクトリ配下の以下のファイルをテキストエディタで編集します。

/path/to/IZANAMI/group_vars/all/vault.yml

以下のように内容を修正します

vault:
  mysql:
    root:
      password: 1234@Password456
  ssh:
    users:
      - { name: onagatani,  group: "wheel", password: "vault@passwd" }
  postfix:
    smtp:
      from: test.colsis.com
  mt:
    db:
      user: movabletype
      passwd: 1234@Password456

今回は以下のように修正しています

  1. vault.mysql.root.password:MySQLサーバのrootパスワードを設定します。大文字小文字の半角英数字及び記号の構成で8文字以上が必要になります。
  2. ssh.users:先程作成したsshユーザを記載します。nameはsshユーザ名(管理上公開鍵名と同じにします)、groupはwheelとしsudoを可能とします。passwordはsudoの際に利用するOS上のユーザパスワードになります。パスフレーズと同じでも良いでしょう。
  3. postfix.smtp.from:メールサーバのドメイン名になります。あくまで送信用設定になります。DNSに設定したドメイン名で良いでしょう。
  4. mt.db:MTのデータベースユーザ名とパスワードを設定します。パスワードはrootと同じ強度が必要になります。

ステップ6:MTの設置

MTのソースファイルをIZANAMIディレクトリ内のroles/movabletype/filesに設置する。

/path/to/IZANAMI/roles/movabletype/files/MT7-R4701.zip

ステップ7:ansibleを実行する

これで準備が整いました。設定変更やansibleのインストールは面倒ですが、一度セットアップすると使いまわせますので楽になるかと思います。

以下のコマンドをIZANAMIディレクトリ直下で実行します。

# ansible-playbook -c paramiko -i hosts site.yml -u root -k -l development

実行すると さくらのVPS OS再インストールで設定したsshパスワードを聞かれるので入力してリターンします。
あとはプロビジョニングが終わるまで待つだけです。

sakura6.png

特に問題がなければ完了画面が表示されてコマンドが完了しているはずです。問題が発生する場合はhostsファイルやhost_vars/ドメイン名.yml、もしくはgroup_vars/all/vault.ymlの内容に問題があるはずです。エラーメッセージを確認して修正しましょう。なおプロビジョニング完了後はrootでのSSH接続は出来なくなります。先程作成した秘密鍵でSSHを行って下さい

ステップ8:動作確認

サーバ構築されたので動作確認を行います

SSHの確認

先程作成したsshユーザでVPSサーバにログインします(/path/tp/onagatani.id_rsaの箇所はご自身で作成された秘密鍵名に変更して下さい)

# ssh -i /path/to/onagatani.id_rsa onagatani@test.colsis.jp 

一度サーバを再起動する

VPSなどのサーバはkernelのアップデートなどの適用でOSの再起動が必要になる事がありますが、長い間運用してから再起動するのは怖いものです。一度再起動します。

$ sudo reboot

MTの動作確認

DNS設定したドメイン名でMTへアクセスしてみます。(例:https://test.colsis.jp/mt/admin)

sakura7.png

問題なければMTのセットアップ画面が表示されるはずです。通常のMTと同じようにアカウントの作成を行って下さい。

PSGI起動のMTはカスタムフィールドの追加やプラグインの追加時に自動的に反映されませんので以下の機能でMTを再起動して下さい

sakura8.png

サイトの設定

サイトURL及びサイトパスは今回VPSに割り当てたドメイン名で変更して下さい

sakura9.png

サーバの利用方法

  • MTのURL:https://設定したドメイン/mt/admin
  • MTのインストールディレクトリ:/var/www/movabletype
  • ドキュメントルート:/var/www/vhosts/設定したドメイン/htdocs
  • apacheログ:/var/www/vhosts/設定したドメイン/logs
  • プラグインの設置場所:/var/www/movabletype/plugins
  • perlのパス:/usr/local/perl-5.30/bin/perl
  • CPANモジュールの追加コマンド:# sudo /usr/local/perl-5.30/bin/cpm install -g モジュール名
  • MySQLのログインコマンド:# mysql -uroot -p設定したパスワード (rootにスイッチした場合はmysqlのみでログインできます)
  • MTの再起動:# sudo supervisorctl restart movabletype
  • ランペリの再起動:# sudo supervisorctl restart run-periodic-tasks (カスタムフィールドを追加した場合はランペリの再起動も必要です)
  • FTP:FTPは利用できませんのでsshユーザを利用してSFTPで接続して下さい

まとめ

如何でしたでしょうか。ゼロからサーバを構築する場合は非常に時間がかかりますが Ansibleを利用する事で非常に短時間でサーバの構築が行えたかと思います。
運用ではセキュリティパッチの適用などがあるので注意が必要ですが月額1000円以下でroot権限付きで自由に触れる高速なサーバが利用できるのはメリットも大きいかと思います。
是非一度チャレンジしてみて下さい。

おまけ

apache benchで速度を計測してみました。
https(SSL)でindex.htmlを計測

ab -n 1024 -c 256 https://test.colsis.jp/
Requests per second:    119.20 [#/sec] (mean)
 ab -n 1024 -c 256 https://test.colsis.jp/phpinfo.php
Requests per second:    128.17 [#/sec] (mean)

http(非SSL)でindex.htmlを計測

ab -n 2048 -c 512 http://test.colsis.jp/
Requests per second:    6312.80 [#/sec] (mean)

SSLは重いですね、、とはいえevent mpmのおかげで1GメモリのVPSのapacheでもhttpであれば6千を超えているのでまぁ良いのかなと思います

このサーバに最適なMTライセンス

MTとMTAppjQueryがセットで単体で買うよりお安いパックがあります。是非購入ください(宣伝)

MTAppjQuery+MTライセンスパック|MTライセンスパックの通販なら株式会社COLSISの 3rd Focus|3rdFocus Movable Typeの便利なプラグイン、テーマ、解説書

一覧にもどる