ロリポップでPythonのCGIスクリプトが動かない場合の対処法

レンタルサーバーのロリポップで、 PythonのCGIスクリプトが動かない場合の 対応方法をいくつか紹介します。

「500 Internal Server Error」が出る場合

Internalは「内部の」という意味なので、 CGIスクリプト側に何らかの問題がある可能性が高いです。
この場合は次の4点を確認してください。

  • スクリプトのパスが間違っていないかどうか
  • 実行権限の付与を忘れていないかどうか
  • importするファイル名にハイフン(-)を使っていないか
  • CGIとして動作するための最低限のコードをかいているかどうか

順番に説明していきます。

スクリプトのパス

パスはロリポップの次のページで確認してください。
CGI・SSI・PHP・SENDMAILについて - ロリポップ!レンタルサーバー

2024年の時点でPythonのバージョンは3.4、又は3.7が使えます。 サーバーによって異なる場合もあるので上記のサイトで必ず確認してください。

# 3.4の場合
#!/usr/local/bin/python3.4

# 3.7の場合
#!/usr/local/bin/python3.7

実行権限の付与

CGIスクリプトファイルに実行権限が無い場合はエラーになります。 一番手っ取り早いのは「FFFTP」などのGUIベースのFTPクライアントソフトを使うことです。

importするファイル名にハイフン(-)を使っていないか

CGIスクリプトファイルからインポートする独自ファイルがある場合、 ファイル名にハイフン(-)を使っていませんか?

Pythonではファイル名にハイフンを使うことは推奨されていません。 ロリポップでもエラーがでます。

例えば「sample-file.py」という独自ファイルを作成して、

import sample-file

と書いた場合はエラーになります。

ファイル名を「sample_file.py」のように、 アンダースコア(_)にするか、ハイフンをなくしてください。

ファイル名を「sample_file.py」として(アンダースコアに変更)

import sample_file

の場合は正常に動作します。

CGIとして動作するための最低限のコード

例えば動作確認用テストとして、次のようなコードを書いて実行しても動作しません。

#!/usr/local/bin/python3.7

print("Hello");

上記コードでは「500 Internal Server Error」となります。

「PHP」の経験がある人は「これで動くのでは?」と思いがちですが、 CGIとして動作するための最低限のコードが必要です(Content-Typeの指定等)。
以下のページを参考にして、コードを記述してから実行してみてください。

CGIスクリプトの基本(文字化け対策版)

「502 Bad Gateway Error」が出る場合

502は通信状態に異常があることを示すエラーです。 502が出る場合は、少し待ってから再度CGIを実行してみてください。

私の場合は502エラーが出てから5分後に再度実行してみると、 正常に実行できました。

補足:開発時はアクセラレーターをOFFにする

ロリポップサーバーには、アクセラレーター機能(キャッシュ機能)があります。

Web開発時はPythonのファイルだけでなく、HTMLやCSSのファイルを変更することも多くあります。 その際にサーバーのアクセラレーター機能がONになっていると、 HTMLやCSSの変更がすぐに反映されずにイラっとします。

開発時にはアクセラレーターをOFFにして、 安定して運用できるようになったらONにすることをおすすめします。
ドメインやサブドメイン設定時にON/OFFを指定できますし、 後から設定することも可能です。

Python