よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

Suvbersionとapacheの組み合わせで気をつけておくこと

Apache2.0.63とSubversion1.5.2の組み合わせで、以下のようなエラーに悩まされましたので原因の切り分け方法とどのような組み合わせでこのエラーが発生するのかをまとめておきます。

svn: Can't convert string from native encoding to 'UTF-8':

今回のサーバ環境は、RedhatLinux 4 Update 6です。

まずは、各M/Wのインストール手順を記録しておきます。インストール後に、簡単な動作確認をしてApacheSubversionのいくつかのバージョンの組み合わせで正常稼動するかを確認します。

Apache2.0.63のインストール

[server]$ tar xvzf httpd-2.0.63.tar.gz
[server]$ cd httpd-2.0.63
[server]$ ./configure \
--prefix=/usr/local/apache2.0 \
--disable-ipv6 \
--enable-shared=yes \
--enable-dav=yes \
--enable-dav-fs=yes \
--with-ldap \
--enable-ldap=yes \
--enable-auth-ldap=yes \
--enable-rewrite \
--enable-ssl \
--enable-cgid
[server]$ make -j4
[server]$ sudo make install

Subversion1.5.2のインストール

[server]$ tar xvzf subversion-1.5.2.tar.gz
[server]$ tar xvzf subversion-deps-1.5.2.tar.gz
[server]$ cd subversion-1.5.2
[server]$ ./configure \
--prefix=/usr/local/subversion/1.5.2 \
--with-apxs=/usr/local/apache2.0/bin/apxs
[server]$ make -j4
[server]$ sudo make install

モジュールが追加されたかどうかの確認

$ ls /usr/local/apache2.0/modules/
httpd.exp mod_authz_svn.so mod_dav_svn.so

さらにhttpd.confを開いて、追加されたモジュールがロードされているかどうかを確認します。

LoadModule authz_svn_module modules/mod_authz_svn.so

最後にLocationディレクティブの設定を追記しておきます。


DAV svn
SVNPath /var/svn/repos/test

動作確認

それでは、SubversionサーバおよびApacheを稼動させているサーバにて、checkoutやcommitなどの簡単な動作確認を実施します。

[server]$ mkdir test-http
[server]$ cd test-http
[server]$ svn co http://localhost/test/ ./
リビジョン 0 をチェックアウトしました。
[server]$ touch test01
[server]$ svn add test01
A test01
[server]$ svn ci -m "add test data"
追加しています test01
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: Can't convert string from native encoding to 'UTF-8':
[server]$ svn up
E test01
リビジョン 1 に更新しました。
[server]$ ls
test01

native encode を UTF-8 にコンバートすることができないと言われてcommitに失敗してしまいます。
ですが、commitの後に update するとserverに追加できていることが確認できます。
この状態ではSubversionApacheのどちらに原因があるのかわからないため、HTTPアクセスでcommitするのではなく、リポジトリを直接してみます。
リポジトリの直接アクセスでもエラーが出るようであれば、subversionのサーバ/クライアントか、Linux側の設定に問題があるはずです。

[server]$ mkdir ~/test-file
[server]$ cd ~/test-file
[server]$ svn co file:///var/svn/repos/test/ ./
A test01
リビジョン 1 をチェックアウトしました。
[server]$ touch test02
[server]$ svn add test02
A test02
[server]$ svn ci -m "add test data"
追加しています test02
ファイルのデータを送信しています .
リビジョン 2 をコミットしました。

特に失敗することなくコミットすることが可能であることがわかりました。
このことより、Apache側もしくはSubversionApacheの連携部分である mod_dav_svn に原因がありそうだということがわかりました。

原因の切り分けはある程度できましたが、とにかくgoogle先生に聞いてみます。
すると、環境変数であるLANGをUTF-8にすれば解決するというエントリーがいくつか引っかかりました。
Linuxサーバのロケールを確認してみると、LANG=ja_JP.UTF-8に設定されています。

[server]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

ダメモトでapacheの起動ファイルの中でLANGを設定してみることに。

export LANG="ja_JP.UTF-8"

これでapacheを再起動してみても解決せず。
apacheの設定ファイルである httpd.conf も見なおしてもおかしなところは発見できず。
なので、Subversionのバージョンを変えてみて同様のテストを実施した結果は以下の通りです。

これより、Apache-2.0系とSubversion-1.5系の組み合わせに問題がありそうということがわかりました。
それでは、Apache2.2系との組み合わせではどうでしょうか?
#インストール手順など情報が多いため大丈夫だとは思いますが、Subversion-1.5.2についての情報がまだあまりないようなので試しておきます。

Apache2.2.9のインストール

[server]$ tar xvzf httpd-2.2.9.tar.gz
[server]$ cd httpd-2.2.9
[server]$ ./configure \
--prefix=/usr/local/apache2.2 \
--enable-dav \
--enable-dav-fs \
--enable-rewrite \
--enable-ssl \
--enable-cgid \
--with-included-apr \
--with-ldap \
--enable-authnz-ldap \
--enable-ldap \
--with-ldap-includes=/usr/include \
--with-ldap-libraries=/usr/lib \
--enable-headers
[server]$ make -j4
[server]$ sudo make install

※ --with-ldap-includesと--with-ldap-librariesオプションは必要ないかも。

Subversion1.5.2のインストール

[server]$ tar xvzf subversion-1.5.2.tar.gz
[server]$ tar xvzf subversion-deps-1.5.2.tar.gz
[server]$ cd subversion-1.5.2
[server]$ ./configure \
--prefix=/usr/local/subversion/1.5.2 \
--with-apxs=/usr/local/apache2.2/bin/apxs
[server]$ make -j4
[server]$ sudo make install

httpd.confを編集し、Apache-2.0.63の場合と同じような動作確認を試してみたところ、「svn: Can't convert string from native encoding to 'UTF-8':」のエラーは発生しませんでした。

結論

Apache2.0系とSubversion1.5系の組み合わせでは以下のエラーが発生します。
 svn: Can't convert string from native encoding to 'UTF-8'
※Apache2.0系はapache-2.0.63、1.5系は1.5.1および1.5.2を対象とする。

補足

Subversion1.5.2のCHANGELOGを確認してみると以下のような記載がありました。

Developer-visible changes:

・・・(略)
* fixed: test failures in non-English locales (r32491)

今回の問題と関係がありそうな気がするのですが、解決されていないことを考えると違うみたいですね。


今回のエントリーにおいて、apacheのmakeでldapを有効にしていました。これはapache2.2系(2.2.9)で本当にLDAP認証が可能であるかを試すためです。
認証をAD(ActiveDirectory)で行い、認可をAuthzSVNAccessFileで行うことができるのかを次回のエントリーにまとめる予定です。