manekineko倉金家ホームページ

趣味の部屋/インターネットサーバー/サーバー構築メモ その2

サイトのバックアップ

2010年8月1日 2011年1月3日 更新
Vine Linux 4.2 の古いサーバーをバックアップサーバーとして使い、CentOS 5.5 の新しいサーバーのサイトをバックアップします。
両者のサーバーでディフォルト言語が異なる(EUC-JPとUTF-8)ため、バックアップサーバーからホームページを読み出してもそのままちゃんと表示するようにするために少々言語設定が必要でした。

新しく構築したCentOS 5.5のインターネットサーバーは順調に稼動しています。
古い Vine Linux 4.2 のサーバーをそのままバックアップサーバーとして使い、新しいCentOS 5.5のサーバーのサイトをバックアップします。
ただしバックアップとはいっても単にファイルを保存しておけばいいというのではなく、いざという時にはルーターのDMZアドレスを振替えるだけでそのまま代替のインターネットサーバーとして動作するようにしておきます。

問題があるとすれば、
1)ソフトのバージョンによる動作のちがい。
2)言語エンコーディングのちがい。 が考えられます。
1)については、どちらか一方のバージョンでしか動かないような機能は使っていないはずなので、さほど大きな問題はなさそうです。
問題は2)の言語エンコーディングの違いと思われます。

Vine Linux 4.2はEUC-JP、CentOS 5.5はUTF-8を使っていますが、少なくともVine LinuxからCentOSにファイルを移し、移したファイルをUTF-8に変換してエンコーディング指示もUTF-8に変更した分には問題はありませんでした。 (けっこうな手間だったけど。)
ただバックアップとなるといちいちこんな変換や変更はやってはいられません。ファイルをコピーするだけでちゃんと動くようにしておかなくてはなりません。

事前準備
まずは新しいサーバーとバックアップサーバーとで、関連するユーザのユーザ名とユーザ番号、グループ番号をあわせておきます。
これはサーバー構築時から意識していたので特に問題ありません。

バックアップサーバーからNFSで新サーバーのホームディレクトリが見れるようにします。書き込みはできなくてもかまいません。これも設定ずみです。

バックアップスクリプトを準備します。httpデータの移行で使ったスクリプトと似たようなもん。
#!/bin/sh

LOGFILE="/var/log/backup.log"
function dir_copy()
{
echo "copying from $1 to $2" | tee -a "$LOGFILE"
if [ -d "$1" -a -d "$2" ]
then
cd "$1"
find . -print | cpio -avdump "$2" 2>&1 \
| grep -v "newer or same age version exists" \
| sed "s/\/\.\//\//" \
| pickup_file \
| tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"
else
echo "********** Can't open $1 or $2 **********" | tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"
fi
}

function dir_update()
{
echo "updatecopying from $1 to $2" | tee -a "$LOGFILE"
if [ -d "$1" -a -d "$2" ]
then
cd "$1"
find . -print | cpio -avdmp "$2" 2>&1 \
| grep -v "newer or same age version exists" \
| sed "s/\/\.\//\//" \
| pickup_file \
| tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"
else
echo "********** Can't open $1 or $2 ***********" | tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"
fi
}

function sqldata_copy()
{
echo "copying from $1 to $2" | tee -a "$LOGFILE"
if [ -d "$1" -a -d "$2" ]
then
cd "$1"
# 注意:sortの記述はテーブル名の番号の付け方に応じて。ぬいても可。
find . -print | sort -n -t "_" -k 2 | cpio -avdump "$2" 2>&1 \
| grep -v "newer or same age version exists" \
| sed "s/\/\.\//\//" \
| pickup_file \
| tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"
else
echo "********** Can't open $1 or $2 **********" | tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"
fi
}

#ファイル名(ディレクトリ名以外)のみピックアップして出力
function pickup_file()
{
while read path
do
if [ ! -d "$path" ] ; then
echo "$path"
fi
done
}


echo "$0 start" | tee "$LOGFILE"
date | tee -a "$LOGFILE"
echo | tee -a "$LOGFILE"

# 以下にバックアップするサイトを羅列

#### kuragane.jp ####
SRCDIR="/mnt/home.jiji/kuragane.jp"
TGTDIR="/home/kuragane.jp"
dir_update $SRCDIR $TGTDIR

SRCDIR="/mnt/home.jiji/mysql/SQL_kuragane"
TGTDIR="/home/mysql/SQL_kuragane"
sqldata_copy $SRCDIR $TGTDIR

#### ...... ####
....

やってみる
まずは新しいサーバーのサイトのデータ(http表示ディレクトリ)をそっくりバックアップサーバーにコピーします。
文字化けするだろうなと思いながらブラウザでアクセス。...文字化けどころか何も表示されません。

apacheのエラーログを見ると日本語処理関係の関数(mb string関係の関数)がエラーを起こしています。EUC-JPで動いているphpモジュールにUTF-8を処理させようとしたためのようです。

まずはこのエラーを修正、引き続いて文字化けを修正、何とか問題なく動くようになりました。
phpモジュールやMySQLサーバーなどのディフォルトの言語設定をみなUTF-8に変えてしまえば簡単かもしれませんが、もともとの別のソフトをそのまま動かすためにはそうはいきません。

以下、いろいろやったこと。
基本的には入ってくるデータをすべて必要に応じてUTF-8に変換し、内部処理をUTF-8で行い、あとはそのまま出力するというもの。
1.phpモジュールの言語設定
ディフォルトの言語がEUC-JPのVine4のphpは当然EUC-JPがディフォルトの言語設定になっています。
php.iniで以下を指定しています。
default_charset=EUC-JP
mbstring.internal_encoding=EUC-JP
ただし他との関連もあるのでこれを変えてしまうわけにもいきません。
で、ページの頭でセッティングファイルをインクルードすることにして、すべてのページの頭に以下を記載。
<?php
include_once('setting.inc.php');
?>

セッティングファイルsetting.inc.phpに以下を記載。
<?php
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
?>
2.MySQLの言語設定
バックアップサーバーのMySQLも当然ディフォルトのEUC-JPで動いています。(my.confで設定。)
データベースをオープンしてすぐに以下のクエリーで言語を変更。
mysql_query('SET NAMES utf-8');
バージョンの関係でSET NAMESを使用したが、セキュリティー上多少問題がある方法なのでPHP-5.2.3以降なら
mysql_set_charset('utf-8');
のほうがいいかと。
3.読み込みデータの変換
POSTやREQUESTデータがUTF-8になっていません。httpサーバーがUTF-8以外を指定してしまうのか、あるいはどこかで変換されてしまうかよくわかりません。

念のため<form .... accept-charset="utf-8">でブラウザがデータをutf-8で送信するように、すべての<form>タグにaccept-charset="utf-8"を記載。

POSTあるいはREQUESTを受けるページの頭でこれらをUTF-8に変換。
ページの頭でセッティングファイルをインクルードするようになっていますので、これに以下を記載。
<?php
if(!empty($_REQUEST)){ mb_convert_variables('UTF-8', 'auto', $_REQUEST); }
if(!empty($_POST)){ mb_convert_variables('UTF-8', 'auto', $_POST); }
?>
4.ファイルの言語変換
ファイルの言語変換はもうやりません。バックアップしたファイルはUTF-8のままにしておきます。
バックアップサーバーでファイルを開いて見るときなどはいちいちUTF-8を指定しなくてはなりませんが、めったにないのでいいことにします。(昔のShift-JISのファイルもそのままだし。)

以上でバックアップサーバーからホームページを読み出してもちゃんと表示されるようになりました。