スポンサーリンク

【完全ガイド】XserverでPythonが動かない! SSH接続からCron設定までの全トラブルシューティング

Python

「レンタルサーバーでPythonを動かして、Webサイトの情報を自動でチェックしたい!」
そう思ってスクリプトを書いてみたものの、PCでは動くのにサーバーではエラーばかり…そんな経験はありませんか?

この記事は、Xserver(エックスサーバー)でPythonスクリプトを定期実行(Cron)させようとして、実際に遭遇したすべてのエラーとその解決策をまとめた、実践的なトラブルシューティングガイドです。

★ 私がやりたかったこと

  • 特定のWebサイトの情報を定期的にチェックするPythonスクリプト(check.py)を作成。
  • スクリプトをXserverにアップロード。
  • 毎日決まった時間に自動で実行(Cron)。
  • 特定の条件を満たしたら、Gmailで自分に通知メールを送る。

一見簡単そうに見えますが、ここには数々の「サーバーならではの壁」が待ち受けていました。

① スクリプトの準備とアップロード

これは簡単でした。完成したPythonスクリプト(check.py)を、サーバーパネルの「ファイルマネージャ」を使ってアップロードします。

【ポイント】
安全のため、Webから直接アクセスできない場所にアップロードします。public_htmlフォルダの外に、cron_scriptsのような専用フォルダを作ってそこに入れるのがおすすめです。

私の設置場所: /home/サーバーID/cron_scripts/check.py

② 最初の壁 – SSHでサーバーに接続できない!

【初心者向け解説】SSH接続ってなに?

SSH(エスエスエイチ)とは、「サーバーを遠隔操作するための、安全な秘密のトンネル」のことです。
通常、私たちはブラウザでWebサイトを見ますが、これは家のポストに手紙が届くような一方通行の関係です。しかし、サーバーの内部設定を変更したり、プログラムを実行したりするには、サーバーの中に入って直接命令する必要があります。
SSHは、PCの「ターミナル」や「PowerShell」といった黒い画面(CUI)から、暗号化された安全なトンネルを通ってサーバーにログインし、「このコマンドを実行して!」と直接命令できる仕組みです。サーバーで少し凝ったことをするには必須の技術です。

ここが最初の大きな関門でした。

問題①:Connection timed out(時間切れエラー)

PowerShellでssh ユーザー名@ホスト名と実行すると、サーバーから応答がなくエラーに。

  • 原因:
    1. XserverのSSH機能が初期設定で「無効」になっていた。
    2. SSHの接続ポート番号が標準の22ではなく、サーバー指定の番号(例: 122)だった。
  • 解決策:
    1. サーバーパネルの「SSH設定」でSSHを有効化
    2. ssh -p 122 ユーザー名@ホスト名のように、-pオプションで正しいポート番号を指定。

問題②:Permission denied (publickey)(ログイン拒否)

ポート番号を正しく指定しても、今度はログインを拒否されました。

  • 原因: 私のサーバーはセキュリティが強化されたプランで、パスワードでのログインが禁止され、「公開鍵認証」という、より安全な方法しか許可されていませんでした。(合言葉ではなく、専用の鍵がないと入れない仕組み)

  • 解決策
    1. サーバーパネルの「SSH設定」で、自動で公開鍵と秘密鍵のペアを作成
    2. PCに「秘密鍵」ファイル(自分だけが持つ鍵)をダウンロード。
    3. ssh -i "秘密鍵ファイルのパス" -p 122 ユーザー名@ホスト名 のように、-iオプションでPCに保存した秘密鍵の場所を指定して接続。

これで、ついにサーバーへのログインに成功しました!

③ 最大の壁 – Pythonの部品(ライブラリ)がインストールできない!

問題①:Cron実行時 ModuleNotFoundError

テストでCronを動かすと、ログに「そんな部品(モジュール)はありません」というエラーが。

  • 原因: サーバーに部品がインストールされていなかった。

問題②:pip install時のPermissionError(権限エラー)

pip install ...で部品を入れようとすると、「あなたにこのフォルダを触る権限はありません」というエラーで失敗。

  • 原因: 共有サーバーのセキュリティ設定。pip(Pythonの部品管理ツール)が、インストール前にサーバーの種類を調べようとして、管理者しか見れないフォルダ/etcにアクセスしようとして失敗していました。

  • 試したこと: --userオプション(自分専用領域へのインストール)も、サーバーのpip自体の仕様が古く、同じエラーで失敗。

【最終解決策】自分だけの「Python作業部屋(仮想環境)」を作る!

この権限問題を回避するための最も確実な方法が「仮想環境(venv)」の構築でした。これは、サーバー本体の環境を汚さずに、自分だけの独立したPython環境を作る技術です。

しかし、ここでもサーバーの環境が古く、すんなりとはいきませんでした。

  1. 作業部屋の作成に失敗: python3 -m venv myappがエラー。
    原因はサーバーのPythonに付属するツールが壊れていたこと。

  2. 手動での環境構築に成功:
    • python3 -m venv --without-pip myapp
      → まずは「空っぽの作業部屋」だけを作成。
    • source myapp/bin/activate
      → 作った作業部屋に入る。プロンプトの先頭に(myapp)と表示されれば成功!
    • curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py
      → サーバーの古いPython(3.6)に対応した、正しいpipインストーラーをネットから直接ダウンロード。
    • python get-pip.py
      → ダウンロードしたインストーラーで、pipを手動で設置。
    • pip install requests beautifulsoup4
      → ついに、自分だけの作業部屋に、必要な部品をインストールすることに成功!

④ 最終テスト – すべての機能が動いた!

自分だけの作業部屋(仮想環境)に入った状態で、スクリプトを手動で実行しました。

◆ 実行コマンド

python /home/サーバーID/cron_scripts/check.py

(仮想環境内なので、フルパスで/usr/bin/python3と指定しなくてもOK)

結果、Webサイトからの情報取得、サイト内容解析、そしてGmailでのメール送信まで、すべての処理が完璧に成功! 長い戦いの末、ついにプログラムが意図通りに動作した瞬間でした。

⑤ ゴール – 正しいCron設定を組む

【初心者向け解説】Cron(クロン)ってなに?

Cronとは、「指定した日時に、指定した命令(コマンド)を自動で実行してくれる、サーバーの執事」のような機能です。
例えば、「毎朝10時30分に、このプログラムを実行しておいて」と一度だけお願いしておけば、あとはあなたが寝ていても遊んでいても、サーバーの執事であるCronが毎日その時間にきっかりと仕事をしてくれます。
「分・時・日・月・曜日」と「実行したいコマンド」を設定するだけで、面倒な繰り返し作業を完全に自動化できる、非常に便利な仕組みです。

最後の仕上げです。この成功した状態を、サーバーに自動で実行してもらいます。

【超重要ポイント】
Cronに設定するコマンドは、「どのPythonを使って実行するか」を正確に指定する必要があります。

  • 間違い: /usr/bin/python3 ...
    → これだとサーバー本体のPythonを使おうとします。こちらには部品が入っていないのでModuleNotFoundErrorで失敗します。
  • 正解: /home/サーバーID/myapp/bin/python ...
    → 私が作った「作業部屋の中にあるPython」のフルパスを指定します。こちらには部品が正しくインストールされています。

完成したCronコマンド

/home/サーバーID/myapp/bin/python /home/サーバーID/cron_scripts/check.py >> /home/サーバーID/cron_scripts/cron.log 2>&1

>> ...の部分は、実行結果をログファイルに記録するためのおまじないです。これがあるおかげで、今回のようなトラブルシューティングが可能になりました。

これをサーバーパネルのCRON設定に登録し、ついに私の目的は完全に達成されました!

まとめ

レンタルサーバーでPythonを動かすのは、PCで動かすのとは全く違う「環境」との戦いでした。今回の経験から学んだことは以下の通りです。

  • エラーメッセージは宝の山: 焦らずに読むと、必ず解決のヒントが隠されている。
  • 権限エラーはつきもの: 共有サーバーでは、権限エラーが出たら「仮想環境(venv)」を構築するのが王道。
  • Cronのパス指定は絶対: どのPythonを使うのか、フルパスで正確に指定することが成功の鍵。

この記事が、同じ壁にぶつかっている誰かの助けになれば幸いです。諦めなければ、必ず道は開けます!

タイトルとURLをコピーしました