自宅サーバーをClaude Codeと一緒に引っ越しした話(2):WSL2 + nginxの初期構築
前回は、自宅サーバー引っ越しの経緯と全体像を紹介しました。今回からは実際の作業を1テーマずつ振り返っていきます。第2回は、新しいミニPCにWebサーバーの土台を作り、既存のホームページを表示できるようにするまでの初期構築編です。
Claudeとの作業の進め方
作業は「やりたいことを伝える → Claudeが手順とコマンドを提示 → 実行して結果を返す」の繰り返しで進めました。
ただし、sudo(管理者権限)が必要な操作や、WSL2そのものに関わる操作は、Claude側からは直接実行できない場面がありました。そういうときは、提示されたコマンドを自分で管理者権限のPowerShellやUbuntuのターミナルに貼り付けて実行し、その結果をClaudeに返す、という流れです。エラーが出てもそのまま画面キャプチャを貼り付ければ原因を読み解いてくれるので、コマンドの意味を完全に理解できていなくても、とりあえず作業が前進するのは大きかったです。
WSL2(Ubuntu)とnginxのセットアップ
前回書いたとおり、Windowsに直接nginxを入れるのではなく、WSL2でUbuntuを動かしてその中にnginxを入れる構成をClaudeに提案してもらいました。Linux上のnginxなら情報も豊富で、後々のPHPやデータベースの追加もスムーズにいく可能性が高いです。WSL2とUbuntuを導入したら、あとは普通のLinuxと同じ手順でnginxをインストールします。
sudo apt update
sudo apt install -y nginx

旧サーバーからホームページのファイルを移す
移行対象は2つの静的サイトです。旧サーバーの共有フォルダからWSL2側へコピーしました。
- Takesa’s Homepage →
/var/www/html(16.5万ファイル超) - krp →
/var/www/krproot(約3,600ファイル)
ちなみに、元の Takesa’s Homepage 自体は BiND 5 という編集ソフトで作成していたのですが、Adobe Flashに依存したソフトだったため、現在起動することができなくなっています。
つまりホームページの構造を大きく変更するような編集は非常に困難な状態になっていて、更新が止まってしまった原因でもありました。

ファイル一式をWindows Server2008からUbuntu側にまるごとコピーした後は、nginxが読めるように所有者を www-data に変更しています。
sudo chown -R www-data:www-data /var/www/html /var/www/krproot
sudo chmod -R 755 /var/www/html /var/www/krproot
1台のnginxで2つのドメインを振り分ける
2つのサイトはドメインが違うだけで、同じポート(当時は8080番)で公開します。nginxの server_name でアクセスされたドメインを見て、表示するフォルダを切り替える設定です。
server {
listen 8080;
server_name takesa.dyndns.org;
root /var/www/html;
}
server {
listen 8080;
server_name krp.dyndns.info;
root /var/www/krproot;
}
(実際の設定には、このあと紹介するアクセスカウンターやGoogle Analyticsの設定も入っていますが、ここでは骨格だけにしています。)
最初の壁:WSL2の中のnginxに外部からアクセスできない
nginxはWSL2の中で動いているので、Windows自身からは見えても、LAN上に繋がっている他のPCやインターネットからはそのままでは届きません。WSL2はWindowsの中に仮想的なネットワークを持っていて、内部IPアドレスもWindowsのものとは別だからです。
Claudeからは、Windowsの netsh interface portproxy で「Windowsの8080番に来たアクセスをWSL2の8080番へ転送する」設定と、Windowsファイアウォールの受信許可ルールの追加を提案されました。
# 管理者権限のPowerShellで実行
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=<WSL2の内部IP>
New-NetFirewallRule -DisplayName "WSL2 nginx 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
これで外からアクセスできるようになりましたが、WSL2の内部IPは再起動のたびに変わってしまうため、そのたびに転送設定を直す必要がありました。この問題は後に自動化して解決しています(後の回で紹介予定)。
動作確認
この時点ではまだDNSやルーターの設定を切り替えていないので、ドメイン名でのアクセスはできません。そこで、curlでHostヘッダーを指定して、新サーバーに直接「takesa.dyndns.orgとしてアクセス」させて確認しました。
curl.exe -H "Host: takesa.dyndns.org" http://<新サーバーのIP>:8080/
curl.exe -H "Host: krp.dyndns.info" http://<新サーバーのIP>:8080/
ちなみにPowerShellでは curl が Invoke-WebRequest の別名になっていて、-H オプションが使えません。Windowsに同梱されている本物のcurlを使うには curl.exe と明示する必要があります。こういう細かい落とし穴も、エラーメッセージをClaude Codeに貼り付けるとすぐに原因と対処方法を教えてくれました。
両サイトとも正しく表示されることを確認し、初期構築はひとまず完了です。
ファイル編集の環境
WSL2の中のファイルは、Windows側のVS Codeに「Remote – WSL」拡張機能を入れて、Windows側から編集しています。所有者が www-data のファイルはそのままでは編集できないので、編集する間だけ自分の所有に変えて、終わったら戻す運用にしました。また、エクスプローラーから \\wsl$\Ubuntu\... を開けば、WSL2内のファイルをWindowsのファイルと同じ感覚で扱えるのも便利です。
次回
これでページは表示されるようになったのですが、実際に中を見ていくとリンク切れや画像が表示されない箇所がたくさん見つかりました。原因は、Windowsではファイル名の大文字・小文字を区別しないのに、Linuxでは区別すること。次回は、サイト全体で479件見つかったこの「ケース不一致問題」をClaudeと一緒に片付けた話です。
