Your 3D

Pythonで書いたCGIをサーバー上で動かす【500エラーの対処法】

Pythonで書いたCGIファイルをレンタルサーバー上で動かすための方法を解説します。

私がレンタルサーバー上でWebアプリを作成する際の備忘録です。誰かのお役に立てれば幸いです。

 

スポンサーリンク

CGIとは?

CGIとは、Common Gateway Interfaceの頭文字をとった略称で、クライアント側の要求(リクエスト)に応じて、Webサーバー上にあるプログラムを動かすためのプログラムです。

CGIファイルはPerl(パール)というプログラミングで書かれていますが、コードの先頭に使用言語を指定することでPythonやPHPで動かすことが可能です。

 

WebページはhtmlやPHPを用いて書かれた静的ページ(すべてのユーザーに同じ内容を表示する)が主流です。

しかし、最近ではJavaScriptを用いた、動的ページ(ユーザーごとに表示する内容を変える)も利用されています。

例えばTwitterのホーム画面を想像してもらうと、スクロールするたびに新しいコンテンツが表示されることを確認できるかと思います。

CGIを利用することで、動的ページの作成が行えます。

 

 

スポンサーリンク

CGIがサーバー上で動かす

この記事では、Pythonで書かれたCGIファイルをサーバー上で動かすことを目標とします。私はXサーバーというレンタルサーバーを利用しています。

CGIファイルをPythonを用いて作成してレンタルサーバー上に置くことで、CGIファイルを動かしてみました。

 

作成したCGIファイル

今回作成したCGIファイルはこちら。まずはこちらのコードをコピペしてindex.cgiファイルを作成してサーバー上へ配置してみてください。

 

ファイル名は「index.cgi」としており、CGIファイルを置いたドメインへアクセスすると自動で表示されるようになっています。

Pythonのモジュールは何も使わず、”hello world”の文字列だけがWebページに表示されます。

 

Pythonで書いたCGIコード解説

コードを各行について解説します。

#!の後にサーバー上の使用したいプログラム言語のコマンドパスを記載します。

Xサーバーの場合、/usr/bin/python3.6を指定するとPython3.6でCGIファイルを実行できます。

プログラム言語はレンタルサーバー上に既存のものを使用できるため、自分で用意する必要はありません。

しかし、SSHを利用することでサーバー上に仮想環境を構築することも可能です。

例えばXサーバーではPython2.7・3.4・3.6の3つしかありませんが、SSHを使うことでPython3.7系も使えるようになります。

以下に主要レンタルサーバーのコマンドパスを載せておきます。

 

 

テキストをエンコードする文字コードを指定しています。上のコードは「utf-8」を指定しています。

 

print(” ”)の” ”の中身をテキスト表示するためのコードです。このコードを書くことで、Webページ上にテキストを表示することができます。

逆に書かないと、Webページに何も表示されません。おまじないとして覚えておくべきでしょう。

 

Pythonのprint文です。上のprint(“Content-type: text/html\n”)のコードを先に書くことで、Pythonのprint文がページ上にテキスト表示されます。

 

これは文字コードの変換のために必要だった気がします。

日本語コメント文がないと文字コードの変換が行えない場合があるそうで、とりあえずかいておけば問題ないです。

 

 

スポンサーリンク

CGIが動かないときの確認項目

以上のPythonで書いたコードが動けば終了です!ここから開発をがんばりましょう!となればいいのですが、私の場合簡単にCGIファイルを動かせなかったです。

CGIが動かないときの確認項目をまとめましたので、CGIが動かなくて困っている方は参考にしてみてください。

 

・CGIファイルのパーミッション設定(属性の設定)

サーバー上にアップロードしたファイルは、パーミッションの設定が行えます。パーミッションは許諾、つまりファイルに対するアクセス権限の設定です。

サーバーにアップロードしたCGIファイルを右クリックして、属性の設定をクリック。パーミッションは「755」を設定します。

FFFTPサーバーを利用した場合は以下の通り。

 

・文字コードをUTF-8N(ボム無し)に設定

CGIファイルの文字コードはUTF-8N(ボム無し)が推奨です。

紛らわしい注意点としてUTF-8(ボム有り)とUTF-8N(ボム無し)は別物です。

Terapad等テキストエディタで文字コードを保存したとき、BOM(Byte Order Mark)という余計な文字列が追加されてしまう場合があります。

 

文字コードはUTF-8N(ボム無し)を設定してください。

Terapad利用者は注意です。

 

・.htaccessの設定

.htaccessというファイルが悪さしている場合、500 Internal Server ErrorとWebページに表示されます。.htaccessは本来リダイレクトやアクセスの認証の設定を書くところですが、これが原因となってしまうことがあります。

特に、サブドメインでCGIを動かそうとしている場合、サブドメインのもととなるドメイン上に置かれた.htaccessの影響も受けるため注意してください。

参考までに、.htaccessのコードです。

 

私の場合、サブドメイン上の.htaccessを削除することで解決しました。(同一の.htaccessがドメイン上・サブドメイン上に重複してるとまずかった?)

 

以上、参考になれば幸いです。