ずっと500エラーが出続けて、解決するのに時間がかかってしまったため備忘録として残しておきます。誰かのためになったら。。。
やりたかったこと
エックスサーバーで、pythonをcgiとして動かしたかったです。hello.pyというファイルに、ブラウザからアクセスして、’Hello world’と表示するだけ。
方法
いろいろなページを拝見した結果、下記のことをすればエックスサーバー上でpythonがcgiとして動くことがわかりました。
- pythonファイルが置かれているディレクトリに.htaccessを置き、下記を書く(.pyという拡張子はcgiですよという宣言)。
AddHandler cgi-script .py
- SSHかFTPソフトかなにかで、pythonファイルの権限を705にする(755でもいいみたい)。SSHなら $ chmod 705 hello.py 的な。
pythonのコード
ページにHello worldと表示するpythonコード(hello.py / python3用)です。
#!/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')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=’utf-8′)
というのは、文字化け防止のおまじないのようです。
謎の500エラー
- 断続的に発生する場合:
CGIの負荷が大きい(CGIプロセスが多数動作している)。- 常に発生する場合:
CGIのパーミッション設定に誤りがある。 / CGIのソースコードに問題がある。/ .htaccess の記述に誤りがある。
困りました。
「CGIの負荷が大きい」というのに引っかかった可能性はゼロではないでしょうが、Hello worldと表示するだけなので、極めてゼロに近いでしょう。
あとはパーミッションは設定したし、.htaccessも設定した。あとは「ソースコードに問題がある」ってことなんですが、上記のソースコードはどっからかコピーしたものですし間違っているとは思えない。。。一体何が原因なのか。
解決方法
一時間ぐらいかけて色々検証した結果、ソースコードの改行コードがCRLFではだめなことに気づきました。
これです(エディタはVisual studio code)。
これを、「CRLF」というところをクリックして、「LF」を選択すると下記のようになります。
ということで「LF」に変えて保存し直して、再度アクセス。
成功!