さくらの VPS (Ubuntu 22.04 amd64 + nginx) で Movable Type 実行環境を作る

さくら VPS (Ubuntu 22.04 amd64 + nginx) 上で Movable Type を実行するための環境を構築した件について簡単に手順をまとめました。

長年、個人的な Web サイトに関しては、CentOS と Apache っていう環境で運用してきたこともあって、Movable Type についても同環境でしか動かしてなかったんですけども (仕事ではもちろん別の環境も触りますが、立ち上げから保守管理まで全部自分で責任を持つって状況ではという話です)、年の瀬にそろそろ個人で運用しているサーバのリプレースでもしよっかなと思い立ちまして。

それで、この機会に CentOS + Apache から離れて Ubuntu や nginx をきちんと使ってみたいなということで、さくらの VPS さんで新規に VPS 立ち上げて、標準 OS として用意されている Ubuntu 22.04 amd64 に Web サーバは nginx という組み合わせで新しい環境を作ってみました。

nginx で perl を動作させたことがなかったのでちょっとだけ不安だったんですが、fcgiwrap を使用することで比較的簡単に環境を整えることができましたので、その辺の手順を備忘録として残しておこうと思います。

ちなみに、ローカル環境は Windows 11、CLI としては PowerShell 7 を使用しています。

SSH 用の鍵生成とか

まずローカルで SSH に必要な秘密鍵と公開鍵ペアを作ります。署名アルゴリズムは 「ed25519」 を指定 (-t オプション)、管理がしやすいようにファイル名も指定 (-f オプション) しておきます。

ssh-keygen -t ed25519 -f ed25519_file_name

これで、ユーザーのホームディレクトリに鍵ペアが生成されます。

あとはサーバに SSH して公開鍵をコピー。ssh-copy-id が使える環境ならそれで。Windows は ssh-copy-id が使えないので SSH して公開鍵の中身を authorized_keys に追加します。

cat ~/.ssh/ed25519_file_name.pub | ssh <username>@<remote_host> "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"

基本的なセットアップ

サーバに SSH したらまずは基本的なところを設定しておきます。

最初のお仕事。

sudo apt update
sudo apt upgrade

SSH のポート番号変更とかパスワードによるログインの禁止とか。

sudo vim /etc/ssh/sshd_config
---
# ポート番号をデフォルトの 22 から任意に変更
Port 22
# PasswordAuthentication オプションを on に
PasswordAuthentication no
---
sudo systemctl restart sshd

ファイアウォールの設定を確認、先ほど変更した SSH ポートを開放するなど。

sudo ufw status
# 有効になっていなければ有効に
sudo ufw enable
# 変更した SSH ポートを許可して設定を反映
sudo ufw allow <port>/tcp
sudo ufw reload

MySQL のインストール

インストール後、MySQL を立ち上げたら初期設定、その後、必要なユーザー作ったり DB 作ったり (割愛)。

sudo apt install mysql-server
sudo systemctl start mysql.service
sudo mysql

nginx のインストール

nginx をインストールして有効に。

sudo apt install nginx
sudo systemctl enable nginx

ファイアウォールで nginx が使うポートを許可。

sudo ufw allow 'Nginx Full'
sudo ufw reload

PHP のインストール

ダイナミックパブリッシングを利用しない場合、Movable Type の動作自体には直接関係ないですが他でも使うので。

sudo apt install php
sudo apt install php-fpm

Ubuntu 22.04 だと標準で PHP 8.1 が入るんですね (本記事執筆時点)。

CGI 実行環境の構築

さて、ここからが Perl 動かすためのセットアップです。まず、fcgiwrap をインストール。

sudo apt install fcgiwrap

すると、/usr/share/doc/fcgiwrap/examples/ に nginx 設定ファイルのサンプルができるので、これをコピーして流用します。

sudo cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf

コピーした設定ファイルを下記のように変更。

sud vim /etc/nginx/fcgiwrap.conf
---
# Include this file on your nginx.conf to support debian cgi-bin scripts using
# fcgiwrap
location ~ \.cgi(/|$) {
  # Disable gzip (it makes scripts feel slower since they have to complete
  # before getting gzipped)
  gzip off;

  # Set the root to /usr/lib (inside this location this means that we are
  # giving access to the files under /usr/lib/cgi-bin)
  #root /usr/lib;

  # Fastcgi socket
  fastcgi_pass  unix:/var/run/fcgiwrap.socket;

  # Fastcgi parameters, include the standard ones
  include /etc/nginx/fastcgi_params;

  # fastcgi_split_path_info
  fastcgi_split_path_info ^(.+?\.cgi)(/.*)$;

  # Adjust non standard parameters
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
---

nginx を再起動。

sudo systemctl restart nginx

fcgiwrap のステータスを確認して、(多分有効になっていないので) 有効にしておきます。

sudo systemctl status fcgiwrap
sudo systemctl enable fcgiwrap

バーチャルホストの設定

この辺は実際に運用する Web サイトによりますけども、ホスト名ごとに設定ファイルを作って......

sudo vim /etc/nginx/sites-available/example.com
---
server {
  listen 80;
  listen [::]:80;
  root /var/www/html/example.com;
  index index.html index.shtml index.cgi index.php index.xml;
  server_name example.com;

  # 先ほど作った fcgiwrap の設定ファイルを読み込めば CGI が有効に
  include /etc/nginx/fcgiwrap.conf;

  # エラーページの設定とか、SSI 使うとか、キャッシュ設定などは必要に応じて
  # Error Page
  error_page 403 /err/403/;
  error_page 404 /err/404/;
  error_page 500 /err/500/;

  # SSI
  location / {
    ssi on;
    ssi_last_modified on;
  }

  # Cache
  location ~ .*\.(jpg|gif|png|svg|css|js) {
    expires 30d;
  }
}
---

作った設定ファイルのシンボリックリンクを nginx が起動時に読み取る sites-enabled ディレクトリに作成して有効に。

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo systemctl restart nginx

サーバ証明書 (Let's Encrypt) の取得

nginx 向けの certbot をインストール。

sudo apt install certbot python3-certbot-nginx

あとはもう certbot さんにお任せ。nginx のバーチャルホスト設定ファイルも勝手に書き換えてくれますのであとで必要に応じて修正すればよいでしょう。

sudo certbot --nginx -d example.com

HTTP2 を有効にしたいので listen ディレクティブに http2 を追加したり、HTTP でアクセスされた場合のリダイレクトなど、必要なら設定します (この辺もある程度 certbot さんにお任せすれば書き換えてくれるので楽)。

---
server {
  listen [::]:443 ssl http2;
  listen 443 ssl http2;
...略...
}

server {
  if ($host = example.com) {
    return 301 https://$host$request_uri;
  }

  listen 80;
  listen [::]:80;
  server_name example.com;
  return 404;
}
---

念のため nginx 設定ファイルにエラーがないかをチェックしたりして、あとは nginx を再起動。

nginx -t
sudo systemctl restart nginx

mt-check.cgi を設置してみる

ここまで行ったらとりあえず mt-check.cgi だけ設置して動作確認してみましょう。ついでに次のステップでインストールが必要な Perl モジュールを確認します。

とりあえずユーザーのホームディレクトリに mt-check.cgi を SCP で転送。

scp -P <port> -i ~/.ssh/ed25519_file_name mt-check.cgi <username>@<remote_host>:~/

あとは先ほど設定したバーチャルホストのディレクトリに mt-check.cgi を移動して......

sudo mv mt-check.cgi /var/www/html/example.com/

権限設定...... なんですが Ubuntu 上の nginx って実行ユーザーが www-data なんですね。ということで所有者とかも www-data にそろえとく。

cd /var/www/html
sudo chown -R www-data:www-data example.com
sudo chmod 755 example.com/mt-check.cgi

mt-check.cgi にアクセスしてチェック結果が表示されればとりあえず OK。最後に Perl モジュールのインストールを行います。

Perl モジュールのインストール

最後に Movable Type の動作に必要な Perl モジュールをインストールしていきます。

長年、Perl モジュールと言えば CPAN からインストールするってのに慣れていましたけども、Ubuntu では apt でインストールできるんですね。便利。

パッケージ名の記述方法がちょっと特殊で、例えば DBD::mysql なら libdbd-mysql-perl みたいに、

  • 先頭に lib
  • ::- に変換
  • 末尾に -perl が付く

って法則で変更するみたいです。この法則で見つからないモジュールは、モジュール名 Ubuntu みたいにググればだいたい何とかなると思います。

ということで、例えば MySQL を使用する際に必須となるモジュール、DBIDBD::mysql を入れる場合は下記のように。

sudo apt install libdbi-perl libdbd-mysql-perl

あとは、mt-check.cgi を確認しながらオプションモジュール含めて、必要なモジュールを入れていきます。私の場合面倒なので一旦オプションモジュール一覧を前述した法則で変換した上で下記のように一発ぶちかましてみましたが、

sudo apt install \
libarchive-zip-perl \
libauthen-sasl-perl \
libcgi-psgi-perl \
libcache-memcached-perl \
libdatetime-perl \
libgd-perl \
libgraphics-magick-perl \
libhttp-dav-perl \
libio-socket-ssl-perl \
libipc-run-perl \
libimage-magick-perl \
libimager-perl \
libjson-pp-perl \
libjson-xs-perl \
liblwp-protocol-https-perl \
liblwpx-paranoidagent-perl \
liblog-log4perl-perl \
libnet-ssleay-perl \
libpath-class-perl \
libplack-perl \
libsys-meminfo-perl \
libterm-encoding-perl \
libtheschwartz-perl \
libxml-atom-perl \
libxml-parser-perl \
libxml-sax-expat-perl \
libxml-sax-expatxs-perl \
libxml-xpath-perl \
libyaml-syck-perl \
liblocal-lib-perl

下記のパッケージだけ見つからないって怒られました。

E: Unable to Locate a Package libauthen-sasl-xs-perl
E: Unable to Locate a Package libcgi-parse-psgi-perl
E: Unable to Locate a Package libcache-file-perl
E: Unable to Locate a Package libdigest-sha1-perl
E: Unable to Locate a Package libfilesys-dfportable-perl
E: Unable to Locate a Package liblog-minimal-perl
E: Unable to Locate a Package libmozilla-ca-perl
E: Unable to Locate a Package libnet-ftpssl-perl
E: Unable to Locate a Package libnet-sftp-perl
E: Unable to Locate a Package libxml-libxml-sax-perl
E: Unable to Locate a Package libxmlrpc-transport-http-plack-perl

なかったものは個別に apt search して探してみればよいと思います。

モジュールのインストールが完了したら、あとは Movable Type をインストールすれば終わりです。

その他

あと fcgiwrap の設定で FCGI_CHILDREN の値 (待機プロセス数) はサーバスペックや運用に合わせてチューニングできるかも。

sudo vim /etc/init.d/fcgiwrap
---
# デフォルトでは 1 になってるけど、増やしてもいいかも?
FCGI_CHILDREN="1"
---

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?