mlmmj の追加設定

前回の続き、公式マニュアルの後半の手順。
6)Reply-To: などのカスタムヘッダを設定
7)フッターの指定
8)件名のプレフィックスを指定
9)モデレートの設定

カスタムヘッダ

リストの配下にある control 配下に、customheaders というファイルを作成する。(ml-admin:MLの名前のパス)

# cat /var/spool/mlmmj/ml-admin/control/customheaders
Reply-To: ml-admin@example.com

フッターの指定

フッターの指定は、~/control/footer というファイルを作成して内容を記載する。
デフォルトでは、何もなく空白。

件名のプレフィックスを指定

~/control/prefix というファイルを作成して内容を記載する。
# echo "[mlmmj-admin]" > control/prefix

mailman等のように、件名に連番を入れる機能は標準では無さそう。

モデレートの設定

~/control/moderated を作成する。
詳しくは未検証。

アーカイブ

/var/spool/mlmmj/リスト名/archive の配下に作成される。

listdir/control の配下に「noarchive」という名前のファイルを作成しておくと、アーカイブが生成されなくなる。
既存のアーカイブを削除するには、OS上でファイルを直接削除する。

メーリングリスト mlmmj を使ってみる

mlmmj とは?

mlmmj は、シンプルな機能を備えたメーリングリスト

mlmmj 公式Webサイト
http://mlmmj.org/

Mlmmjは、「Mailing List Management Made Joyful」の略らしい。


主な特徴は以下の通り。

  • デーモンを必要とせず、省リソースで動作する。
  • MITライセンス
  • シンプルでありながら、色々な機能を備えている

機能の例は以下の通り。

個人的には、件名に連番を付ける機能が欲しかった。(おそらく標準で実装されていない)

ソースコードの最新版は、1.3.0 で 2017/5/24 リリースとなっている。
epelから入手可能なパッケージも、バージョンは同じ。

mlmmj のインストールと設定

<環境>
AlmaLinux 8/9(どちらも同等の手順)

前提として、epel リポジトリを利用可能であること。
/etc/yum.repos.d/epel.repo にて enabled=1 と設定するか、dnfの --enablerepo オプションで有効化する。


パッケージの中身を確認

# dnf repoquery --list mlmmj
/usr/bin/mlmmj-bounce
/usr/bin/mlmmj-list
/usr/bin/mlmmj-maintd
/usr/bin/mlmmj-make-ml
/usr/bin/mlmmj-make-ml.sh
/usr/bin/mlmmj-process
/usr/bin/mlmmj-receive
/usr/bin/mlmmj-receive-strip
/usr/bin/mlmmj-recieve
/usr/bin/mlmmj-send
/usr/bin/mlmmj-sub
/usr/bin/mlmmj-unsub
・・・省略
/usr/share/doc/mlmmj/web
/usr/share/doc/mlmmj/web/perl-admin
・・・省略
/usr/share/doc/mlmmj/web/perl-user
/usr/share/doc/mlmmj/web/perl-user/config.pl
/usr/share/doc/mlmmj/web/perl-user/example.html
/usr/share/doc/mlmmj/web/perl-user/mlmmj.cgi
/usr/share/doc/mlmmj/web/php-admin
・・・省略
/usr/share/mlmmj
/usr/share/mlmmj/text.skel
・・・省略
/usr/share/mlmmj/text.skel/it/wait-sub
/usr/share/mlmmj/text.skel/pt
・・・省略

上記で確認した限り、
 /usr/share/doc/mlmmj/web/perl-admin
 /usr/share/doc/mlmmj/web/php-admin
が用意されているので、perlPHPのWebUIが用意されている模様。

また、/usr/share/mlmmj/text.skel 配下に ja が存在しないので、定型文は日本語で提供されていない。


公式ドキュメントの手順を参考にすると、手順は以下の通り。
http://mlmmj.org/docs/readme

 0)ソースのコンパイル、インストール
 1)拡張アドレスの設定(postfixの場合、recipient_delimiter を設定)
 2)MLを作成
 3)aliases に追加(newaliases を実行)
 4)mlmmj-maintd をタスクスケジュールに登録
   ※これは、長い間バウンスしたメールを掃除したり、
    配送できなかったメールの再送などメンテナンスを行うもの。
    Alma8のパッケージにはcron設定が同梱されていないので、自前で設定。
 5)リストへメンバを追加
 6)Reply-To: などのカスタムヘッダを設定
 7)フッターの指定
 8)件名のプレフィックスを指定
 9)モデレートの設定
 *)WebUIの設定
  →同梱されたREADMEは、以下のもの。
   /usr/share/doc/mlmmj/web/php-admin/README
   /usr/share/doc/mlmmj/web/php-moderation/README
   /usr/share/doc/mlmmj/web/php-user/README


インストールは dnf コマンドで簡単。

# dnf install mlmmj


Postfixにて、拡張メールアドレスを有効化するために recipient_delimiter を設定する。

拡張メールアドレスとは、
 address1@example.com が存在する際に、address1+ext@example.com
というアドレスを定義する機能。
ext の部分は何でも良い。区切り文字の + は任意に設定可能。


Alma8/9ではデフォルトで無効(空白)になっている。

# postconf |grep recipient_delimiter
recipient_delimiter =

/etc/postfix/main.cf にて、以下のように設定する。

#recipient_delimiter = +
 ↓
recipient_delimiter = +

Postfixを再起動

# systemctl restart postfix.service

リストの作成

「mlmmj-make-ml」コマンドを利用して、MLを作成する。
作成したMLは、/var/spool/mlmmj 配下にリスト毎に設定等が保存される。

上記のディレクトリのオーナーとパーミッションを修正する。
(デフォルトの状態 => /var/spool/mlmmj:root.root 755)

# chown postfix:mail /var/spool/mlmmj
# chmod 775 /var/spool/mlmmj


「ml-admin」というMLを作成してみる

# mlmmj-make-ml -c postfix:mail -L ml-admin
Creating Directorys below /var/spool/mlmmj. Use '-s spooldir' to change
The Domain for the List? [] : example.com    ←ドメインを入力
The emailaddress of the list owner? [postmaster] : postfix  ←postfixの実行ユーザを入力

For the list texts you can choose between the following languages or
give a absolute path to a directory containing the texts.

Available languages:
ast  cs  de  en  fi  fr  gr  it  pt  sk  zh-cn
The path to texts for the list? [en] :   ←日本語が無いのでデフォルトでEnter


Don't forget to add this to /etc/aliases:    ←aliasesへ追記するよう指示のメッセージ
ml-admin:  "|/usr/bin/mlmmj-receive -L /var/spool/mlmmj/ml-admin/"

chown -R postfix:mail /var/spool/mlmmj/ml-admin? [y/n]: y  ←オーナーを変更する確認メッセージ

If you're not starting mlmmj-maintd in daemon mode,
don't forget to add this to your crontab:
0 */2 * * * "/usr/bin/mlmmj-maintd -F -L /var/spool/mlmmj/ml-admin/"  ←cronへ追記するよう指示のメッセージ

 ** FINAL NOTES **
1) The mailinglist directory have to be owned by the user running the
mailserver (i.e. starting the binaries to work the list)
2) Run newaliases

mlmmj-make-ml のオプションには以下のようなものがある。

  • -L: The name of the mailing list
  • -s: Your spool directory (default /var/spool/mlmmj)
  • -a: Create the needed entries in your /etc/aliases file
  • -c: User to chown the spool directory to (default not to chown at all)
  • a オプションを付けると、/etc/aliases の末尾へ追記するか尋ねられ、承諾すると設定が追記される。

(-a オプションを指定しない場合は、手動で追記する)

手順的には、ここで「aliases に追加(newaliases を実行)」になるが、
そのまま追加するだけだと後述のエラーに遭遇するので、いったんスキップ。


次に、指示された設定を crontab に追記(実行タイミングは適宜調整)。
(もし、/etc/crontab に記載する場合は、ユーザ名の指定が必要)

0 */2 * * * "/usr/bin/mlmmj-maintd -F -L /var/spool/mlmmj/ml-admin/"


作成されたファイルを確認

# tree /var/spool/mlmmj/
/var/spool/mlmmj/
└── ml-admin
    ├── archive
    ├── bounce
    ├── control
    │   ├── listaddress
    │   └── owner
    ├── digesters.d
    ├── incoming
    ├── index
    ├── moderation
    ├── nomailsubs.d
    ├── queue
    │   └── discarded
    ├── requeue
    ├── subconf
    ├── subscribers.d
    ├── text
    │   ├── confirm
    │   ├── deny
    │   ├── deny-post
    │   ├── digest
    │   ├── faq
    │   ├── finish
    │   ├── finish-sub
    │   ├── gatekeep-sub
    │   ├── help
    │   ├── list
    │   ├── moderate-post
    │   ├── notify
    │   ├── probe
    │   ├── prologue
    │   ├── wait-post
    │   └── wait-sub
    └── unsubconf

メンバーの登録と削除

リストへメンバーを追加する

# /usr/bin/mlmmj-sub -L /var/spool/mlmmj/ml-admin/ -a user1@example.com
Changing to uid 89, owner of /var/spool/mlmmj/ml-admin/.


追加コマンドの主なオプションは以下の通り。

  • -a: Email address to subscribe
  • -c: Send welcome mail (unless requesting confirmation)
  • -C: Request mail confirmation (unless switching versions)
  • -d: Subscribe to digest version of the list
  • -f: Force subscription (do not moderate)
  • -L: Full path to list directory
  • -m: Moderation string
  • -n: Subscribe to nomail version of the list
  • -q: Be quiet (don't notify owner about the subscription)
  • -r: Behave as if request arrived via email (internal use)
  • -R: Behave as if confirmation arrived via email (internal use)
  • -s: Don't send a mail to the subscriber if already subscribed
  • -U: Don't switch to the user id of the listdir owner


追加されたメンバーは、
/var/spool/mlmmj/ml-admin/subscribers.d/
以下に先頭文字のファイルに追記される。
メンバーが0になると、そのファイルも消える。

メンバー一覧を見るには、catでテキストを確認する

# cat /var/spool/mlmmj/ml-admin/subscribers.d/u
user1@example.com

メンバーを削除する

# /usr/bin/mlmmj-unsub -L /var/spool/mlmmj/ml-admin/ -a user1@example.com
Changing to uid 89, owner of /var/spool/mlmmj/ml-admin/.

<削除コマンドの主なオプション>

  • -a: Email address to unsubscribe
  • -b: Behave as if unsubscription is due to bouncing (internal use)
  • -c: Send goodbye mail
  • -C: Request mail confirmation
  • -d: Unsubscribe from the digest version of the list
  • -L: Full path to list directory
  • -n: Unsubscribe from the nomail version of the list
  • -N: Unsubscribe from the normal version of the list
  • -q: Be quiet (don't notify owner about the unsubscribe)
  • -r: Behave as if request arrived via email (internal use)
  • -R: Behave as if confirmation arrived via email (internal use)
  • -s: Don't send a mail to the address if not subscribed
  • -U: Don't switch to the user id of the listdir owner


<MLの削除>
専用のコマンドは無いため、以下を行う。
 ・/var/spool/mlmmj 配下のディレクトリを丸ごと削除
 ・/etc/aliases の設定を削除
 ・cron の設定を削除


aliasへの設定

/etc/aliases へMLのaliasを追記して次の手順へ進もうとしたが、配送時にエラーが発生して失敗した。

<ml-admin@example.com>: Command died with status 1:
    "/usr/bin/mlmmj-receive -L /var/spool/mlmmj/ml-test/". Command output: Have
    to invoke either as root or as the user owning listdir


以下のマニュアルによると、
http://mlmmj.org/docs/readme-postfix/
デフォルトでは、Postfixがmlmmjをnobodyとして実行するためと思われる。

これを回避するには、上記URLにあるように、以下のいずれかを実施する。

  • リストの所有者をnobodyにする(安全はない)
  • Postfixの実行ユーザをmlmmjにする(安全でない、実用的でない)
  • mlmmjユーザが所有するaliasテーブルを追加(準最適)
  • Postfixのtransportを利用して、mlmmjユーザとしてmlmmjを実行(最適)


transportの設定は少し複雑なため、容易な準最適の方法を行った。

1)所有者がpostfixユーザのaliasファイルを新規に作成する。

# touch /var/spool/mlmmj/mlmmj-aliases
# chown postfix:mail /var/spool/mlmmj/mlmmj-aliases

2)main.cf に1番で作成したファイルを参照する設定を追加

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
 ↓
alias_maps = hash:/etc/aliases, hash:/var/spool/mlmmj/mlmmj-aliases
alias_database = hash:/etc/aliases, hash:/var/spool/mlmmj/mlmmj-aliases

postfixを再起動

# systemctl restart postfix.service


/var/spool/mlmmj/mlmmj-aliases へMLのaliasを追記する。

# for mlmmj ML
ml-admin:  "|/usr/bin/mlmmj-receive -L /var/spool/mlmmj/ml-admin/"

aliasを反映させる

# newaliases

mlmmj-aliases.db が生成される

# ls -l /var/spool/mlmmj/mlmmj-aliases*
-rw-r--r--. 1 postfix mail   111  427 14:10 /var/spool/mlmmj/mlmmj-aliases
-rw-r--r--. 1 postfix mail 12288  427 14:28 /var/spool/mlmmj/mlmmj-aliases.db

※alias_maps と alias_database の違いは以下を参照。
[postfix-jp:01553] alias_maps と alias_database


ここまで完了したら、メールを送信してテストを行う。
投稿したメールがメンバーへ配送されるか、添付(日本語のファイル名も含む)が文字化けしないことを確認。


なお、新しくリストを作成するには、以上の手順をふまえて以下のようになる。
postfixの再起動は不要。

<ML作成時の手順のまとめ>
1)mlmmj-make-ml でリストを作成
 →# mlmmj-make-ml -c postfix:mail -L リスト名
2)cronに追記(1の作成時に表示される内容)
 →"/usr/bin/mlmmj-maintd -F -L /var/spool/mlmmj/リスト名/" を実行する日時
3)/var/spool/mlmmj/mlmmj-aliases に追記(1の作成時に表示される内容)
 →リスト名: "|/usr/bin/mlmmj-receive -L /var/spool/mlmmj/リスト名/"
4)newaliases で反映
5)メンバーを追加
 →# /usr/bin/mlmmj-sub -L /var/spool/mlmmj/リスト名/ -a 追加アドレス


基本的な設定は以上。
ちょっとした追加設定は次回へ続く。

AlmaLinux/RockyLinux8以降のメーリングリストを考える

メーリングリストとして長らくMailmanのお世話になっていたものの、CentOS 7のサポート終了が近く、OSを移行する事に。

ここで、AlmaLinux/RockyLinuxでMailmanを使おうとすると、以下の点に気が付く。

  • CenOS7まで使っていたMailmanは、python2で書かれたmailman2である
  • AlmaLinux/RockyLinux8では、python2は Retirement Date:Jun 2024 (末尾のLife Cycleを参照)
  • そもそも、python2はとっくにEOL(2020年)


AlmaLinux/RockyLinux8では、Mailman2をOSのサポート期限終了(2029年)まで安心して使えないため、使い慣れたMailman2を諦める事に・・・。

という訳で、Mailman2だった環境からMLを乗り換える時の選択肢を調べた。
(移行先はクラウドNG、オンプレ限定)

Mailman3(python3)

Mailman」と冠しているが、Mailman2と互換性は無い。
Fedora向けのepel9ではRPMパッケージがある。

mlmmj(本体はC、WebUIはperlまたはPHP

機能は少なくシンプル。
本体はCで書かれているため高速と思われる。
epel8/9でパッケージ提供あり。
公式のソースが2017年で開発が止まっている。EOLでは無さそう。
件名のprefixに連番を付ける機能が標準で無さそう(たぶん)
WebUIが微妙な感じ。

sympa(perl

mailmanのように高機能。
epel8/9でパッケージ提供あり。
件名のprefixに連番を付ける機能がある。(テキストのファイルを修正すれば、値を途中からにも変更可能)
GUIにはmod_proxyが必要。
(動作させて分かったが)メモリ消費が多く、sympaだけで1GB以上必要。
メモリが少ない環境では厳しい可能性あり。

fml(perl

ソースからインストールするしかない。
公式のソースが2018年で開発が止まっている。EOLでは無さそう?
WebUI環境を使えるようにするまでの敷居が高く見える。

majordomo(perl

ソースからインストールするしかない。
公式のソースが2000年で開発が止まっている。
こちらを選択する理由は無い。


なお、他にもezmlm(qmail環境下で利用)があるが、postfix環境のため除外。

インストールやアップデートのし易さから考えると、mlmmj または sympaが良さそう。

mlmmjはシンプル・省リソース、sympaは高機能・要メモリといった特徴になる。

awstatsでgeoipfreeプラグインが動作しない

久々にawstatsを触る機会があり、セットアップしたものの解析が動作しない。

特定のプラグインを有効化していたが、その動作に必要なperlモジュールをインストールし忘れていただけ、というオチだった(´・ω・`)

環境

AlmaLinux release 8.9 (Midnight Oncilla)

症状と原因

awstasを設置したが、ログが解析されない。

何が起こっているのか調べるために、
/etc/cron.hourly/awstats に記述されているコマンドから、/dev/null への出力を無しにして手動で実行してみる。

# cat /etc/cron.hourly/awstats
#!/bin/bash
exec /usr/share/awstats/tools/awstats_updateall.pl now -configdir="/etc/awstats" -awstatsprog="/usr/share/awstats/wwwroot/cgi-bin/awstats.pl" >/dev/null
exit 0

以下だけ実行。

# exec /usr/share/awstats/tools/awstats_updateall.pl now -configdir="/etc/awstats" -awstatsprog="/usr/share/awstats/wwwroot/cgi-bin/awstats.pl"

次のようなエラーが出た。

Error: Plugin load for plugin 'geoipfree' failed with return code: Error: Can't locate Geo/IPfree.pm in @INC (you may need to install the Geo::IPfree module) (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 /usr/share/awstats/lib /usr/share/awstats/plugins /usr/share/awstats/wwwroot/cgi-bin/plugins) at (eval 2) line 1.


aestatsのconfファイルにて、

LoadPlugin="geoipfree"

の行を有効化しているにもかかわらず、そのプラグインを動作するためのGeo/IPfree.pmが無いらしい。

解決法

cpanからGeo::IPfreeをインストール。

cpan> install Geo::IPfree

これでログが解析されるようになる。
但し、パッケージ同梱の国判定DBは古く、定義を更新しなければ精度が良くならない。

DB定義を更新する geoipupdate パッケージをインストールしても、ライセンスを投入しなければ定義ファイルが更新されないので注意。
ライセンスは、maxmind へユーザ登録して入手する必要あり。

MaxMind / Updating GeoIP and GeoLite Databases
Updating GeoIP and GeoLite Databases | MaxMind Developer Portal

Firefox 121.0 で全角スペースが謎の動作をする

2023/12/20に、Firefox 121.0 がリリースされた。
その影響のためか、Webサイトがバグったという情報を耳にしたので調べてみた。

環境

Firefox 121.0(Windows版)

Ver 121.0.x がリリースされれば、修正されて以下の現象は再現しない可能性がある。

謎の挙動

selectタグのoptionの値で、前後に全角スペースが含まれていると値がバグるらしい。

以下の図で、左側がFirefox 121.0、右側はEdge 120.0.2210.91 で試したもの。

このように、optionの値が途中で切れてしまう。

再現したhtmlタグは、以下の通り。

<p>先頭にスペースなし</p>
<select>
	<option>オプション1</option>
	<option>オプション2</option>
	<option>オプション3</option>
	<option>オプション3-1</option>
	<option>オプション3-2</option>
</select>

<p>先頭に全角スペースあり</p>
<select>
	<option> オプション1</option>
	<option> オプション2</option>
	<option> オプション3</option>
	<option>  オプション3-1</option>
	<option>  オプション3-2</option>
</select> 

<p>末尾に全角スペースあり</p>
<select>
	<option>オプション1 </option>
	<option>オプション2 </option>
	<option>オプション3 </option>
	<option>オプション3-1 </option>
	<option>オプション3-2 </option>
</select>


おかしくなっている箇所をFirefoxの開発者ツールで見てみると、改行?か何かが入っているのか、値が変な事になっている。


なお、全角スペースでは問題が発生するが、「&emsp;」を使っている場合には問題ない。

原因を探る

Firefox 120までは問題なく、Firefox以外のブラウザでも問題ない。

どうやらFirefox 121.0で変になったように思え、Bugzillaから情報を探してみると以下が該当していそう。
bugzilla.mozilla.org


Bugzillaではbuttonタグも例に挙げられている。
スレッドを見ると、「何らかの問題へ対処する修正が入っていたが、それが仇となったので元に戻した」といった感じ。

selectタグのoptionやbuttonタグで確認したが、他にも影響を受けるものがあるかもしれない。

対処

Firefox 122 ではFixされてリリース(1/23予定)されるらしい。
また、121.x dot-release(121.0.1 など)があれば、修正されてリリースされると思われる。

自分がクライアント側であれば、次期Firefoxリリースまで待つか、他ブラウザを利用する事で対処できる。
自分が開発者側であれば、次期Firefoxリリースまで待つか、全角スペースをやめるしかない。
前述の「&emsp;」に置き換える方法も考えられる。


余談だが、そもそも「なぜoptionの値の前後に全角スペースがあるの?」と思い、今回の情報元へ尋ねてみたところ、

  • 値の先頭にあるスペースは、インデントの目的で使っていた
  • 値の末尾にあったスペースは、おそらく誤入力

ということだった。


【1/7追記】
他にも関連除法があったので追記。
bugzilla.mozilla.org

bugzilla.mozilla.org


【1/10追記】
本記事の不具合は、1/9リリースの Firefox 121.0.1 で修正済となりました。
www.mozilla.org

Fixed unexpected line wrapping in some CJK contexts caused by changes in ideographic space handling. (Bug 1870973)

RHEL8以降におけるOpenLDAP Server

RHELでは、7.4以降はopenldap-servers パッケージは非推奨となっている。
RHEL8以降では、ベースのリポジトリに存在せず、OpenLDAPサーバを構築しようとした際に、パッケージを探すことから始めなければならない。

Red Hat Enterprise Linux に同梱される LDAP サーバーのサポート状況について - Red Hat Customer Portal

今回は、RHEL8以降のクローンOS(RockyやAlma)にて、OpenLDAPサーバのパッケージがどうなっているかをメモ。

RHEL8クローンにおけるLDAPサービスの提供方法

RHEL9クローンにおけるLDAPサービスの提供方法

RockyLinux9では、plusリポジトリopenldap-servers 2.6 がある。(OS9では、バージョンが2.4→2.6になっている)

https://dl.rockylinux.org/vault/rocky/9.0/plus/x86_64/os/Packages/o/
https://dl.rockylinux.org/vault/rocky/9.1/plus/x86_64/os/Packages/o/
https://ftp.riken.jp/Linux/rocky/9.2/plus/x86_64/os/Packages/o/  ←9.2は、まだVaultに無いのでrikenサーバ

AlmaLinux9では、openldap-servers の提供が見当たらない。(2023/7、AlmaLinux9.2時点まで)

epelには存在する。
https://dl.fedoraproject.org/pub/epel/9/Everything/x86_64/Packages/o/

Symasがビルドしたリポジトリも、openldap-servers 2.6 がある。

https://repo.symas.com/soldap/rhel9/

SymasはOpenLDAP 2.5(LTSらしい)もリリースしており、RHEL 7/8/9 向けにビルド・リポジトリがある。
https://repo.symas.com

plus/PowerToolsリポジトリなどの使い方

次のようにする

# dnf install --enablerepo=powertools openldap-servers

EPELの場合は、予めepel-releaseパッケージを導入しておく。

PHPの画面が真っ白に表示される、しかもソース丸見え

色々な要因はあるけど、「PHPのページの画面が真っ白で表示される」という状況に遭遇。

他人がセットアップしたWebサーバにて、後からPHPが動作するようにPHP関連パッケージを追加したものの、PHPが動作しないという経緯。

AlmaLinux8で起こったことだけど、php-fpmで動作するAlmaLinux9やRockyLinuxなどでも同様。

症状としては、以下の通り。

  • httpdアクセスログに *.php へのアクセスは記録される。
  • httpdのエラーログには何も記録されない。(LogLevelをdebugまで上げても、それらしいログは出ない)
  • phpinfoやechoだけのページへアクセスすると、真っ白になる。
  • Webブラウザでソースを開くと、PHPソースが丸見え。
  • PHPのエラーレベルを上げても何も出力されない。
  • サーバ上にて、コマンドではPHPが動作する。


コマンドではPHPが動作することから、Webサーバ関連の設定を疑う。
このWebサーバ、メモリを節約するために色々なモジュールがオフになっているとのことで、
設定を見て回ると、proxy関係のモジュールが無効化(コメントアウト)されているのを発見。

/etc/httpd/conf.modules.d/00-proxy.conf
にて、以下の2つを有効化すれば良い。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


これらのモジュールが必要な理由としては、
httpdが /etc/httpd/conf.d/php.conf で次のようにPHPを呼び出していることが該当する。

    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>

ここに設定されている通り、httpdがproxyモジュールを経てphp-fpmへ処理を渡している。
proxyモジュールを無効化してしまうと、php-fpmへ処理を渡せず、そもそもPHPhttpd経由で動作しない。