想定環境
- Ubuntu Server 18.04LTS
- Python3
cgi-binディレクトリの作成
ホームディレクトリ直下にcgi-bin
ディレクトリを作成する。
user@hostname:~$ mkdir cgi-bin
user@hostname:~$ cd cgi-bin
CGIスクリプトの作成
user@hostname:~/cgi-bin$ which python3
/usr/bin/python3
user@hostname:~/cgi-bin$ vi hello.py
which
コマンドでPython3のパスを確認しておく。
hello.py
#!/usr/bin/python3
print('Content-Type: text/html; charset=utf-8')
print()
print('<h1>Hello, World!</h1>')
コードの解説
- 1行目にShebang(シバン)と呼ばれるコメントを書く必要がある。
Shebangはコンパイラの場所を示すもので、これがないとPythonのコードをPythonとして認識することができず予期せぬ挙動を招くことになる。 - 3行目の
print('Content-Type: text/html; charset=utf-8')
がHTTPヘッダーとして機能し、コード内で出力した文字列をHTMLのBODY
タグ内に埋め込むことができる。charset
の指定はファイルの文字コードを明示的に宣言したものである。 - 4行目のprintの空文は3行目のHTTPヘッダーを正常に機能させるために2つ分の改行が必要なため使用している。
空文を使用したくない場合はHTTPヘッダーの記述をprint('Content-Type: text/html; charset=utf-8\n\n')
とすることでも同様の挙動をする。
CGIの実行
CGIを実行するための手順を説明する。
- cgi-binディレクトリと実行ファイルに実行権限を付与する。
- pythonのテストサーバを起動する
- ブラウザでアクセスして確認する
上記の3つの手順でローカル開発が可能となる。
公開したい場合はApache2を使用すれば公開することができる。(詳細はこちらの記事へ)
コマンド
user@hostname:~$ ls
cgi-bin
user@hostname:~$ sudo chmod -R +x cgi-bin
python3 -m http.server 8080 --cgi
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
注意点としてcgi-binディレクトリの直上でサーバを立ち上げる必要がある。
これでlocalhost上に公開された状態になったのでhttp://localhost:8080/cgi-bin/hello.pyにアクセスして表示されれば成功。
エラー
404 Not Found
- ファイルが見つからないと言われているのでパスが間違っている可能性がある。
- サーバを立ち上げ忘れていないか確認する。
- URLやファイル名に間違いがないか確認する。
403 Forbidden
- アクセス権限がないため弾かれている。
- ターミナルに戻って
ls -l
コマンドで権限を確認してx
がついているか確認する。 -
http://localhost:8080/cgi-bin
にアクセスしている場合はファイルまでの直リンクでアクセスする。
500 Internal Server Error
- サーバ系のエラーで幅広いエラーで表示されるため原因の特定が難しい。
- サーバを立ち上げたターミナルを表示すると
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
の下にアクセスログが表示されているのでエラー内容を確認して対処する。- エラーログを確認するときは下から上に向かって読んでいくと理解しやすく、効率的に解消できる。
画面が真っ白になる・ソースコードがそのまま表示される
- 共通
- HTTPヘッダーの記述を間違えている可能性が高い。
- 改行の数は適正か、セミコロンを忘れたり打ち間違えたりしていないかなどを確認する。
- もしくはShebangのパスや文法を間違えていないか確認する。
- ソースコードがそのまま表示される
- サーバの立ち上げで
--cgi
を忘れていないか確認する。
- サーバの立ち上げで