仙台の山奥で自転車に乗ったり転んだり

愛車の GIOS でサイクリングしたりポタリングしたり、それをブログに記録してみたり。ロードバイクや自転車や坂のことを書いてみたり。ときたまプログラムのことを忘れないようにメモってみたり。

古いサーバで稼働していたWebアプリケーションの移植

古いサーバで稼働していたシステムを、新たらしい仮想環境に移植したときの、大雑把なメモです。

データベース(PostgreSQL)の移行

デーベースサーバも新しい環境に移行したものの、サーバ間はVPNがあったのではまることなく楽でした。

新しいサーバにユーザを作成しておく。
$ createuser -U postgres -h localhost --no-createdb --no-adduser --pwprompt exampleuser

$ createuser -U postgres -h localhost --no-superuser --no-createdb --no-createrole --pwprompt exampleuser

移植してくるデータベースの文字エンコーディングは「EUC_JP」で、新しいデータベースサーバはUTF-8で初期化しているため、ロケールがあわなかったり、テンプレートデータベースの符号化方式(UTF8)と互換性がなかったりする。プログラムのエラー通りに、文字エンコードロケールのオプションを指定して、テンプレートデータベースもtemplate0にして、データベースを作成する。
(本来ならダンプとレストアでデータベースの作成も含めるつもりだったけど、データベースサーバ同士にバージョンの隔たりがあったから、意図したとおりにデータベースが作成できないための措置)

createdb -U postgres -h localhost --encoding EUC_JP --locale=ja_JP.EUC_JP --template=template0 exampledb

旧データベースサーバからダンプしたSQLを、新しいデータベースサーバで実行する。デーベースの作成のところでエラー発生するけど気にしない。

pg_dump --insert --create --format=p -U postgres -h db.example.com exampledb | psql -U postgres -h localhost exampledb

Webアプリケーションの移植

プログラム自体は、古いPHP3〜PHP4時代にメンテナンスしていたWebアプリケーションなので、新しいサーバではなかなかすんなり動いてくれない……。
移植先のサーバはPHP5.3で他のプログラムも稼動予定のVHOSTなので、とりあえずPHPの設定などはApacheのVHOSTごとの設定の中で調整するなど工夫してみた。

「mbstring」モジュールの変換機能にどっぷり任せっきりな実装だったので、なるべく崩れないようにPHPの設定だけで調整したり。
「mbstring.script_encoding」任せなSJISソースコードが多々混在していたのでファイルの文字コードを変換しまくったり……。

$ find vhost/www.example.com -type f -name "*.php" -exec nkf -e --overwrite {} \;
$ find vhost/www.example.com -type f -name "*.inc" -exec nkf -e --overwrite {} \;

地味につらかったのが、「_()」という関数を使い捨てで乱用されていたのが、gettextの「_()」関数と競合してエラーが出まくったので、ごまかしごまかし置換しまくったり……。

$ find vhost/www.example.com -type f -exec sed -i -e 's/ _(/ _un_(/g' '{}' \;

その他、おかしな挙動や変数未定義でのnoticeやら、定義が不定の配列のforeachでwarningやらをチマチマと修正して、だいたい動作が確認できた。しんどい……。