ConohaWingでPythonを表示すると500エラー!原因と解決策

ConohaWingでPythonを使うことができます。

cgiファイルでも動きますし、「.htaccess」で設定すれば、pyファイルでも動きます。今回は「.htaccess」で設定済みとして「pyファイル」をアップしています。(※cgiファイルで動かすのと大差ありません

早速「pyファイル」をアップしてみたのですが、500エラーになってしまいました…。

引用:Chrome

最終的には、正常に表示できましたが、まあまあハマってしったので、今後のために把握できた原因と解決策をまとめておきます。

スポンサーリンク

作成ファイルについて

作成するファイルは、できれば新規作成が良いかなと思います。

細かい設定

引用:サクラエディタ

上記のとおり、ファイルは下記設定で保存します。

  • 文字コードセット・・・UTF-8
  • BOM・・・なし
  • 改行コード・・・LF(UNIX)
新規で作成することで…

僕は適当なファイルを複製して、ATOMで編集した結果、数時間500エラーにハマってしまいました…。どうにもならず、ファイル作成からやり直すと上手くいきました。もしかすると、見えないとこに変な設定が残ったりしているのかな?と思いました。

同じようにハマってしまった場合は、是非ファイル作成からやり直してみてくださいね^^

パーミッション

まずは、パーミッションです。

原因

何も手を加えなければ「644」でアップロードされています。

引用:FileZilla

パーミッションの数値は何を許可するかによって変わるのですが、「644」は上記のチェック有りが許可されている状態です。

この初期の状態ではPythonを動きません

解決策

引用:FileZilla

パーミッションは上記のように「755」にする必要があります。

直接「755」と数値を入力しても構いませんし、各「実行」にチェックを入れても大丈夫です。字のとおり、Pythonを実行させるために必要なわけですね。

プログラムをPythonで実行させる

上記パーミッションをクリアしてもファイルの中身が空であれば、引き続き500エラーになります。

原因

pyファイルの中身が何のプログラムで実行したら良いか不明なため、エラーとなります。

解決策

そこで、pyファイルの中身は「Python3.6で実行する」ということを設定します。設定は簡単でpyファイルの1行目に下記を書き加えるだけです。
※2022/4/7 時点、ConohaWingでPython3系を使う場合

#!/opt/alt/python36/bin/python3.6

▼Pythonのパスはこちらに書いています
https://support.conoha.jp/wing/faq/website-q/website-setting-q/?show=1141&btn_id=search

プログラムをPythonで実行させる

上記「パーミッション」をクリアしてもファイルの中身が空であれば、500エラーのままです。

原因

「pyファイル」の中身が何のプログラムで実行したら良いか不明なため、エラーとなっています。

解決策

そこで、「pyファイル」の中身は「Python3.6で実行する」ということを設定します。設定は簡単で「pyファイル」の1行目に下記コードを書き加えるだけです。
※2022/4/7 時点、ConohaWingでPython3系を使う場合

#!/opt/alt/python36/bin/python3.6

▼Pythonのパスはこちらに書いています
https://support.conoha.jp/wing/faq/website-q/website-setting-q/?show=1141&btn_id=search

表現ヘッダーを設定する

実は、上記2つをクリアしてもまだエラーのままでした。

原因

最後に、表現ヘッダー「Content-Type」を設定する必要があります。サーバとクライアントでやり取りする情報という感じです。

この表現ヘッダーは「無いと正常に動作しない」というものみたいです。

解決策

そこで、「pyファイル」内で画面出力の処理の最初に下記を書きます。お決まりだと思ってOKです。

print('Content-Type: text/html\n')
注意点

設定内容は「Content-Type: text/html」なのですが、赤字にしたとおり、末尾に改行コードを書く必要があります。
そうしないと、正常に表現ヘッダーと認識できないようです。忘れずに書きます。ハマるポイントなので注意ですね。

まとめ1

以上で、英語の出力のみであれば正常に表示できるようになります。

一度コードをまとめておきます。

#!/opt/alt/python36/bin/python3.6
print('Content-Type: text/html\n')

何も表示はされませんが、500エラーは改善されています。

確認

一応正常に表示されたか確認するために、最後に1行追加して「test」という文字を表示してみます。

#!/opt/alt/python36/bin/python3.6
print('Content-Type: text/html\n')
print('test')
引用:Chrome

正常に「test」と表示されました!

日本語も正常に表示させるには?

ここまでの対応で英語であれば表示可能になりました。ですが、日本語は表示されません

#!/opt/alt/python36/bin/python3.6
print('Content-Type: text/html\n')
print('test')
print('てすと')

試しに末尾に日本語出力を追記して確認してみても、「test」しか表示されません。

原因

画面上にエラーは出ませんが、SSH接続でコマンドで直接このファイルを動作させてみると、エラーが表示されました。

$ python t16.py
Content-Type: text/html

test
Traceback (most recent call last):
File "t16.py", line 4, in <module>
print('\u3066\u3059\u3068')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

エンコードエラーですね。「てすと」が全角のため発生しているエラーだと思います。(※日本語は基本的に全角です

解決策

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

上記コードを「print」の前に追記すればOKです。

「io」のTextIOWrapperによって、「sys.stdout(※標準出力)」をutf-8に設定しています。

どの言語でも出力は基本utf-8が多いですよね。

まとめ2

utf-8の設定によって、先ほど表示されていなかった日本語も出力できるようになりました。

引用:Chrome

これでようやく、サーバ上でPythonを試すことが出来そうです。

Pythonで処理した結果をHTMLでうまく表現できるといいな。

それでは、最後までお読みいただきありがとうございました!

スポンサーリンク