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

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 で必要なデータベースのシステム要件は以下の通り。 [^db_requirements]

* 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 のみ）


[^db_requirements]: <cite>[動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/system_requirements.html) - <i>www.movabletype.jp</i></cite>

#### データベースサーバーのインストール
主に 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 を導入する必要がある。
```bash
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
```

:::note
MySQL 8.4 LTS の MySQL の公式サポート期限は2032年4月。[^mysql_support]
:::
[^mysql_support]: <cite>[さいきんの MySQL との付き合い方 〜 MySQL 8.0 より後の世界へようこそ 〜 | ドクセル](https://www.docswell.com/s/hmatsu47/Z3GL92-2025-02-07-144215#p13)</cite>

##### MySQL Server (AppStream)
デフォルトの AppStream で MySQL をインストールした場合は、以下のコマンドで MySQL Server 8.0 がインストールできる。
```bash
dnf --assumeyes install mysql-server && systemctl --now enable mysqld
```

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

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

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


##### MariaDB Server (AppStream)
MariaDB をインストールしたい場合、以下のコマンドで MariaDB 10.5 がインストールできる。[^mariadb_10_5]
```bash
dnf install mariadb-server && systemctl --now enable mariadb
```

[^mariadb_10_5]: <q cite="https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-mariadb_configuring-and-using-database-servers#installing-mariadb_using-mariadb">RHEL 9.0 は、この Application Stream の初期バージョンとして **MariaDB 10.5** を提供します。</q><q cite="https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-mariadb_configuring-and-using-database-servers#installing-mariadb_using-mariadb">追加の MariaDB バージョンは、RHEL 9 のマイナーリリースで、ライフサイクルが短いモジュールとして提供されます。</q><cite>[第2章 MariaDB の使用 | Red Hat Product Documentation](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-mariadb_configuring-and-using-database-servers#installing-mariadb_using-mariadb) - <i>docs.redhat.com</i></cite>

:::note
AlmaLinux 9.4 (RHEL 9.4) から MariaDB 10.11 がモジュールストリームとして利用できるようになったので、利用したい場合は以下のようにバージョンを指定してインストールする。 [^mariadb_10_11]
```bash
dnf module install mariadb:10.11/server
```
:::

[^mariadb_10_11]: <q cite="https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-mariadb_configuring-and-using-database-servers#installing-mariadb_using-mariadb">RHEL 9.4 で、`mariadb:10.11` モジュールストリームとして **MariaDB 10.11** が導入されました。</q><q cite="https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-mariadb_configuring-and-using-database-servers#installing-mariadb_using-mariadb">**MariaDB 10.11** の場合は、`mariadb` モジュールからストリーム (バージョン) `11` を選択し、server プロファイルを指定します。</q><cite>[第2章 MariaDB の使用 | Red Hat Product Documentation](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-mariadb_configuring-and-using-database-servers#installing-mariadb_using-mariadb) - <i>docs.redhat.com</i></cite>

#### パスワードの生成

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

:::note
パスワードは OWASP の Password Special Characters を参考にしているが、混乱を避けるために ` ` `"` `'` `\` &#96; `|` を除外。 [^password]
:::

:::note
pwmake コマンドを使って `pwmake 80` などとしてもよい。 [^pwmake]
:::

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

#### mysql_secure_installation
```bash
mysql_secure_installation
```

#### mysql_config_editor
```bash
mysql_config_editor set --host=localhost --user=root --password
```

#### ページャーの設定
```bash
echo -e "[mysql]\npager = less -SFXin" > ~/.my.cnf
```

[^password]: <q>Password special characters is a selection of punctuation characters that are present on standard US keyboard and frequently used in passwords.</q><cite>[Password Special Characters | OWASP Foundation](https://owasp.org/www-community/password-special-characters) - <i>www.owasp.org</i></cite>

### Apache HTTPD Server
```bash
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 サーバーをインストールして、自動起動設定および起動する。
```bash
dnf --assumeyes install memcached
systemctl --now enable memcached
```

#### Memcached サーバーの有効化
`MemcachedServers` でサーバーを指定することで有効化される。[^MemcachedServers]
```bash
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
```

[^MemcachedServers]: <q>memcached サーバーのアドレスとポート番号をペアで記述します。</q><cite>[MemcachedServers - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/appendices/config-directives/memcachedservers.html) - <i>www.movabletype.jp</i></cite>

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

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

| Memcached ドライバー | Ver. | 更新日 | GitHub |
|:--|:-:|:-:|:--|
| [Cache::Memcached](https://metacpan.org/pod/Cache::Memcached)             | 1.30 | 2012-05-19 | [Commits](https://github.com/memcached/perl-Cache-Memcached/commits/master/) |
| [Cache::Memcached::Fast](https://metacpan.org/pod/Cache::Memcached::Fast) | 0.28 | 2022-10-01 | [Commits](https://github.com/JRaspass/Cache-Memcached-Fast/commits/master/) |
| [Cache::Memcached::Fast::Safe](https://metacpan.org/pod/Cache::Memcached::Fast::Safe) | 0.06 | 2017-09-11 | [Commits](https://github.com/kazeburo/Cache-Memcached-Fast-Safe/commits/master/) |

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

[^MemcachedDriver]: <q cite="https://www.movabletype.jp/documentation/appendices/config-directives/memcacheddriver.html">MemcachedServer が設定されている場合、この環境変数で Perl のどのパッケージを利用するかを決定します。初期設定では Cache::Memcached を利用するようになっています。</q><cite>[MemcachedDriver - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/appendices/config-directives/memcacheddriver.html) - <i>www.movabletype.jp</i></cite>

##### Cache::Memcached
Perl で書かれた Memcached ドライバー。
```bash
dnf install 'perl(Cache::Memcached)'
```

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

[^Cache::Memcached::Fast]: <q cite="https://metacpan.org/pod/Cache::Memcached::Fast">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.</q><q cite="https://metacpan.org/pod/Cache::Memcached::Fast">API is largely compatible with Cache::Memcached, original pure Perl client</q><cite>[Cache::Memcached::Fast - Perl client for memcached, in C language - metacpan.org](https://metacpan.org/pod/Cache::Memcached::Fast) - <i>metacpan.org</i></cite>

```bash
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 を呼び出す。 [^Cache::Memcached::Fast::Safe]

[^Cache::Memcached::Fast::Safe]: <q cite="https://metacpan.org/pod/Cache::Memcached::Fast::Safe">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.</q><cite>[Cache::Memcached::Fast::Safe - Cache::Memcached::Fast with sanitizing keys and fork-safe - metacpan.org](https://metacpan.org/pod/Cache::Memcached::Fast::Safe) - <i>metacpan.org</i></cite>

```bash
cpanm Cache::Memcached::Fast::Safe
echo "MemcachedDriver Cache::Memcached::Fast::Safe" >> /var/www/cgi-bin/mt/mt-config.cgi
```
:::note
依存関係で Cache::Memcached::Fast もインストールされる。
:::

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

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

[^php]: <q>[ダイナミックパブリッシング](https://www.movabletype.jp/documentation/mt8/admin-guide/manage-site/dynamic-publishing/)を利用しない場合は、PHP のインストールは必要ありません。</q><cite>[動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/system_requirements.html) - <i>www.movabletype.jp</i></cite>

#### PHP 8.4
PHP 公式によって2028年12月31日までサポートされる。 [^supported-versions]

[^supported-versions]: <cite>[PHP: Supported Versions](https://www.php.net/supported-versions.php) - <i>www.php.net</i></cite>

```bash
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 でモジュールに追加される予定。[^php8.3]
[^php8.3]: <q cite="https://access.redhat.com/solutions/7064136">RHEL 9.6 as well as RHEL 10 will ship PHP 8.3.</q><cite>[Is PHP 8.3 available on RHEL 8/9? - Red Hat Customer Portal](https://access.redhat.com/solutions/7064136) - <i>access.redhat.com</i></cite>

#### PHP 8.2
RHEL 9 Application Streams リリースのライフサイクルで2029年5月までサポートされる。
[^]: <cite>[Red Hat Enterprise Linux Application Streams ライフサイクル - Red Hat Customer Portal](https://access.redhat.com/ja/node/4167391) - <i>access.redhat.com</i></cite>
```bash
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月までサポートされる。
```bash
dnf --assumeyes module reset php
dnf --assumeyes install php
```

## Movable Type

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

:::note
文字コードは r.4607 以降で utf8mb4 に対応[^charset]
:::

[^charset]: <q>UTF-8 のみ（r.4607 以降で utf8mb4 に対応）</q><cite>[動作に必要な環境とブラウザの対応 | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/system_requirements.html) - <i>www.movabletype.jp</i></cite>

### Movable Type の展開
[https://github.com/movabletype/movabletype/tags](https://github.com/movabletype/movabletype/tags)
```bash
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 の設定
```bash
cat << EOF > /etc/httpd/conf.d/cgi.conf
```
```apache
<Directory "/var/www/cgi-bin">
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
    Require all granted
</Directory>
```
```bash
EOF
```

### Perl モジュール
#### Perl のインストール
```bash
dnf --assumeyes install perl
```

#### cpanminus のインストール
cpanminus (cpanm) は CPAN からモジュールをインストールするスクリプト。依存がなく、実行時に10MBしかメモリーを必要としない。[^cpanminus]
```bash
curl -L http://cpanmin.us | perl - --sudo App::cpanminus
```

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

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

##### rpm パッケージ
```bash
dnf --assumeyes install 'perl(HTML::Entities)' 'perl(DBD::mysql)'
```

##### CPAN
```bash
cpanm HTML::Entities DBD::mysql
```

#### オプションの Perl モジュール
##### rpm パッケージ
```bash
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
```bash
cpanm Authen::SASL Graphics::Magick Image::Magick Path::Class Sys::MemInfo XML::LibXML::SAX YAML::Syck
```
```bash
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 への対応
[^psgi]

[^psgi]: <cite>[mod_perlからFastCGI、PSGIまでの今昔物語　時代の移り変わりに伴うデプロイ手法の変化 | ログミーBusiness](https://logmi.jp/main/technology/328851) - <i>logmi.jp</i></cite>

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

:::note
XMLRPC サーバー（mt-xmlrpc.cgi）を利用する場合には XMLRPC::Transport::HTTP::Plack モジュールが必要なので、以下のコマンドをでインストールする。[^xmlrpc]
```bash
dnf install expat-devel
cpanm XMLRPC::Transport::HTTP::Plack
```
expat-devel がないとこけるらしい（未検証）。なくても `cpanm Task::Plack` は通った。
:::


[^xmlrpc]: <q>XMLRPCサーバー(mt-xmlrpc.cgi)の動作にはXMLRPC::Transport::HTTP::Plackモジュールが必要になります。</q><cite>[mt.psgiの起動 · movabletype/Documentation Wiki · GitHub](https://github.com/movabletype/Documentation/wiki/mt.psgi%E3%81%AE%E8%B5%B7%E5%8B%95) - <i>github.com/movabletype</i></cite>

### Starman の動作テスト
Starman が動作するか確認するために、一時的に（`--permanent` オプションを付けずに）5000番ポートを空けてから Starman をバックグラウンドで起動する。
接続が確認できたらプロセスを殺して firewalld の設定をリロードするとポートは閉じられる。
```bash
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 用のディレクトリの作成
```bash
mkdir --verbose /run/starman
chown --changes apache:apache $_
```

:::note
PID に `/var/run/mt.pid` を指定すると以下のようにパーミッションで拒否されるので、予めディレクトリを作成してそこに権限を与える。
```
Couldn't open pid file "/var/run/mt.pid" [Permission denied].
```
:::

#### サービスファイルの作成
サービスを追加するのに直接ファイルを作成している記述も見かけるが、 `systemctl edit` コマンドを使えばパスの指定や `systemctl daemon-reload` の必要がなくなる。
```bash
systemctl edit --force --full starman.service
```
```ini
[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
```
:::note
**systemctl edit のオプション**
`--force`: サービスファイルが存在しなければ新規作成
`--full`: 完全なユニットファイルを編集（エディタが開く）
:::

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

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

[^starman-option]: <q>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.</q><cite>[starman - Starman launcher - metacpan.org](https://metacpan.org/dist/Starman/view/script/starman#-preload-app) - <i>metacpan.org</i></cite>

[^plackup]: <q>**-I** Specifies Perl library include paths, like perl's -I option. You may add multiple paths by using this option multiple times.</q><cite>[plackup - Run PSGI application with Plack handlers - metacpan.org](https://metacpan.org/dist/Plack/view/script/plackup) - <i>metacpan.org</i></cite>

[^starman]: <cite>[starman - Starman launcher - metacpan.org](https://metacpan.org/dist/Starman/view/script/starman) - <i>metacpan.org</i></cite>

### Movable Type の設定
```bash
echo -e "\nPIDFilePath /run/starman/mt.pid" >> /var/www/cgi-bin/mt/mt-config.cgi
```
Movable Type を PSGI で起動する場合、プロセス ID (PID) の指定をおこなう必要があるので、 mt-config.cgi に `PIDFilePath` で指定する。[^pidfilepath]

[^pidfilepath]: <q>Movable Type を PSGI で運用する際に、プロセス ID (PID) の指定をおこないます。</q><cite>[PIDFilePath - 環境変数リファレンス | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/appendices/config-directives/pidfilepath.html) - <i>www.movabletype.jp</i></cite>

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

## リバースプロキシ
### Apache の設定
```bash
cat << EOF > /etc/httpd/conf.d/movabletype.conf
```
```apache
<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>
```
```bash
EOF
```
```bash
setsebool -P httpd_can_network_connect on
httpd -t && systemctl reload httpd
```
:::note
`httpd_can_network_connect` を `on` にしないと、 SELinux によって Apache から starman のポート (5000) への接続がブロックされる。
:::

### Starman の起動
```bash
systemctl --now enable starman
```

## テーマ
:::note alert
デフォルトのテーマ Mont-Blanc は空テンプレートなので、再構築しても html は生成されない。[^mont-blanc]
:::

[^mont-blanc]: <q>Movable Type 7 では、サイト作成時に選択するテーマに「Mont-Blanc」が初期値として設定されます。</q><q>「Mont-Blanc」は、サイトをスクラッチで作成する目的で用意された標準テーマです。</q><q>そのため、「Mont-Blanc」テーマに含まれるのはシステムテンプレートのみとなり、再構築してもファイルは出力されません。</q><cite>[「Mont-Blanc」テーマのサイトで再構築してもファイルが生成されない - Movable Type Q&A | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/faq/no-file-published-by-rebuild.html) - <i>www.movabletype.jp</i></cite>