LoginSignup
5
4

More than 5 years have passed since last update.

DBD: Can't load driver file apr_dbd_mysql.so なケースを通して学ぶ、lddとldconfigの使い方

Last updated at Posted at 2015-07-22

これはなに?

ApacheでQ4Mを使うためにmod_dbdのMySQLドライバを使おうとしたら上記エラーになった時の話。

こういうググっても解決策がわかりにくいものを解決するのには、ldd、ldconfigあたりが便利ですよってお話。
新人さんにldd/ldconfigを伝える時とかに使います。

ldd、ldconfig、ld.so.confあたりをご存知な方は読む必要ないやーつです。

前提

  • Apache 2.2.X のソースビルド環境
  • DBD経由でMySQL接続したい(Q4Mを使いたい)

当記事の対象は懐かしのソースビルド/野良ビルド環境なので、あまりニーズはないはず。きっと。

現象

Apacheで下記のようにDBDを有効にする

/Path/to/apache/conf/hoge.conf
<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オプションがなかった。

/Path/to/apache_source/srclib/apr-util/config.nice

"./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させることもできます。
こんな感じ↓

/etc/ld.so.conf
include ld.so.conf.d/*.conf
# /etc/ld.so.conf.d/ 以下のconfを読んでくれる設定です。

なので、
not foundになっていたlibmysqlclient.soへのPathを記載してあげます。
今回は下記ファイルに記載しました。

/etc/ld.so.conf.d/mysql.conf
/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

以上、よろしくおねがいします。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4