michihide's blog

技術メモおよび雑感

httpd(+php) で SEGV

CentOS7 上で動いている httpd が、ログローテーションに伴う再起動時に
落ちていました。"[abrt] full crash report" というタイトルのメールが
管理者宛に来ていたので見てみると、以下のようになっていました(抜粋)。

core_backtrace:
:{   "signal": 11
:,   "executable": "/usr/sbin/httpd"
:,   "stacktrace":
:      [ {   "crash_thread": true
:        ,   "frames":
:              [ {   "address": 139643714280712
:                ,   "build_id_offset": 25144584
:                ,   "function_name": "profile_free_file_data"
:                ,   "file_name": "/usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1"
:                }

心当たりがあったので、/etc/php.d/{oci8, pdo_oci}.ini を呼ばれないように
リネームしてから httpd を再起動しました。現在は順調に動いています。
なお、当該ホストでは Oracle へのアクセス機能は使っていません。

問題のあった環境では、(他ホストとの環境統一の兼ね合いで)oci8 と
pdo_oci を入れていました。oci8 は pecl 経由で導入し、pdo_oci は
オレオレです。

http://php.net/manual/ja/oci8.requirements.php
https://github.com/hotta/pdo_oci

また、PHP 本体は以下の yum リポジトリを使わせてもらっていて、常に
本家リリースからあまり間をおかずに php-5.6.x の最新が入るように
なっています。
https://webtatic.com/packages/php56/
(すでに PHP7 系のパッケージもあるみたいです)

Apache がコケた原因は、以下の通りだと推測されます。

  1. yum update により PHP のバージョンが上がった
  2. oci8 と pdo_oci は yum の管理外なので対応が漏れて、バイナリが不整合となった。

普段は ansible 経由で環境を作っているのでその時点の最新が入りますが、
今回は個別に yum update した後の障害でした。

なお、pdo_oci を php でシミュレートする
https://github.com/taq/pdooci
という実装もあるみたいです。どっちがいいのかな。

みなさん、PHP+Oracle の環境って、どうやってメンテしているんでしょうか?
Oracle のライセンスがこんな状態だと、いつまでたっても yum のサポート
対象にはなり得ないんでしょうか。Oracle さんが Instant Client を OSS
してくれれば解決?