SSHログインできないサーバーからのWebサイト移行
何らかの理由で、Webサイトをそっくりそのまま別のサーバーに移行しなければならないとします。
通常は、
- 旧サーバーでコンテンツファイルやDBデータをExport
- 新サーバーをセットアップ
- 新サーバーでコンテンツファイルやDBデータをImport
- DNSのAレコードを新サーバーのIPアドレスに変更
という手順で移行します。
このとき、これまた何らかの理由で、旧サーバーに一切ログインできない場合はどうすればよいでしょうか。
このままでは、コンテンツファイルやDBデータを取り出せません。
このようなケースのひとつの解決手段としては、「クローラーツールを使って、Webコンテンツデータをすべて静的コンテンツデータとしてダウンロードする。」という方法があります。
wgetコマンドによるWebコンテンツデータのダウンロード
サーバーがLinuxであれば、クローラーはwgetコマンドを使うのが一番簡単です。
wgetコマンドによるコンテンツのダウンロード方法は、下記サイトの説明が詳しいです。
(参考)
wgetが超絶便利なwebクローラー、クローリングツールだとは知らなかった・・・!
http://girigiribauer.com/archives/925/
$ wget --recursive \ --level inf \ --no-clobber \ --random-wait \ --restrict-file-names=windows \ --convert-links \ --no-parent \ --adjust-extension \ <ダウンロードするサイトのURL>
これで、静的なWebサイトだけではなく、Movable TypeやWordPressのようなCMSを使用したWebサイトでも、HTMLリンクでたどれる限り、Webサイトのデータをダウンロードできます。
クエリパラメータを使ったページのURLは、/index.html@q=123.html のようにちょっとカッコ悪くなってしまいますが、この際仕方ありません。
新サーバーでWebコンテンツをダウンロードできたら、ApacheなどのWebサーバーの設定を行い、Webブラウザで新サイトにアクセスし、表示やリンクが問題ないか確認します。
ダウンロードの取りこぼしがあれば、wgetコマンドで個別にダウンロードします。
JavaScriptでマウスオーバー時の画像切り替えを行っている場合などは、HTMLリンクがないため、wgetコマンドによるクロールでは取りこぼしてしまいます。
ページのリンクはすべて /aaa/index.html のようになってしまうので、これをやめて、/aaa/ としたい場合は、以下のように、findコマンドとsedコマンドを組み合わせて一括変換するとよいでしょう。
# find . -type f -print | xargs sed -i "s/\/aaa/index.html/\/aaa\//g"
認証があるページの場合
BASIC認証やCookieによる認証があるサイト、ページの場合も、wgetコマンドでダウンロードできます。
下記サイトの説明が詳しいです。
(参考)
wgetで認証付きサイトをダウンロードする
http://webos-goodies.jp/archives/51277893.html
・BASIC認証の場合
$ wget --recursive \ --http-user=<ユーザー名> \ --http-password=<パスワード> \ --level inf \ --no-clobber \ --random-wait \ --restrict-file-names=windows \ --convert-links \ --no-parent \ --adjust-extension \ <ダウンロードするサイトのURL>
・Cookieによる認証の場合
$ wget --recursive \ --header 'Cookie: name=value' \ --level inf \ --no-clobber \ --random-wait \ --restrict-file-names=windows \ --convert-links \ --no-parent \ --adjust-extension \ --reject-regex "\?logout" \ <ダウンロードするサイトのURL>
–headerオプションで、Cookie情報を指定します。
CookieのセッションID name=value の値は、Firefoxの「開発ツール」を使うのが一番簡単だと思います。
Firefoxの「ツール」>「Web開発ツール」>「Webコンソール」でWebコンソールを開いたまま対象のサイトにアクセスし、ID、パスワードを入力してログインすると、Webコンソールで送信したCookieの情報を参照できます。
–headerオプションでは、Postパラメータを渡すこともできます。
また、–reject-regexオプションでログアウト処理のURLを正規表現で指定します。
上記は、ログアウト処理のURLが /?logout の場合の例です。
ページのどこかにログアウトのHTMLリンクが存在すると、wgetが「ログアウト」を踏んでしまい、その後はログアウトした状態でダウンロードしてしまうため、結果的にコンテンツデータが正しく取得できません。
wgetコマンドが古いバージョンの場合
CentOS 5など少し古いOSに入っているwgetコマンドでは、上記のオプションの一部に対応していないので、その場合は、例えば下記のように、新しいバージョンのwgetのソースからビルドしてインストールします。
# cd /usr/local/src/ # wget http://ftp.gnu.org/pub/gnu/wget/wget-1.15.tar.gz # tar zxvf wget-1.15.tar.gz # cd wget-1.15/ # ./configure --with-ssl=openssl # make # make install # /usr/local/bin/wget --version GNU Wget 1.15 built on linux-gnu. ...
これで、新しいバージョンのwgetが /usr/local/bin/wget としてインストールされます。
まとめ
SSHログインできないサーバーから別のサーバーにWebサイトを移行する場合の、「wgetコマンドでWebコンテンツデータをダウンロードする」という解決方法についてまとめました。
Webコンテンツデータを静的なページに落とせるので、AWSのS3ホスティングに移行することもできますね。
ただ、このままではページURLがちょっとカッコ悪いですし、コンテンツの更新などWebサイトを運用していくには大変ですので、CMSを導入するなど、根本的な解決が必要となるでしょう。
余談
PC向け老舗クローラーの「波乗野郎」というソフトがあります。
「波乗野郎」は僕が昔勤めていたビー・ユー・ジーという会社で開発、リリースしたソフトで、今でもたまに使っています。
Windows 8でも、インストーラexeファイルのプロパティで、互換モード「Windows XP」を指定すればインストールでき、問題なく動作します。
今回のような「Webサイトを丸ごとダウンロードする」という用途では、(20年前のインターネット回線向けに作られているので)クロールが遅いのと、CSSの@importに追従しないなどで取りこぼしがあるため、向いていませんが。。
僕は直接開発に関わってはいないのですが、20年近く前に開発されたソフトが今でも問題なく動くというのは、感慨深いものがあります。
きょうもよい波でした。