トラブルシューティングFAQ(よくある原因と対処法)

お名前.comの共用サーバー環境でPythonアプリケーション(Flask/FastAPI/スクレイピング等)を本番運用する際、「画面に500 Internal Server Errorが表示される」「Cronが動かない」といったトラブルは非常に多く発生します。

原因特定と即時復旧のための「トラブルシューティングFAQ&チェックリスト」です。

Q1. 画面に「500 Internal Server Error」が表示される

最も頻出するエラーです。共用サーバー(CGI実行環境)では、主に以下の3つが原因です。

  • 原因①:改行コードが Windows 形式(CRLF)になっている
    • 対処: ファイルの改行コードを LF(Unix形式)に変換して再保存・転送してください。VS Code等のステータスバー(右下)から CRLF を LF に切り替えるか、ターミナルで dos2unix index.cgi を実行します。
  • 原因②:シバング(1行目のPythonパス)が誤っている
    • 対処: #!/usr/bin/bin/python3 や python などの相対指定は動かない場合があります。必ずサーバー上の仮想環境(venv)の絶対パスを記述してください。Bash#!/home/アカウントID/public_html/ドメイン名/venv/bin/python3
  • 原因③:ファイル・ディレクトリのパーミッション(権限)違反
    • 対処: お名前.comのCGI仕様に合わせ、パーミッションを変更してください(下記チェックリスト参照)。

Q2. ターミナルからは動くのに、Web経由やCronだとエラー(ModuleNotFoundError)になる

  • 原因:環境変数やモジュール検索パス(sys.path)の不一致
    • 手動でログインしたSSH環境と、CGI/Cronが実行される環境では作業ディレクトリ(カレントディレクトリ)や読み込まれる環境変数が異なります。
  • 対処法: スクリプトの冒頭で明示的にディレクトリパスを sys.path に追加してください。Pythonimport sys import os # スクリプトが存在するディレクトリの絶対パスを取得して追加 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, BASE_DIR)

Q3. Cron(定期実行)を設定したのに全く実行されない

  • 原因①:相対パスでファイル指定している
    • Cron実行時はホームディレクトリ等がカレントディレクトリになるため、相対パスで記述されたファイル読み書きやスクリプト指定が失敗します。
  • 原因②:CGI/Python実行コマンドに絶対パスを使っていない
  • 対処法: Cron登録コマンドには、「Python実行ファイル」と「実行するスクリプト」の双方に絶対パスを指定します。Bash# 正しいCronコマンドの設定例 /home/アカウントID/public_html/ドメイン名/venv/bin/python3 /home/アカウントID/public_html/ドメイン名/cron_script.py > /dev/null 2>&1

Q4. データベース(MySQL/MariaDB)に接続できない

  • 原因①:ホスト名に localhost を指定している
    • お名前.comの共用サーバーでは、Webサーバーとデータベースサーバーが別筐体で動いていることが多く、localhost では接続できません。
  • 原因②:mysqlclient ライブラリのビルド失敗
    • root権限がないため、C言語ビルドが必要な mysqlclient のインストールが失敗することがあります。
  • 対処法:
    1. コントロールパネルのデータベース設定画面に記載されている「DBサーバーホスト名(例: mysql123.g.gslb.onamae.un-dc.jp)」を指定します。
    2. Pythonライブラリには純Python実装の PyMySQL を使用します。Pythonimport pymysql pymysql.install_as_MySQLdb() # SQLAlchemy等を使う場合の互換処理

📋 本番公開前・エラー時チェックリスト

障害が発生した際は、以下のリストを上から順番に確認・修正してください。

チェック項目設定・確認内容判定
改行コードindex.cgi および .htaccess の改行コードが LF になっているか[ ]
パーミッションindex.cgi の属性が 755(rwxr-xr-x)になっているか[ ]
パーミッション.htaccess の属性が 644(rw-r--r--)になっているか[ ]
シバング1行目(#!/home/...)に venv の絶対パスが正しく記述されているか[ ]
パス設定スクリプト内で sys.path.insert(0, os.path.dirname(__file__)) を実行しているか[ ]
エラーログコントロールパネルの「エラーログ(error_log)」でスタックトレースを確認したか[ ]

コメント

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