treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

移行作業-Webサーバを移行する

残すはようやく最後の関門、wwwサーバの移行です。
最後の締めをご報告します。

前回(移行作業-DNSレコード編集しメールサーバを移行する)でのメールサーバ移行で、概ね移行作業は完了した気になっていました。
WEB、つまりホームページはコンテンツですからね。ファイルを右から左へ受け流す…いや受け渡すのち、DNSのAレコード更新で完了する、とヌルいこと考えていました。

これが甘かった。
Apacheは多少経験値があったとしても、HTMLに関しての知識は(ほぼ)皆無、perlCGIも名前は知っていても実際使ったことない状態、これでWebコンテンツの移行まで実施しようというのは少々無謀だったようです。

最初の山は.htaccessファイルで記述されたリダイレクト設定でした。
DNS切り替え当初はうまく閲覧できていたのに、時間を置いたら閲覧できなくなったので、なんじゃこれ?となりました。いやいや、よくよく動作確認としてリンクをクリックしまくってみると、リンクによっては閲覧できる箇所とできない箇所があるのです。
まずはエラーの確認です。
エラーは、「HTTP 500 Internal Server Error
----------------------------------------------
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator.
----------------------------------------------
なんとなく、なのですが、.htaccessファイルが原因かもしれない、と考えて、.htaccessファイルを(.htaccess.orgに)リネーム、ブラウザキャッシュをクリアして動作を確認(クリックしまくり)してみました。
.htaccessが利かない状態でのサイトアクセスには「HTTP 500 Internal Server Error」は発生しません。どうやら.htaccessファイルの動作が原因だと切り分けできました。

.htaccessファイルの中身を確認してみます。こんな感じでした。
----------------------------------------------
Redirect permanent /site_top.html http://www.hoge.co.jp/reg.html
Redirect permanent /srv.html http://www.hoge.co.jp/evnt.html
Redirect permanent /ima.html http://www.hoge.co.jp
Redirect permanent /msg.html http://www.hoge.co.jp/altmsg.html
Redirect permanent /inet.html http://www.hoge.co.jp/inet/
ErrorDocument 404 http://www.hoge.co.jp
Options -Indexes

----------------------------------------------

Redirect permanentが原因でInternal Server Errorが発生することがある、らしい。
この場合、、、
どうするんでしょ?

wwwなしをwwwありにリダイレクトするという書式例
----------------------------------------------
RewriteEngine on
RewriteCond %{HTTP_HOST} ^hoge\.co\.jp
RewriteRule (.*) http://www.hoge.co.jp/$1 [R=301,L]
----------------------------------------------
ひとまずこの書式単体で試してみました。wwwありなしでアクセスを比較してもリダイレクトしてくれているから同一のアクセスになるようです。

ということは、このサーバではMod_Rewriteが利用できるということなので、Redirect permanent行をRewriteRuleに書き換えればいいということになります。
失敗例:誤った書き方その1
----------------------------------------------
RewriteEngine on
RewriteBase /
RewriteRule ^site_top.html$ reg.html [R=301,L]
RewriteRule ^srv.html$ evnt.html [R=301,L]
RewriteRule ^ima.html$ index.html [R=301,L]
RewriteRule ^msg.html$ altmsg.html [R=301,L]
RewriteRule ^inet.html$ inet/ [R=301,L]
RewriteRule ^.*$ index.html [R=404,L]

----------------------------------------------
で、「HTTP 500 Internal Server Error」でアクセスできなくなりました。
この書き方はダメです。調べると、記述は正規表現でね、とあります。
嗚呼そうですか、あまり得意ではありませんが書いてみましょう。
失敗例:誤った書き方その2
----------------------------------------------
RewriteEngine on
RewriteBase /
RewriteRule ^/site_top\.html$ /reg.html [R=301,L]
RewriteRule ^/srv\.html$ /evnt.html [R=301,L]
RewriteRule ^/ima\.html$ /index.html [R=301,L]
RewriteRule ^/msg\.html$ /altmsg.html [R=301,L]
RewriteRule ^/inet\.html$ /inet/ [R=301,L]
RewriteRule ^.*$ /index.html [R=404,L]

----------------------------------------------
本番と同じではないテスト環境で試してみましたがエラーログとして
/DocumentRoot/.htaccess: RewriteRule: invalid HTTP response code for flag 'R'
が1アクセス毎に1行記録されています。やはり.htaccessファイルが誤っているようです。
他にも
----------------------------------------------
/DocumentRoot/.htaccess: Invalid command '\xef\xbb\xbfRewriteEngine', perhaps mis-spelled or defined by a module not included in the server configuration
----------------------------------------------
とか
----------------------------------------------
/DocumentRoot/.htaccess: ErrorDocument takes two arguments, Change responses for HTTP errors
----------------------------------------------
とかエラーログが出ました。
とかく、記述間違っているよね、ということです。失敗の記録は失敗が多すぎてあまりストックできていません。すいません。

この長いトンネルに入って12時間が経過しました。まだできないのです。
会社の休日出勤だったら大目玉ですね。
いつもならetcのhttpd.confを編集して動作を制御するという方法でやっつけてしまうのですが、レンタルサーバ共用タイプですので、いつもやっている方法は使えません。知らないながらも.htaccessファイルを頑張って調べて編集するしかないのです。
いや、でも.htaccessファイルで躓いているということはhttpd.confが編集できるとしても結局書式を理解していないから、ファイルが違うだけで動作自体は同じことになり状況は変わらないことになりますな。己の実力を悔いよ、といったところですか。
12時間経過してボチボチうんざりしてきたところで助けが入りました。
前任のWebマスターから助けが入り、電話とメールでファイル確認してもらえました。

最終的に一発で(とはいきませんでしたが).htaccessファイルを提供してもらえて少々手直しすると正常動作ができました。
----------------------------------------------
RewriteEngine on
RewriteBase /
RewriteRule ^site_top\.html$ reg.html [R=301,L]
RewriteRule ^srv\.html$ evnt.html [R=301,L]
RewriteRule ^ima\.html$ index.html [R=301,L]
RewriteRule ^msg\.html$ altmsg.html [R=301,L]
RewriteRule ^inet\.html$ inet/ [R=301,L]
ErrorDocument 404 /index.html

----------------------------------------------
まず「RewriteBase /」でDocumentRootを指定しているので、余分な「/」は入れない。
そしてRewriteRule行前半は正規表現で、後半は正規表現は不要。
「ErrorDocument」は使える、使えるから正しい書式で記述すればOK。
「Options -Indexes」は不要(レンタルサーバのデフォルト設定済みのため)
最後は改行で締める。
ファイルの書式をUTF-8のBOMなし(UTF-8N)で保存する。
データ破損を防止するためASCIIモード転送かどうか確認(※)する。
(※)これはWinSCPが適切にやってくれていたので意識しなくても大丈夫でした。

できました。
この時点で13時間経過です。
会社の休日出勤で移行作業だったらもう他のメンバーのイライラはMAXですね。
山は越えました。

後はいくつかの修正点を指示されるままに直しました。
----------------------------------------------
Perlが動作していない。cgiファイルの対象行を編集します。
旧「#!/usr/local/bin/perl5.8.4」
新「#!/usr/local/bin/perl
サーバの仕様では「/usr/bin/perl」もしくは「/usr/local/bin/perl」を使用する、ということなので、パス指定箇所を書き換えました。
----------------------------------------------
フォームでエラーが出ていたので、HTMLファイル内のmetaタグのcharsetをutf-8からsjift_jisに変更しました。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
に変更
ファイルの保存形式もS-JISです。
----------------------------------------------
あとは動作確認ですね。
フォームページを開いて、フォームの送信先アドレスが記載されたファイルを確認し、対象のML(alias)を一時的に設定変更してフォームに入力した内容がメールで飛んでくることを確認します。

DNSやメールサーバの移行は経験値があったのですが、WebサーバはAレコードを書き換えるだけでOKのつもりでした。まったく経験値のないファイルの編集で経験値が貯まったんだかどうなんだか…。

最後にユーザ用のFTP設定の更新とDNSのレコード設定を完全移行してCheckOutです。

やるだけやったから、なにかあったら随時修正にしよう、と心に決めて移行作業は終了しました。

教訓:
自分のやる範囲ははっきりさせておき、最初から不安点は支援を受けられるように根回ししておきましょう。
コンテンツ(ページ)の担当者でないのなら、コンテンツの心配はしなくてもいい(はず)ですよね。