これはなに?
ApacheでQ4Mを使うためにmod_dbdのMySQLドライバを使おうとしたら上記エラーになった時の話。
こういうググっても解決策がわかりにくいものを解決するのには、ldd、ldconfigあたりが便利ですよってお話。
新人さんにldd/ldconfigを伝える時とかに使います。
ldd、ldconfig、ld.so.confあたりをご存知な方は読む必要ないやーつです。
前提
- Apache 2.2.X のソースビルド環境
- DBD経由でMySQL接続したい(Q4Mを使いたい)
当記事の対象は懐かしのソースビルド/野良ビルド環境なので、あまりニーズはないはず。きっと。
現象
Apacheで下記のようにDBDを有効にする
<VirtualHost *:80>
~ (snip) ~
#DBD
DBDriver mysql
DBDPersist ON
~ (snip) ~
</VirtualHost>
その後Syntaxチェックをするとエラーになった
/Path/to/apache/bin/httpd -t
DBD: Can't load driver file apr_dbd_mysql.so
APRって?
Apache Portable Runtimeの略
https://apr.apache.org/
DBDの各種RDBMS用ドライバはapr-utilに入っています。
原因と対応方法
ケース1: apr_dbd_mysql.so が存在していない
現状確認
ビルド時のconfigureオプションを確認。
⇨--with-mysqlオプションがなかった。
"./configure" \
"--with-apr=/usr/local/apr" \
"--prefix=/usr/local/apr-util" \
"$@"
と、いうわけで
apr-utilを再ビルドしてapr_dbd_mysql.soを作る
make clean
&
今あるapr-util(=config.niceの--prefix)を削除orどかす。
cd /Path/to/apache_source/srclib/apr-util/
make clean
## config.niceからコピペに--with-mysqlを足してconfigure
"./configure" \
"--with-apr=/usr/local/apr" \
"--prefix=/usr/local/apr-util" \
"--with-mysql=/Path/to/MySQL_HOME" \
"$@"
## 1行ならこんな感じ
./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-util --with-mysql=/Path/to/MySQL_HOME
## build
make
make install
--prefixで指定された /usr/local/apr-util に apr_dbd_mysql.so ができました。
今回ならここにできる
/usr/local/apr-util/lib/apr-util-1/apr_dbd_mysql.so
改めてApacheのSyntaxチェックをするとやっぱりエラー
⇨ そんな場合はケース2へ進む
/Path/to/apache/bin/httpd -t
DBD: Can't load driver file apr_dbd_mysql.so
ケース2: apr_dbd_mysql.so がlibmysqlclient.so.XXを認識できていない
apr_dbd_mysql.soが依存関係のあるライブラリを認識できているのかを確認する
ldd /usr/local/apr-util/lib/apr-util-1/apr_dbd_mysql.so
linux-vdso.so.1 => (0x00007fffa83ff000)
libmysqlclient.so.18 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f26c298e000)
~ (snip) ~
libmysqlclient.soが not found でした。
では依存関係のあるライブラリがOSに認識されているか確認してみましょう
/sbin/ldconfig -p | grep libmysqlclient
何も表示されない場合は認識していません
念のためロードさせてみます
#rootでやります。
ldconfig
#確認
ldconfig -p | grep libmysqlclient
何も表示されない ⇨ やっぱりダメでした。
必要なライブラリをOSに認識させます
下記に記載されたPathからライブラリを探してくれます。
/etc/ld.so.conf
Pathの記載された別ファイルをIncludeさせることもできます。
こんな感じ↓
include ld.so.conf.d/*.conf
# /etc/ld.so.conf.d/ 以下のconfを読んでくれる設定です。
なので、
not foundになっていたlibmysqlclient.soへのPathを記載してあげます。
今回は下記ファイルに記載しました。
/Path/to/MySQL_HOME
認識させましょう。
ldconfig
ldconfig -p | grep libmysqlclient
---
libmysqlclient hogehoge が表示されればOK
---
apr_dbd_mysql.soが依存関係のあるライブラリを認識できているのかを確認する
ldd /usr/local/apr-util/lib/apr-util-1/apr_dbd_mysql.so
linux-vdso.so.1 => (0x00007fffa83ff000)
libmysqlclient.so.18 => /Path/to/MySQL_HOME/lib/libmysqlclient.so.XX (0xXXXXXXXX)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f26c298e000)
~ (snip) ~
認識した!
というわけであらためてApacheのSyntaxチェック
/Path/to/apache/bin/httpd -t
Syntax OK
問題なし!
あとはApacheプロセスを再起動しましょう。
今回はconf以下のファイルをリロードするだけでいいのでgraceful restartでOK
/Path/to/apache/bin/apachectl graceful
以上、よろしくおねがいします。