今回は、CentOS7 サーバー上で運用していた Apache + PHP5.6 環境が、突然 Segmentation fault によりウェブサイトが表示できなくなった障害について、その原因と対応方法を詳しく紹介します。同様の構成を運用中の方や、古いPHP環境を引き続き利用している方にとって有益な情報になればと思い記事しました。

発生した現象

 ある日突然、Webサイトにアクセスしても画面が真っ白になり、Apache を再起動しても以下のようなエラーが発生して、起動後すぐに子プロセスが終了するような現象が発生しました。

[core:notice] AH00052: child pid xxxx exit signal Segmentation fault (11)
[ssl:error] AH02218: ssl_stapling_init_cert: no responder URL

 これにより、HTMLファイルの表示も行えず、Apache自体の挙動に異常が見られました。PHP の問題というより、Apacheモジュールに起因する障害の可能性が考えられました。

環境情報

 問題が発生した環境は以下のようなOSとミドルウェアの構成です。バージョンとしてはやや古めですが、運用中のアプリケーションが動作しているため、バージョンアップが難しいという事情があります。

  • OS: CentOS 7.9 (Final)
  • Apache: httpd 2.4.6
  • PHP: 5.6.29(mod_php として動作)
  • OpenSSL: 1.0.2k
  • 証明書: Let’s Encrypt(certbot にて自動取得・更新)

原因の調査手順

 Apache のクラッシュ原因を深掘りする際、単に Apache のエラーログを見るだけでなく、システム全体の挙動やパッケージの更新履歴を確認することも重要です。まずはApache が再起動後すぐにクラッシュしている様子だったため、プロセスが存在しない状態であることを確認しました。

$ systemctl status httpd

 /var/log/httpd/error_log を確認すると、Segmentation fault のエラーが繰り返し記録されていました。、Segmentation fault のエラーが繰り返し記録されていました。

GDB を用いたデバッグ

 GDB(GNU Debugger)は、Linux上で動作するプログラムの内部動作をリアルタイムで追跡できる強力なデバッグツールです。プロセスが異常終了した際の原因箇所を特定するために広く利用されています。今回は Apache のプロセスが Segmentation fault により異常終了するため、その原因となる箇所を調べる目的で使用しました。

$ sudo systemctl stop httpd
$ sudo gdb /usr/sbin/httpd
(gdb) run -X

 クラッシュが発生すると以下のようなバックトレースが表示されました:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7749239 in apr_uri_parse () from /lib64/libaprutil-1.so.0
#1  stapling_cb () from /etc/httpd/modules/mod_ssl.so

証明書の OCSP 情報を確認

# openssl x509 -in /etc/letsencrypt/live/catalog.blitzgate.co.jp/cert.pem -text | grep -A1 \"Authority Information Access\"
Authority Information Access:
    CA Issuers - URI:http://r11.i.lencr.org/

 コマンドの実行結果に 「OCSP – URI」の記述がなく、Stapling に必要な情報が証明書に含まれていないことが判明しました。

原因のまとめ

 mod_ssl が有効な状態で SSLUseStapling を ON にしていると、証明書に OCSP レスポンダー URL が無い場合でも無理に Stapling を初期化しようとし、結果的に Apache プロセスが Segmentation fault を起こすという問題でした。

対応方法

SSL Stapling を無効化

# Stapling 関連の設定をコメントアウト
# SSLUseStapling on
# SSLStaplingResponderTimeout 5
# SSLStaplingReturnResponderErrors off

# 明示的に Stapling を無効化
SSLUseStapling off

Apache の構文チェックと再起動

sudo apachectl configtest
sudo systemctl restart httpd

 これで Segmentation fault は発生しなくなり、Web サイトも正常に表示されるようになりました。

安定運用のために考慮すべきこと

 Let’s Encrypt の証明書には、証明書の種別や取得タイミングによっては OCSP レスポンダーの情報が含まれていない場合があります。そのような証明書に対して Apache 側で OCSP Stapling を有効にすると、今回のように mod_ssl の内部処理で想定外の挙動が発生し、結果として Segmentation fault を招く可能性があります。

 また、古いバージョンの mod_ssl や OpenSSL を使用している場合、例外処理が不十分なケースもあり、こうした設定ミスが重大な影響を及ぼすことがあります。

 さらに、本番環境で yum-cron などの自動アップデートを有効にしていると、openssl や mod_ssl のバージョンが意図せず更新され、互換性の問題が突如発生する可能性があります。安定運用を重視する場合には、自動更新を停止し、更新内容を明示的に管理する運用体制が望ましいです。

 将来的なトラブル防止の観点からは、Apache + PHP 5.6 のような旧式構成を Docker でコンテナ化して環境を固定するか、PHP7以降への移行を検討するのが現実的な選択肢となります。

8. まとめ

 CentOS7 + PHP5.6 環境で Apache が突然 Segmentation fault を起こす原因は、mod_ssl による OCSP Stapling の設定に問題があったケースが多いようです。

 今回は設定の見直しとちょっとした修正だけで復旧できました。同じような構成を運用している方にとって、「ある日突然サイトが真っ白!」とならないように、何かの参考になれば嬉しいです。

 レガシーな環境であっても、ちょっとした工夫と確認で安定稼働は十分可能です。この記事が少しでもお役に立てれば幸いです。