ttt

getttyent

(FreeBSD) Cannot load /usr/local/libexec/apache22/

2008-07-31 22:56:38 | デジタル・インターネット

タイトルは、FreeBSDでportsでインストールしたapache httpdにて、しばらく前から、たまに見かけていたエラーメッセージです。

apacheは、ずっと実行しっぱなしなんですが(当然か)、あるとき、httpd.confを書き換えたりして、apacheを再起動しようとすると・・・

# /usr/local/etc/rc.d/apache22 start
Performing sanity check on apache22 configuration:
httpd: Syntax error on line 63 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"
Starting apache22.
httpd: Syntax error on line 63 of /usr/local/etc/apache22/httpd.conf: Cannot load /usr/local/libexec/apache22/mod_authnz_ldap.so into server: /usr/local/libexec/apache22/mod_authnz_ldap.so: Undefined symbol "apr_ldap_url_parse"

というエラーになる、と。

たぶん、apacheを起動してから、再起動するまでの間に、portupgradeで何かをアップデートしていて、それが原因なんだろう、とは思っていました。

とりあえず、「portupgrade -f apache-2.2...」で再インストールすれば直ってしまうので、まあいいか、ってことにしてたんですが、やっと原因がわかりました。

ldap_url_parseというシンボルは、libaprutil-1.so.3で定義されてます。

# nm /usr/local/lib/libaprutil-1.so.3 | grep ldap_url_parse
0000fe90 T apr_ldap_url_parse
0000f880 T apr_ldap_url_parse_ext

この共有ライブラリは、どこからきたかというと・・・

# pkg_which /usr/local/lib/libaprutil-1.so.3
apr-gdbm-db42-1.3.2 apache-2.2.9

どうして、2つも、パッケージ名が表示されるんですか?!

・・・これから、わかった原因。

apacheが起動しなくなったのは、apr-gdbm-db42-1.3.2が、後からlibaprutil-1.so.3を上書きしてしまったから

ということらしいです。

/var/db/ports/apache22/options を見てみると

WITHOUT_APR_FROM_PORTS=true

となっているのですが、これはportsでインストールするapr(上記のapr-gdbm-db42なんとか)ではなく、apache-2.2自前でaprを使います、という意味らしいです。

というわけで、単体インストールされたaprを削除する、

# pkg_delete /var/db/pkg/apr-gdbm-db42-1.3.2

というのが正解みたいです。

ただし、pkg_deleteすると、重要なファイルが削除されてしまうらしいので、めんどくさいですが、もう一度、apache22をインストールしなおさないといけませんでした。

apache22を再インストールしなかったときは、たとえば、subversionがビルドできない、というトラブルを目にしました(たしか、aprのヘッダファイルが削除されてしまったみたい)。

apr-gdbm-db42-1.3.2は、何かにrequireされてインストールされているわけでもなく、どうしてインストールされていたのかわからないのですが、以前、何かがrequireしてたけど、その後portsが修正され、依存関係がなくなってしまった、ということかもしれません。

CONFLICTの指定がないので、devel/aprと、www/apache22の両方がインストールできてしまうらしく、それがいけないですね。

(optionによって、CONFLICTしたり、しなかったり、ってのは無理なんでしょうか)