「レンタルサーバーで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 ユーザー名@ホスト名
と実行すると、サーバーから応答がなくエラーに。
- 原因:
- XserverのSSH機能が初期設定で「無効」になっていた。
- SSHの接続ポート番号が標準の
22
ではなく、サーバー指定の番号(例:122
)だった。
- 解決策:
- サーバーパネルの「SSH設定」でSSHを有効化。
ssh -p 122 ユーザー名@ホスト名
のように、-p
オプションで正しいポート番号を指定。
問題②:Permission denied (publickey)
(ログイン拒否)
ポート番号を正しく指定しても、今度はログインを拒否されました。
- 原因: 私のサーバーはセキュリティが強化されたプランで、パスワードでのログインが禁止され、「公開鍵認証」という、より安全な方法しか許可されていませんでした。(合言葉ではなく、専用の鍵がないと入れない仕組み)
- 解決策
- サーバーパネルの「SSH設定」で、自動で公開鍵と秘密鍵のペアを作成。
- PCに「秘密鍵」ファイル(自分だけが持つ鍵)をダウンロード。
ssh -i "秘密鍵ファイルのパス" -p 122 ユーザー名@ホスト名
のように、-i
オプションでPCに保存した秘密鍵の場所を指定して接続。
これで、ついにサーバーへのログインに成功しました!
③ 最大の壁 – Pythonの部品(ライブラリ)がインストールできない!
問題①:Cron実行時 ModuleNotFoundError
テストでCronを動かすと、ログに「そんな部品(モジュール)はありません」というエラーが。
- 原因: サーバーに部品がインストールされていなかった。
問題②:pip install
時のPermissionError
(権限エラー)
pip install ...
で部品を入れようとすると、「あなたにこのフォルダを触る権限はありません」というエラーで失敗。
- 原因: 共有サーバーのセキュリティ設定。
pip
(Pythonの部品管理ツール)が、インストール前にサーバーの種類を調べようとして、管理者しか見れないフォルダ/etc
にアクセスしようとして失敗していました。 - 試したこと:
--user
オプション(自分専用領域へのインストール)も、サーバーのpip
自体の仕様が古く、同じエラーで失敗。
【最終解決策】自分だけの「Python作業部屋(仮想環境)」を作る!
この権限問題を回避するための最も確実な方法が「仮想環境(venv)」の構築でした。これは、サーバー本体の環境を汚さずに、自分だけの独立したPython環境を作る技術です。
しかし、ここでもサーバーの環境が古く、すんなりとはいきませんでした。
- 作業部屋の作成に失敗:
python3 -m venv myapp
がエラー。
原因はサーバーのPythonに付属するツールが壊れていたこと。 - 手動での環境構築に成功:
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を使うのか、フルパスで正確に指定することが成功の鍵。
この記事が、同じ壁にぶつかっている誰かの助けになれば幸いです。諦めなければ、必ず道は開けます!