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

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

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

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



# 前提


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

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




# 現象

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

```bash:/Path/to/apache/conf/hoge.conf
<VirtualHost *:80>
~ (snip) ~
           #DBD
           DBDriver mysql
           DBDPersist ON
~ (snip) ~
</VirtualHost>
```

その後Syntaxチェックをするとエラーになった

```bash
/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オプションがなかった。

```bash:/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どかす。


```bash

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 ができました。

今回ならここにできる

```bash
/usr/local/apr-util/lib/apr-util-1/apr_dbd_mysql.so
```


改めてApacheのSyntaxチェックをするとやっぱりエラー
　⇨　そんな場合はケース2へ進む

```bash
/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が依存関係のあるライブラリを認識できているのかを確認する

```bash

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に認識されているか確認してみましょう

```bash
/sbin/ldconfig -p | grep libmysqlclient
```

何も表示されない場合は認識していません
念のためロードさせてみます


```bash
#rootでやります。
ldconfig

#確認
ldconfig -p | grep libmysqlclient
何も表示されない ⇨ やっぱりダメでした。

```

### 必要なライブラリをOSに認識させます

下記に記載されたPathからライブラリを探してくれます。

/etc/ld.so.conf

Pathの記載された別ファイルをIncludeさせることもできます。
こんな感じ↓

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

```



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


```bash:/etc/ld.so.conf.d/mysql.conf
/Path/to/MySQL_HOME

```


認識させましょう。

```bash

ldconfig
ldconfig -p | grep libmysqlclient
---
libmysqlclient hogehoge が表示されればOK
---

```


### apr_dbd_mysql.soが依存関係のあるライブラリを認識できているのかを確認する

```bash

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チェック

```bash
/Path/to/apache/bin/httpd -t
Syntax OK
```

問題なし！

あとはApacheプロセスを再起動しましょう。
今回はconf以下のファイルをリロードするだけでいいのでgraceful restartでOK

```bash
/Path/to/apache/bin/apachectl graceful
```


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