第3回 ホームページのサーバー引っ越し顛末記

:2026年の10月、このホームページを新しいサーバーに引っ越しました。

長年お世話になっている共用サーバーは FTP しか使えず、PHP や Perl も古いままでした。 プロバイダさんに相談したところ、他の利用者さんも多いので今のサーバーを大きく変えるのは難しいけれど、 SFTP が使える新しいサーバーに移しましょう、ということになりました。ありがたい。。
その引っ越しでハマったところをメモしておきます。作業は Claude(生成AI)に手伝ってもらいながら進めました。

鍵を作ってプロバイダに送る

新しいサーバーはパスワードではなく、鍵で認証する SFTP です。 Windows に最初から入っている OpenSSH で鍵のペアを作りました。

ssh-keygen -t ed25519 -f %USERPROFILE%\.ssh\id_ed25519_newserver

初めて接続するときに「このサーバーの鍵を信用しますか?」と指紋(フィンガープリント)が表示されます。 本当は、プロバイダから教えてもらった指紋と照らし合わせてから「はい」を押すのが正しいやり方です。

HTML はすんなり、PHP は動かない

静的な HTML のページは、アップロードするだけで普通に表示されました。
ところが PHP のファイルを開くと、プログラムがそのまま画面に表示される(゚Д゚;) 新しいサーバーには Apache の PHP モジュールが入っておらず、PHP は CGI として動かす方式でした。

テスト用のフォルダでいくつか試して、次の組み合わせで動きました。

# .htaccess
AddHandler php-cgi-script .php
Action php-cgi-script /~arai/テスト用フォルダ/php.cgi
#!/bin/sh
# php.cgi(パーミッションは 755)
exec /usr/bin/php-cgi8.4

.php へのアクセスを、php.cgi という小さなスクリプトに渡して、そこから PHP を起動する仕組みです。 AddType で指定するやり方だと、ファイルがダウンロードされるだけでした。

ただ、PHP が動いても、MySQL につなぐための拡張機能や、Perl の CGI モジュールなどが入っていませんでした。 ここは自分ではどうにもできないので、必要なものを一覧にしてプロバイダさんにインストールをお願いしました。 翌日には入れてもらえて、データベースにも PHP と Perl の両方からつながることを確認しました。

※その後、日記もチャットも PHP を使わない形で作り直したので、結局今は PHP を使っていません(^^;

古いサーバーの後始末

  1. まず全部ダウンロード。FTP で古いサーバーのファイルをまるごとバックアップしました。(約1,200ファイル)
  2. 見られてはいけないものがないか確認。 昔使っていたアクセス解析の CGI のログ(訪問者の接続元が入っている)が、URL を直接打つと読める状態で残っていました。 新しいサーバーにも一緒に持ってきてしまっていたので、こちらも削除しました。 昔のファイルをそのまま引っ越すときは要注意です。
  3. 古いアドレスから新しいアドレスへ転送。 古いサーバーには .htaccess だけを残して、すべてのページを新しいサーバーの同じ場所へ転送するようにしました。
    RewriteEngine on
    RewriteRule ^(.*)$ https://www7.ginzado.ne.jp/~arai/$1 [R=301,L]
    R=301(恒久的な移転)にしておくと、検索エンジンにも「引っ越しました」と伝わります。 いきなり全部を転送する前に、1ページだけで試してから切り替えました。

事件:ある日突然 SFTP がつながらない

引っ越しも落ち着いたころ、WinSCP で接続しようとしたら、こんなエラーが出ました。

大きな SFTP パケット(1416128883 B)を受信しました。
サポートしている最大パケットサイズは 1024000 B です。

1.4GB のパケット??と思ったのですが、この数字を16進数にすると 0x54686973。 これを1バイトずつ文字にすると……

54 68 69 73
 T  h  i  s

「This」でした。 サーバーが SFTP の返事の代わりに「This …」で始まる英語の文章を返していて、 WinSCP がその先頭4文字を「パケットの大きさ」として読んでしまっていたんですね。

何と言っているのか、コマンドの ssh でログインしてみると、最後にこう表示されて切断されました。

This account is currently not available.

アカウントのログインシェルが、ログイン禁止(nologin)に変えられていたのが原因でした。 ちょうどプロバイダさんに定期実行(cron)の設定をお願いした直後で、 後で聞いたら「SFTP だけなら nologin でも大丈夫だと思っていた」とのことでした。
SFTP は、ログインしたあとにそのアカウントのシェルを経由して SFTP 用のプログラムを起動するので、 シェルがログイン禁止だと SFTP も動かなくなります。

プロバイダさんには、エラーとメッセージを添えて、 「シェルでのログインを禁止したいなら、sshd の設定で SFTP だけ許可する方法(ForceCommand internal-sftp)もあります」 とお伝えしたところ、すぐに元に戻してもらえました。cron の設定もしていただけました。感謝です。

振り返り

以上、です。

← コラム一覧へ