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 への対応
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
: 完全なユニットファイルを編集(エディタが開く)
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_connect
を on
にしないと、 SELinux によって Apache から starman のポート (5000) への接続がブロックされる。
Starman の起動
systemctl --now enable starman
テーマ
デフォルトのテーマ Mont-Blanc は空テンプレートなので、再構築しても html は生成されない。22
-
動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩
-
RHEL 9.0 は、この Application Stream の初期バージョンとして MariaDB 10.5 を提供します。
追加の MariaDB バージョンは、RHEL 9 のマイナーリリースで、ライフサイクルが短いモジュールとして提供されます。
第2章 MariaDB の使用 | Red Hat Product Documentation - docs.redhat.com ↩ -
RHEL 9.4 で、
mariadb:10.11
モジュールストリームとして MariaDB 10.11 が導入されました。MariaDB 10.11 の場合は、
第2章 MariaDB の使用 | Red Hat Product Documentation - docs.redhat.com ↩mariadb
モジュールからストリーム (バージョン)11
を選択し、server プロファイルを指定します。 -
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 ↩ -
pwmake は、大文字、小文字、数字、特殊文字の 4 つの文字グループすべてで設定されるランダムパスワードを生成するためのコマンドラインツールです。このユーティリティーでは、パスワードの生成に使用するエントロピービットの数を指定することができます。エントロピーは
/dev/urandom
からプルされます。攻撃者がパスワードハッシュファイルに直接アクセスできないアプリケーションでは、64 ビットで十分です。攻撃者がパスワードハッシュを直接入手する可能性がある場合や、パスワードを暗号化キーとして使用する場合は、80 ビットから 128 ビットを使用する必要があります。
第4章 ツールとサービスでシステムを強化する | Red Hat Product Documentation - docs.redhat.com ↩ -
memcached サーバーのアドレスとポート番号をペアで記述します。
MemcachedServers - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩ -
MemcachedServer が設定されている場合、この環境変数で Perl のどのパッケージを利用するかを決定します。初期設定では Cache::Memcached を利用するようになっています。
MemcachedDriver - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩ -
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 client
Cache::Memcached::Fast - Perl client for memcached, in C language - metacpan.org - metacpan.org ↩ -
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 ↩ -
ダイナミックパブリッシングを利用しない場合は、PHP のインストールは必要ありません。
動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩ -
PHP: Supported Versions - www.php.net ↩
-
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 ↩ -
UTF-8 のみ(r.4607 以降で utf8mb4 に対応)
動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩ -
cpanminusはCPANからモジュールを取り、アンパックし、ビルドして、インストールするスクリプトで、 他のことは何もしません。
cpanmは依存がありません(それ自身で動かせます)。設定も不要で、スタンドアローンです。 実行時に10MBのRAMしか必要としません。
App::cpanminus - CPANからモジュールを取り、アンパックし、ビルドして、インストールする - perldoc.jp - perldoc.jp ↩ -
mod_perlからFastCGI、PSGIまでの今昔物語 時代の移り変わりに伴うデプロイ手法の変化 | ログミーBusiness - logmi.jp ↩
-
XMLRPCサーバー(mt-xmlrpc.cgi)の動作にはXMLRPC::Transport::HTTP::Plackモジュールが必要になります。
mt.psgiの起動 · movabletype/Documentation Wiki · GitHub - github.com/movabletype ↩ -
Movable Type の依存する cpan モジュールのうち、Perl のみで書かれた一部のモジュールは ${MT_HOME}/extlib に含まれています。-I オプションを指定しない場合、starman で読み込まれるモジュールに関しては、extlib ではなくサーバーにインストールされているバージョンを優先して読み込む形となり、Movable Type の想定しているバージョンとずれてしまうことがあります。そういった問題を防ぐために、starman には -I オプションを付けて起動することが推奨されています。
PSGI Plack 環境で Movable Type を動かす | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩ -
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 ↩ -
-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 ↩ -
Movable Type を PSGI で運用する際に、プロセス ID (PID) の指定をおこないます。
PIDFilePath - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩ -
Movable Type 7 では、サイト作成時に選択するテーマに「Mont-Blanc」が初期値として設定されます。
「Mont-Blanc」は、サイトをスクラッチで作成する目的で用意された標準テーマです。
そのため、「Mont-Blanc」テーマに含まれるのはシステムテンプレートのみとなり、再構築してもファイルは出力されません。
「Mont-Blanc」テーマのサイトで再構築してもファイルが生成されない - Movable Type Q&A | CMSプラットフォーム Movable Type ドキュメントサイト - www.movabletype.jp ↩