長年、個人的な 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 を使用する際に必須となるモジュール、DBI
と DBD::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"
---