2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Movable Type 8.5 を PSGI で AlmaLinux 9.5 にセットアップする

Last updated at Posted at 2025-03-13

RHEL 9.x 系統の最新環境で Movable Type をインストースル標準手順をまとめました。
いいねを押下して貰えると執筆の励みになります。

環境

  • Movable Type 8.5.1
  • VirtualBox 7.1.6
  • AlmaLinux 9.5
  • Perl 5.32.1
  • MySQL Community Server 8.4.4
  • Apache 2.4.62
  • Memcached 1.6.9
  • PHP 8.4.5

LAMP 環境のセットアップ

データベースサーバー

Movable Type 8 で必要なデータベースのシステム要件は以下の通り。 1

  • MySQL 5.1 以上(5.7.x を推奨 / 8.0.x まで検証済み)
  • MariaDB 5.5 以上(10.5.x を推奨 / 10.11.x まで検証済み)
  • Oracle Database 12c(Movable Type Advanced のみ)
  • Microsoft SQL Server 2014 / 2016 / 2019(Azure SQL Database を含む)(Movable Type Advanced のみ)

データベースサーバーのインストール

主に MySQL 8.4 LTS、MySQL 8.0、MariaDB 10.11、MariaDB 10.5 の選択肢がある。

MySQL Community Server (MySQL Yum Repository)

MySQL 8.4 LTS を利用するためには、 MySQL 公式の MySQL Yum Repository を導入する必要がある。

dnf --assumeyes install https://repo.mysql.com/mysql84-community-release-el9.rpm
dnf --assumeyes install mysql-community-server && systemctl start mysqld
systemctl status mysqld && awk '/password/ {print $NF}' /var/log/mysqld.log

MySQL 8.4 LTS の MySQL の公式サポート期限は2032年4月。2

MySQL Server (AppStream)

デフォルトの AppStream で MySQL をインストールした場合は、以下のコマンドで MySQL Server 8.0 がインストールできる。

dnf --assumeyes install mysql-server && systemctl --now enable mysqld

AppStream の mysql-server をインストールすると、空パスワードでインストールされる。

AppStream の mysql-server をインストールすると、ログファイルのパスが /var/log/mysql/mysqld.log となる。

AppStream の mysql-server をインストールすると、依存関係が異なり cmake や cyrus-sasl-devel などのパッケージが含まれないので、別途インストールしないと後の CPAN のインストールでこける。

dnf --assumeyes cmake cyrus-sasl-devel gd-devel gmp-devel
MariaDB Server (AppStream)

MariaDB をインストールしたい場合、以下のコマンドで MariaDB 10.5 がインストールできる。3

dnf install mariadb-server && systemctl --now enable mariadb

AlmaLinux 9.4 (RHEL 9.4) から MariaDB 10.11 がモジュールストリームとして利用できるようになったので、利用したい場合は以下のようにバージョンを指定してインストールする。 4

dnf module install mariadb:10.11/server

パスワードの生成

< /dev/random tr -dc 'A-Za-z0-9!#$%&()*+,-./:;<=>?@[]^_{}~' | fold -w 16 | head -n 5

パスワードは OWASP の Password Special Characters を参考にしているが、混乱を避けるために " ' \ ` | を除外。 5

pwmake コマンドを使って pwmake 80 などとしてもよい。 6

mysql_secure_installation

mysql_secure_installation

mysql_config_editor

mysql_config_editor set --host=localhost --user=root --password

ページャーの設定

echo -e "[mysql]\npager = less -SFXin" > ~/.my.cnf

Apache HTTPD Server

dnf --assumeyes install httpd mod_ssl
systemctl --now enable httpd
firewall-cmd --permanent --add-service=http{,s} && firewall-cmd --reload
firewall-cmd --list-services

メモリキャッシュサーバー

必須ではない。

Memcached のインストール

Memcached サーバーをインストールして、自動起動設定および起動する。

dnf --assumeyes install memcached
systemctl --now enable memcached

Memcached サーバーの有効化

MemcachedServers でサーバーを指定することで有効化される。7

echo -e "\n#======== MEMCACHED SETTINGS =========" >> /var/www/cgi-bin/mt/mt-config.cgi
echo -e "\nMemcachedServers 127.0.0.1:11211" >> /var/www/cgi-bin/mt/mt-config.cgi

Memcached ドライバー

MovableType で Memcached を利用するためにドライバーを必要とする。
Cache::Memcached 以外を利用したい場合は MemcachedDriver で指定する。8

特別な理由がなければ Cache::Memcached::Fast::Safe が無難。

Memcached ドライバー Ver. 更新日 GitHub
Cache::Memcached 1.30 2012-05-19 Commits
Cache::Memcached::Fast 0.28 2022-10-01 Commits
Cache::Memcached::Fast::Safe 0.06 2017-09-11 Commits

Cache::Memcached 以外をインストールする場合は、 perl-CPAN パッケージまたは後述の cpanminus を事前にインストールする必要がある。

Cache::Memcached

Perl で書かれた Memcached ドライバー。

dnf install 'perl(Cache::Memcached)'
Cache::Memcached::Fast

モジュールのコア が C 言語で書かれた Memcached ドライバー。
システムコールの回数を最小限に抑え、キー/値のコピーを避けることで高速化を図っている。API はオリジナルの Cache::Memcached とほぼ互換性がある。 9

cpanm Cache::Memcached::Fast
echo "MemcachedDriver Cache::Memcached::Fast" >> /var/www/cgi-bin/mt/mt-config.cgi
Cache::Memcached::Fast::Safe

Cache::Memcached::Fast のサブクラスで、memcached インジェクション問題に対処するため、リクエストされたすべてのキーをサニタイズする。また、フォークセーフのため、フォーク後に自動的に disconnect_all を呼び出す。 10

cpanm Cache::Memcached::Fast::Safe
echo "MemcachedDriver Cache::Memcached::Fast::Safe" >> /var/www/cgi-bin/mt/mt-config.cgi

依存関係で Cache::Memcached::Fast もインストールされる。

PHP

最新版の PHP 8.4 を利用する場合は Remi's RPM repository、RHEL 9.4 以降は AppStream で PHP 8.2 をモジュール選択で利用可能、RHEL 9 の標準は PHP 8.0 になる。

ダイナミックパブリッシングを利用しない場合はインストール不要。11

PHP 8.4

PHP 公式によって2028年12月31日までサポートされる。 12

dnf --assumeyes install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf --assumeyes module reset php
dnf --assumeyes module enable php:remi-8.4
dnf module list php | grep '\[e\]'
dnf --assumeyes install php

PHP 8.3

PHP 8.3 は RHEL 9.6 でモジュールに追加される予定。13

PHP 8.2

RHEL 9 Application Streams リリースのライフサイクルで2029年5月までサポートされる。
[^]: Red Hat Enterprise Linux Application Streams ライフサイクル - Red Hat Customer Portal - access.redhat.com

dnf --assumeyes module reset php
dnf --assumeyes module enable php:8.2
dnf module list php | grep '\[e\]'
dnf --assumeyes install php

PHP 8.0

RHEL 9 Full Life Application Streams リリースのライフサイクルで2032年5月までサポートされる。

dnf --assumeyes module reset php
dnf --assumeyes install php

Movable Type

データベース

< /dev/urandom tr -dc 'A-Za-z0-9!#$%&()*+,-./:;<=>?@[]^_{}~' | fold -w 16 | head -n 5
mysql
CREATE DATABASE `mt` CHARACTER SET 'utf8mb4';
CREATE USER 'mt_user'@'localhost' IDENTIFIED BY 'P@ssword';
GRANT ALL ON mt.* TO 'mt_user'@'localhost';
\q

文字コードは r.4607 以降で utf8mb4 に対応14

Movable Type の展開

https://github.com/movabletype/movabletype/tags

MT_PATH='movabletype/movabletype'
MT_VERSION=8.5
MT_TAG=$(curl --silent https://api.github.com/repos/${MT_PATH}/tags | grep "${MT_VERSION}" | grep --max-count=1 '"name":' | sed -E 's/.*"name": "([^"]+).*/\1/') && echo ${MT_TAG}
MT_TAR_GZ="${MT_TAG}.tar.gz"
curl --location --remote-name https://github.com/${MT_PATH}/archive/refs/tags/${MT_TAR_GZ}
dnf --assumeyes install tar
MT_HOME='/var/www/cgi-bin/mt'
mkdir --verbose ${MT_HOME}
tar --extract --file=${MT_TAR_GZ} --strip-components=1 --directory=/var/www/cgi-bin/mt
ln --symbolic --verbose ${MT_HOME}/mt-static /var/www/html/
chcon --verbose --type=httpd_sys_content_rw_t /var/www/{html,cgi-bin/{mt,mt/mt-static/support}}
chown --changes apache:apache /var/www/{html,cgi-bin/{mt,mt/mt-static/support}}

Apache の設定

cat << EOF > /etc/httpd/conf.d/cgi.conf
<Directory "/var/www/cgi-bin">
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
    Require all granted
</Directory>
EOF

Perl モジュール

Perl のインストール

dnf --assumeyes install perl

cpanminus のインストール

cpanminus (cpanm) は CPAN からモジュールをインストールするスクリプト。依存がなく、実行時に10MBしかメモリーを必要としない。15

curl -L http://cpanmin.us | perl - --sudo App::cpanminus

必須の Perl モジュール

Perl モジュールをインストールするには、rpm パッケージ化されたものを DNF でインストールする方法と CPAN からビルドしてインストールする方法がある。
前者の方がインストール速度が速いがバージョンが古い場合があり、後者はバージョンが最新だがインストールに時間がかかる。
すべての Perl モジュールが rpm パッケージ化されている訳ではないので、rpm パッケージにあるものは DNF でインストールし、そうでないものを CPAN でインストールすると時短になる。

rpm パッケージ
dnf --assumeyes install 'perl(HTML::Entities)' 'perl(DBD::mysql)'
CPAN
cpanm HTML::Entities DBD::mysql

オプションの Perl モジュール

rpm パッケージ
dnf --assumeyes install 'perl(Authen::SASL)' 'perl(Graphics::Magick)' 'perl(Image::Magick)' 'perl(Path::Class)' 'perl(Sys::MemInfo)' 'perl(XML::LibXML::SAX)' 'perl(YAML::Syck)'
CPAN
cpanm Authen::SASL Graphics::Magick Image::Magick Path::Class Sys::MemInfo XML::LibXML::SAX YAML::Syck
cpanm Authen::SASL::XS DateTime Email::MIME Filesys::DfPortable Fluent::Logger HTTP::DAV IPC::Run Imager JSON::XS Log::Dispatch::Config Log::Dispatch::Configurator::Perl Log::Dispatch::Configurator::YAML Log::Log4perl Log::Minimal Net::SFTP Term::Encoding XML::SAX::Expat XML::SAX::ExpatXS

PSGI への対応

16

Starman のインストール

関連モジュールを一括インストールするための CPAN モジュール Task::Plack を cpanm でインストールする。

cpanm Task::Plack

XMLRPC サーバー(mt-xmlrpc.cgi)を利用する場合には XMLRPC::Transport::HTTP::Plack モジュールが必要なので、以下のコマンドをでインストールする。17

dnf install expat-devel
cpanm XMLRPC::Transport::HTTP::Plack

expat-devel がないとこけるらしい(未検証)。なくても cpanm Task::Plack は通った。

Starman の動作テスト

Starman が動作するか確認するために、一時的に(--permanent オプションを付けずに)5000番ポートを空けてから Starman をバックグラウンドで起動する。
接続が確認できたらプロセスを殺して firewalld の設定をリロードするとポートは閉じられる。

firewall-cmd --add-port=5000/tcp
starman --pid /run/mt.pid ./mt.psgi &
curl -s http://localhost:5000/cgi-bin/mt/mt.cgi | head
pkill starman
firewall-cmd --reload

ブラウザから http://192.168.56.101:5000/cgi-bin/mt/mt.cgi?__mode=tools&blog_id=0 へアクセスすると、「サーバーモデル」が PSGI になっているのが確認できる。

サービス化

PID 用のディレクトリの作成

mkdir --verbose /run/starman
chown --changes apache:apache $_

PID に /var/run/mt.pid を指定すると以下のようにパーミッションで拒否されるので、予めディレクトリを作成してそこに権限を与える。

Couldn't open pid file "/var/run/mt.pid" [Permission denied].

サービスファイルの作成

サービスを追加するのに直接ファイルを作成している記述も見かけるが、 systemctl edit コマンドを使えばパスの指定や systemctl daemon-reload の必要がなくなる。

systemctl edit --force --full starman.service
[Unit]
Description=Movable Type
After=syslog.target
After=network.target
After=mysqld.service

[Service]
User=apache
Group=apache
Restart=always
SyslogIdentifier=movabletype

WorkingDirectory=/var/www/cgi-bin/mt
ExecStart=/usr/local/bin/starman -I /var/www/cgi-bin/mt/extlib --pid /run/starman/mt.pid ./mt.psgi
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

systemctl edit のオプション
--force: サービスファイルが存在しなければ新規作成
--full: 完全なユニットファイルを編集(エディタが開く)

starman の起動に -I オプションで ${MT_HOME}/extlib を指定するのが推奨されているらしい。18
-I オプションは perl の -I オプションと同様に Perl ライブラリのインクルードパスを指定する。このオプションを複数回使用して複数のパスを追加できる。1920

Movable Type の設定

echo -e "\nPIDFilePath /run/starman/mt.pid" >> /var/www/cgi-bin/mt/mt-config.cgi

Movable Type を PSGI で起動する場合、プロセス ID (PID) の指定をおこなう必要があるので、 mt-config.cgi に PIDFilePath で指定する。21

公式では /var/run/mt.pid としているが、RHEL 系では /var/run/run にシンボリックリンクを貼っているだけなので、ここでは最初から /run とした。

リバースプロキシ

Apache の設定

cat << EOF > /etc/httpd/conf.d/movabletype.conf
<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /cgi-bin/mt/ http://localhost:5000/cgi-bin/mt/ timeout=300
    ProxyPassReverse /cgi-bin/mt/ http://localhost:5000/cgi-bin/mt/
</VirtualHost>
EOF
setsebool -P httpd_can_network_connect on
httpd -t && systemctl reload httpd

httpd_can_network_connecton にしないと、 SELinux によって Apache から starman のポート (5000) への接続がブロックされる。

Starman の起動

systemctl --now enable starman

テーマ

デフォルトのテーマ Mont-Blanc は空テンプレートなので、再構築しても html は生成されない。22

  1. 動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  2. さいきんの MySQL との付き合い方 〜 MySQL 8.0 より後の世界へようこそ 〜 | ドクセル

  3. RHEL 9.0 は、この Application Stream の初期バージョンとして MariaDB 10.5 を提供します。追加の MariaDB バージョンは、RHEL 9 のマイナーリリースで、ライフサイクルが短いモジュールとして提供されます。第2章 MariaDB の使用 | Red Hat Product Documentation - docs.redhat.com

  4. RHEL 9.4 で、mariadb:10.11 モジュールストリームとして MariaDB 10.11 が導入されました。MariaDB 10.11 の場合は、mariadb モジュールからストリーム (バージョン) 11 を選択し、server プロファイルを指定します。第2章 MariaDB の使用 | Red Hat Product Documentation - docs.redhat.com

  5. Password special characters is a selection of punctuation characters that are present on standard US keyboard and frequently used in passwords.Password Special Characters | OWASP Foundation - www.owasp.org

  6. pwmake は、大文字、小文字、数字、特殊文字の 4 つの文字グループすべてで設定されるランダムパスワードを生成するためのコマンドラインツールです。このユーティリティーでは、パスワードの生成に使用するエントロピービットの数を指定することができます。エントロピーは /dev/urandom からプルされます。攻撃者がパスワードハッシュファイルに直接アクセスできないアプリケーションでは、64 ビットで十分です。攻撃者がパスワードハッシュを直接入手する可能性がある場合や、パスワードを暗号化キーとして使用する場合は、80 ビットから 128 ビットを使用する必要があります。第4章 ツールとサービスでシステムを強化する | Red Hat Product Documentation - docs.redhat.com

  7. memcached サーバーのアドレスとポート番号をペアで記述します。MemcachedServers - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  8. MemcachedServer が設定されている場合、この環境変数で Perl のどのパッケージを利用するかを決定します。初期設定では Cache::Memcached を利用するようになっています。MemcachedDriver - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  9. Module core is implemented in C and tries hard to minimize number of system calls and to avoid any key/value copying for speed. As a result, it has very low CPU consumption.API is largely compatible with Cache::Memcached, original pure Perl clientCache::Memcached::Fast - Perl client for memcached, in C language - metacpan.org - metacpan.org

  10. Cache::Memcached::Fast::Safe is subclass of Cache::Memcached::Fast. Cache::Memcached::Fast::Safe sanitizes all requested keys for against memcached injection problem. and call disconnect_all automatically after fork for fork-safe.Cache::Memcached::Fast::Safe - Cache::Memcached::Fast with sanitizing keys and fork-safe - metacpan.org - metacpan.org

  11. ダイナミックパブリッシングを利用しない場合は、PHP のインストールは必要ありません。動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  12. PHP: Supported Versions - www.php.net

  13. RHEL 9.6 as well as RHEL 10 will ship PHP 8.3.Is PHP 8.3 available on RHEL 8/9? - Red Hat Customer Portal - access.redhat.com

  14. UTF-8 のみ(r.4607 以降で utf8mb4 に対応)動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  15. cpanminusはCPANからモジュールを取り、アンパックし、ビルドして、インストールするスクリプトで、 他のことは何もしません。cpanmは依存がありません(それ自身で動かせます)。設定も不要で、スタンドアローンです。 実行時に10MBのRAMしか必要としません。App::cpanminus - CPANからモジュールを取り、アンパックし、ビルドして、インストールする - perldoc.jp - perldoc.jp

  16. mod_perlからFastCGI、PSGIまでの今昔物語 時代の移り変わりに伴うデプロイ手法の変化 | ログミーBusiness - logmi.jp

  17. XMLRPCサーバー(mt-xmlrpc.cgi)の動作にはXMLRPC::Transport::HTTP::Plackモジュールが必要になります。mt.psgiの起動 · movabletype/Documentation Wiki · GitHub - github.com/movabletype

  18. Movable Type の依存する cpan モジュールのうち、Perl のみで書かれた一部のモジュールは ${MT_HOME}/extlib に含まれています。-I オプションを指定しない場合、starman で読み込まれるモジュールに関しては、extlib ではなくサーバーにインストールされているバージョンを優先して読み込む形となり、Movable Type の想定しているバージョンとずれてしまうことがあります。そういった問題を防ぐために、starman には -I オプションを付けて起動することが推奨されています。PSGI Plack 環境で Movable Type を動かす | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  19. Starman passes through other options given to Plack::Runner, the common backend that plackup uses, so the most options explained in plackup -h such as --access-log or --daemonize works fine in starman too.starman - Starman launcher - metacpan.org - metacpan.org

  20. -I Specifies Perl library include paths, like perl's -I option. You may add multiple paths by using this option multiple times.plackup - Run PSGI application with Plack handlers - metacpan.org - metacpan.org

  21. Movable Type を PSGI で運用する際に、プロセス ID (PID) の指定をおこないます。PIDFilePath - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

  22. Movable Type 7 では、サイト作成時に選択するテーマに「Mont-Blanc」が初期値として設定されます。「Mont-Blanc」は、サイトをスクラッチで作成する目的で用意された標準テーマです。そのため、「Mont-Blanc」テーマに含まれるのはシステムテンプレートのみとなり、再構築してもファイルは出力されません。「Mont-Blanc」テーマのサイトで再構築してもファイルが生成されない - Movable Type Q&A | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?