エックスサーバーでPythonを動かす方法と500エラーになる場合の対処

2020-01-24Python, Python WEB開発, エックスサーバー

エックスサーバー

エックスサーバーで最低限のテスト用Pythonファイルを動かすのに必要だった事のまとめメモです。

テスト用に設置したPythonファイル「hello-world.py」
https://1-notes.com/python/sample/hello-world.py

実行ファイルの置き場所

エックスサーバーではcgiファイルが実行できるcgi-binなどのディレクトリ制限はなく、public_html以下なら動く。

.htaccess編集

.py拡張子のファイルをCGIファイルとして使う為に、.htaccessを編集します。

実行ファイルと同じ階層か上の階層である必要はあります。

AddHandler cgi-script .py

テスト用ファイルの作成

Pythonテスト用に以下の実行ファイルをファイル名「hello-world.py」として作成しました。

Python2

#!/usr/bin/python
# -- coding: utf-8 --
print "Content-Type: text/html;charset=UTF-8;\n\n"
print "Hello world"

Python2

#!/usr/bin/python3
# -- coding: utf-8 --
import io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print ("Content-Type: text/html; charset=UTF-8;\n\n")
print ('Hello world')

文字コードはUTF-8、改行コードはLF。

※このコードをコピペする場合は改行コードをLFに変更して下さい。

実行ファイルのパーミッション設定

実行する.pyファイルのパーミッション設定を705か755にする。

実行ファイルのあるディレクトリのパーミッションが777になっていない事を確認する。

500エラーになる場合の対処

※訂正:当方の環境下で500エラーになってしまうのはエディタのパッケージからSFTP接続で変更しても、再接続するまで何かが書き換わっていない事があるのが原因でした。
となると、ほとんどの人はこの問題で困る事はないのかもしれません。

基本的に正常なPythonファイルをアップロードしてパーミッションを705にしても、当方の環境だとキャッシュの関係か1~2分の間、長い時はもうしばらく500エラーとなったりしています。

初めて遭遇した時、触っているとなかなか500エラーから開放されなかったので、もし同じ状況になったら少し待つのが良いかもです。

解決しなければ、サーバーコントロールパネルから該当ドメインのエラーログを取得して確認します。

「End of script output before headers」とある場合は、パス・パーミッション・文字コード・改行コードが違う可能性が高い。

rubyやperlなどの簡単なCGIファイルをテストして動くかどうか確認する、など。

コピペの際の改行コードのチェック

コピペで貼り付けたコードの改行コードがLF以外だと、500エラーとなります。

コピペ元のソースコードはLFで書かれていても、ブラウザの表示でコピー、貼り付けた時はCRLFになってしまうケースが多く、そのまま貼り付けて実行しようとしても500エラーが発生してしまいます。

500エラーの原因が改行コードだった場合は、コードエディタの機能で改行コードをLFに変換すると解消されます。