Webサイトの更新作業を効率化するため、MacからSSHでXserverへ接続し、最終的にGitHubのリポジトリをXserverへ取得できる環境を整えました。
今回は、実際に遭遇したエラーと原因の切り分けも含めてまとめます。なお、サーバーID、ユーザー名、IPアドレス、秘密鍵名などはすべて一般化しています。
最初にXserverのサーバーパネルからSSHを有効にします。
“`text
サーバーパネル
→ SSH設定
→ SSH設定をON
“`
XserverではSSH接続に通常の22番ではなく、`10022`番ポートを使用します。
また、公開鍵認証用の鍵ペアを生成し、秘密鍵をMac側へ保存しておきます。秘密鍵は外部へ公開してはいけません。
Macの`~/.ssh/config`にXserverへの接続設定を書きます。
“`sshconfig
Host xserver
HostName example.xserver.jp
User サーバーID
Port 10022
IdentityFile ~/.ssh/xserver.key
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
“`
ここで重要なのは`User`です。Macのユーザー名ではなく、Xserverで確認できる正しい「サーバーID」を指定します。
サーバーIDはxserverアカウントから確認します。サーバーパネルではないので注意が必要です。
https://www.xserver.ne.jp/support/faq/service_missing_member_id.php
`Host xserver`は自分で決める接続名なので、設定後は長い接続コマンドを書かずに次のように接続できます。
“`bash
ssh xserver
“`
秘密鍵作成時にパスフレーズを設定していても、`~/.ssh/config`へパスフレーズそのものを書く必要はありません。むしろ平文で書くべきではありません。
Macでは次のように鍵をキーチェーンへ登録できます。
“`bash
ssh-add –apple-use-keychain ~/.ssh/xserver.key
“`
`AddKeysToAgent yes`と`UseKeychain yes`を設定しておけば、毎回パスフレーズを入力する手間も減らせます。
秘密鍵のアクセス権も確認しておきます。
“`bash
chmod 600 ~/.ssh/xserver.key
“`
最初に困ったのが、`ssh xserver`を実行しても長い間何も表示されない状態でした。
このような場合は詳細ログを表示します。
“`bash
ssh -vvv -o ConnectTimeout=10 xserver
“`
今回、最初に確認できたのは次のようなエラーでした。
“`text
connect to address xxx.xxx.xxx.xxx port 10022: Operation timed out
“`
これは秘密鍵による認証以前に、SSHの10022番ポートへ到達できていないことを意味します。
この段階では、秘密鍵を何度変更しても解決しません。次の項目を確認します。
– Xserver側でSSHがONになっているか
– ホスト名が正しいか
– ポートが`10022`になっているか
– VPNやネットワーク側で10022番ポートが遮断されていないか
– Xserver側のアクセス制限に該当していないか
ポートへの疎通は次のように確認できます。
“`bash
nc -vz -w 10 example.xserver.jp 10022
“`
SSHではホスト名の形式を間違えると、次のようなエラーになります。
“`text
Could not resolve hostname …: nodename nor servname provided, or not known
“`
これは認証エラーではなく、指定したホスト名をDNSで解決できない状態です。
Xserverのサーバーパネルに表示される正確な「ホスト名」や「サーバーID」を確認して設定することが重要です。似たドメイン名を推測して入力しない方が安全です。
ネットワーク側の問題を解決すると、今度は次のエラーが表示されました。
“`text
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
“`
これは先ほどのタイムアウトとは意味が違います。
サーバーには到達できており、公開鍵認証の段階で拒否されているということです。この場合は次を確認します。
– SSH設定の`User`が正しいサーバーIDか
– `IdentityFile`がXserver用の正しい秘密鍵か
– その秘密鍵とXserver側に登録された公開鍵がペアになっているか
使用中の設定は次のコマンドでも確認できます。
“`bash
ssh -G xserver | grep -E ‘^(hostname|user|port|identityfile) ‘
“`
今回の原因は、最終的に`User`へ指定していたサーバーIDの間違いでした。正しいサーバーIDへ修正するとSSHでログインできました。
エラーメッセージを見ることで、「ネットワークの問題」と「認証の問題」を分けて考えることが大切だと分かりました。
MacからXserverへSSH接続できたら、次はXserverからGitHubへアクセスできるようにします。
ここで注意したいのは、次の2つのSSH接続は別物だという点です。
“`text
Mac → Xserver
Xserver → GitHub
“`
MacからXserverへログインできても、XserverからGitHubへ自動的に接続できるわけではありません。
Xserver上でGitHub用のSSH鍵を作る場合は、例えば次のようにします。
“`bash
ssh-keygen -t ed25519 -C “xserver-github”
“`
公開鍵を確認します。
“`bash
cat ~/.ssh/id_ed25519.pub
“`
表示された公開鍵だけをGitHubへ登録します。秘密鍵`id_ed25519`は絶対にGitHubやブログなどへ掲載しません。
GitHub側ではSSHキーの設定画面から公開鍵を登録し、その後Xserverから接続テストを行います。
“`bash
ssh -T git@github.com
“`
認証できれば、GitHubからSSH方式でcloneできる状態になります。
すでに稼働している`public_html`へ、いきなりGitHubの内容を上書きするのは危険です。
GitHubには存在しない`.htaccess`、アップロード画像、サーバー固有の設定ファイルなどがある可能性があるためです。
そのため、まず別の作業ディレクトリへcloneします。
“`bash
cd ~
mkdir -p git-work
cd git-work
git clone git@github.com:GitHubユーザー名/リポジトリ名.git
“`
clone後に確認します。
“`bash
cd リポジトリ名
git status
git remote -v
“`
この段階では、公開中のサイトとGitHubから取得したコードは別々です。
“`text
公開中のWebサイト
~/対象ドメイン/public_html
GitHubからcloneしたコード
~/git-work/リポジトリ名
“`
両者のファイルや設定を確認してから、`public_html`をGit管理する構成へ移行するのが安全です。
`public_html`を正しくGit管理できる状態へ移行すれば、今後はSSHでXserverへ入り、対象ディレクトリで次のように更新できます。
“`bash
git status
git branch –show-current
git pull origin main
“`
ただし、本番サーバーで直接ファイルを修正している場合は、`git pull`の前に必ず`git status`を確認します。ローカル変更が残ったままpullすると競合する可能性があるためです。
今回の作業で特に重要だったのは、SSHのエラーを一括りにしないことでした。
`Operation timed out`なら、まずネットワーク・ポート・Xserver側のSSH設定を疑います。
`Could not resolve hostname`なら、ホスト名を確認します。
`Permission denied (publickey…)`なら、すでにサーバーには到達しているため、サーバーID・秘密鍵・公開鍵の組み合わせを確認します。
今回は最終的にサーバーIDの指定ミスを修正することでログインできました。
SSH接続が一度安定すれば、CursorなどのエディタからRemote SSHでXserverを操作したり、GitHubを利用して更新作業を効率化したりできるようになります。手作業でファイルをアップロードする運用から、Gitを使った更新へ移行する第一歩として有効だと思います。