CentOSでApacheを日本語ロケール(ja_JP.utf8)で起動する

2010-01-05 20:42 | tag: ,

RHEL/CentOS 5では、AapacheはCロケールで起動します。 /etc/sysconfig/i18n 内のLANG変数の値は使用されません。変更するには、/etc/sysconfig/httpdファイルでHTTPD_LANG変数を設定します。

Cロケールで起動するデフォルトの状態では、Apache上で実行するアプリケーションにおいて日本語の処理に問題が発生する場合があります。

Apacheの起動ロケールの設定手順

ApacheをRHEL/CentOSのパッケージで導入した場合(デフォルト)

ja_JP.utf8に設定するには、 /etc/sysconfig/httpd に以下の行を追加します。

HTTPD_LANG=ja_JP.utf8

Apacheをソースコードからビルドしてインストールした場合

/usr/local/apache2/bin/envvars に以下の行を追加します。このファイルは apachectl 実行時に読み込まれます。

LANG=ja_JP.utf8
export LANG

HTTPD_LANGの設定が反映される仕組み

Apacheの起動スクリプト /etc/rc.d/init.d/httpd は、 /etc/sysconfig/httpd が存在すれば読み込みます。

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

/etc/rc.d/init.d/httpd start を実行すると、LANG変数にHTTPD_LANGの値をセットした上でApacheを起動します。

start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

日本語ロケールが設定されていない場合の不具合の例

Apache+Passengerの構成で実行している Redmine でSubversionリポジトリに格納されているファイルの差分を見ようとしたとき、日本語ファイル名が使われていると「リポジトリに、エントリ/リビジョンが存在しません」というエラーが表示されます。

これは、Redmineが内部でsvnコマンドを実行したときにエンコーディング変換関係のエラーが発生していることが原因です。エラーはApacheのログで確認できます。

svn: Can't convert string from 'UTF-8' to native encoding:
svn: Index: ?\227?\129?\181?\227?\129?\134.rb

/etc/sysconfig/httpd 内で HTTPD_LANG=ja_JP.utf8 と設定すると、正しく差分表示が行えるようになります。