カテゴリー
IT programming

エックスサーバーでpythonでcgiを作る際に500エラーになったら原因は改行コード

ずっと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エラー

500エラー

  • 断続的に発生する場合:
    CGIの負荷が大きい(CGIプロセスが多数動作している)。
  • 常に発生する場合:
    CGIのパーミッション設定に誤りがある。 / CGIのソースコードに問題がある。/ .htaccess の記述に誤りがある。

困りました。

「CGIの負荷が大きい」というのに引っかかった可能性はゼロではないでしょうが、Hello worldと表示するだけなので、極めてゼロに近いでしょう。

あとはパーミッションは設定したし、.htaccessも設定した。あとは「ソースコードに問題がある」ってことなんですが、上記のソースコードはどっからかコピーしたものですし間違っているとは思えない。。。一体何が原因なのか。

解決方法

一時間ぐらいかけて色々検証した結果、ソースコードの改行コードがCRLFではだめなことに気づきました。

これです(エディタはVisual studio code)。

 

これを、「CRLF」というところをクリックして、「LF」を選択すると下記のようになります。

 

ということで「LF」に変えて保存し直して、再度アクセス。

成功!

作成者: とーじろー

普通に生まれ、普通に小中高大と生活し、普通に就職をし、普通に仕事をしている普通の人。
いままでインターネットにお世話になってきたので、その恩返しの意味も込めて、「10000人の人がいたら9999人は興味がないけど、残りひとりにとって有益ならば、その情報を届けたい」と思い、ブログを開設。

コメントを残す

メールアドレスが公開されることはありません。