久しぶりにFreeBSDの環境を壊して修復した!(備忘録)

2024年1月3日
Unix

皆さん、こんにちは。

以前の記事でも触れましたが、私はいまだに自身で構築したサーバーを運用していて、それらは自分で稼働させている都合上、アップデートやセキュリティーパッチなども当然自身でおこなう必要があります。

今どきは少しのネットリテラシーと調べる気力さえあれば、誰でも格安高機能のホスティングサービスを利用することができ、取得したドメインを割り当ててウェブサイトを開設したり、独自ドメインのメールアドレスを自由に作成することができるでしょう。

私も以前ほど特殊なことをやらなくなりましたので、ほとんどのことは格安のホスティングサービスで済んでしまいますが、時々ローカルのマシンでは都合が悪く、一般的なホスティングサービスでは制限があってできないようなことを試したりするため、そんな時に自由になんでもできるサーバーがあると重宝します。

それ以外にも仕事として運用・管理しているサーバーが数台あり、レガシーな(割と古びた)プログラムを稼働しているサーバーは安易にアップデートしたり変更を加えることが難しいケースがあって、なかなかアップデートが億劫になることもしばしばです。

サーバーといっても、VPS(仮想プライベートサーバー)ですので、いわゆるオンプレミスと言われるようなオフィスに据え付けたサーバーや、データセンター内に設置した自分専用のハードウェアがあるわけではありません。このVPSにFreeBSDというUNIX系のOSをインストールし、ウェブなりメールなりのサービスを稼働できるよう環境構築しています。現在、サーバー系のOSはLinux系が最も多く、Windows Serverもだいぶ増えましたが、昔から手に馴染んでいることもありサーバーではFreeBDSを主軸に利用しています。

掲題を「環境を壊して修復した」としましたが、とあるAPIをいじろうとサーバーのOSと必要なプログラムをアップデートしていたところ、うっかり稼働中のプログラムをいくつかアンインストールしてしまいました。

普段であれば、即座に再インストールすることですぐに復旧するのですが、今回はそのサーバーで昔から使い続けているVpopmailとApache、MySQLが起動しなくなり、割とはまってしまったので備忘録的に記しておこうと思います(困っている人は意外とこういうマイナーな情報に助けられたりしますので)。

まずVpopmailですが、これはメールサーバーのプログラムです。Qmailというメールサーバーがあり、このプロジェクトから派生したヴァーチャルドメイン対応が画期的だったプログラムです。ほぼ有志でメンテナンスされていますが、FreeBSDのPortsというアップデート用のシステム上でも、最終メンテが2014年とだいぶレガシーな様相を呈している状況です。

そんな状況でも何度か再インストールをして特に問題が起こらない安定したプログラムだったはずが、インストール時に突然のエラー。

ログには、

Unable to access file /usr/ports/mail/vpopmail/work/stage/usr/local/%%MYSQL%%@sample vpopmail/etc/vpopmail.mysql-dist vpopmail/etc/vpopmail.mysql:No such file or directory

といった一文が吐き出されています。

検索してもなかなか情報がありませんでしたが、なんと問題が起こった1日前にFreeBSDのPorts treeのページにパッチの投稿が。

とりあえずパッチ済みのPortsをダウンロードし早速インストールすると今度はエラー無く正常にインストール完了。一つ問題が解決しました。

次の問題はウェブサーバーとして有名なApache。最近はNginxのシェアも増えましたが、まだまだメジャーなウェブサーバー用プログラムです。これも再インストールすることになったのですが、php関連とセットで再インストールし起動するとSegmentation faultで起動しません。

あれこれと試し、結局、Apache経由でphpを利用するためのmod_phpが原因ということがわかりますが、同じ様な構成の別のサーバーでは不具合が起こらず、腑に落ちないと思いつつも、推奨環境はmod_phpではなくmod_fcgiですので、Apacheのインストールはmpm preforkではなくmpm workerを指定、mod_proxy_fgiにチェックが入っていることを確認しmake installします。
phpはphp-fpmで起動するように指定してインストールしておきます。

尚、本記事時点でインストールしたバージョンは、Apache 2.4.58、php 8.3.1です。

httpd.confのmod_fcgiとmod_proxy_fgiの設定を有効に。
phpのSetHandlerの箇所には以下のように追記しておきます。

SetHandler “proxy:fcgi://127.0.0.1:9000”

これですんなり起動するようになりました。

そもそもApacheはマルチスレッドとマルチプロセスをハイブリッド化したMPM workerでビルドしたほうがレスポンスが良いので、これは怪我の功名です。

そしてMySQLですが、ログファイルを見ると「lower_case_table_names=1」が設定されているために、過去に作成したテーブル名が問題となってmysqldが停止されています。

lower_case_table_namesは、テーブル名の大文字と小文字を区別するための設定で、「0」は区別あり、「1」は区別なし、「2」は区別無いファイルシステムで動作しDB上では小文字で格納されます。これを「0」の状態で起動すればひとまずは問題ないはずですが、なんと設定が反映されるのは初回起動時のみ。その後は変更できません。記述自体はmy.cnfで指定できますが、これはあくまでも初回のイニシャライズの際に参照されるだけのようなので、あとから記述しても有効にはなりませんでした。

ラッキーにもエラーの対象となったテーブルは使用していないものでしたので、ディレクトリごと退避してエラー回避し起動させました。通常であればデーターベースフォルダを空にしてさらの状態からインストールしなおし、起動確認後に旧データを移動なりインポートする形で対応することになるでしょう。

MySQLのバージョンは8.1.0です。

本当にマイナーな情報の紹介でしたが、同じように困っている方のお役に立てれば幸いです。


ENTRY LIST

DJ Streaming on Twitch

コーダー/プログラマーのための電子書籍ハウツー: そろそろブログやSNSじゃなくて、本にまとめてみたら?

続・成功するフリーランス – 年収1000万円は簡単に実現できる: フリーランスを15年やってみてわかったこと

木を食べる: 花粉症・ダイエット・健康食品・食糧革命への福音書

思春期の男の子を持つ、お母さんのための処方箋: 「いいからやりなさい!」って言ってませんか?