PythonワンライナーでWebサーバを構築しCGIプログラムを動かしてみる

スポンサーリンク

Apache等を使わずにPythonがインストールされていれば、一行のコマンドでローカル環境でWebサーバを作成できます。このPythonのWebサーバはCGIも動作させることもできるので、簡単なCGIプログラムを動かす方法として、ApacheのWebサーバを設定するのが面倒という方にもおすすめです。

スポンサーリンク

CGIとは

CGI(Common Gateway Interface)とは、プラットフォームに依存しない方法で、Webサーバ(HTTPサーバ)の下で、外部プログラムを実行させるための仕組みになります。

サーバがアプリケーションのゲートウェイとして振る舞います。サーバはブラウザ(クライアント)からの要求(リクエスト)を、CGIプログラムが受け取る情報(CGI要求)に変換します。その後、CGIプログラムはその情報を受け取った後に実行されます。そして、CGIプログラムからの出力(CGI応答)をサーバがクライアントのための応答(レスポンス)に変換します。

CGIの動作の流れ

cgi-protocol

 

 

 

実行環境

OS:Ubuntu 16.04

pythonバージョン:python 2.7.12

 

 

 

PythonでワンライナーWebサーバ

Pythonで簡易的なWebサーバを構築するのはとても簡単です。Python2ならば標準にあるCGIHTTPServerというモジュールを利用することで、CGIが動くWebサーバを起動できます。

起動するコマンドはたった一行です。

-mオプションでモジュールを指定して、コマンドライン引数ではポート番号を指定します。
ポート番号を省略するとデフォルトとして8000番ポートで起動します。

 

Python3の場合は、SimpleHTTPServerやCGIHTTPServerは、http.serverモジュールに統合されました。そのため、http.serverを用いて、実行します。cgiを使用する場合は--cgiオプションを使用します。

 

このワンライナーのコマンドだけでローカル環境で動くWebサーバを起動できます。このWebサーバはCtrl+cで終了することができます。

このローカル環境のWebサーバはコマンドを起動したカレントディレクトリをドキュメントルートとして、ページにアクセスすることができます。例えば、ページにアクセスするために以下のhtmlファイルを作成します。

test.html

 

カレントディレクトリからディレクトリ構造が以下の状態にして、コマンドを実行します。

 

Webサーバを起動させている状態でブラウザにアクセスします。アドレスは'localhost:3000/test.html'になります。すると'Hello World'と書かれたページにアクセスできます。

アクセス結果

access-test-html-page

 

 

 

CGIプログラムを動かしてみる

上のワンライナーのコマンドで起動したWebサーバでCGIプログラムを動かすには、決められたディレクトリの中にCGIプログラムを入れる必要があります。CGIHTTPServerでCGIプログラムを実行できるディレクトリは'cgi-bin'と'htbin'のディレクトリになります。

それでは、起動したWebサーバでCGIプログラムを実行します。ここで、起動するプログラムはBashで書かれたプログラムを使用します。

test.cgi

 

このtest.shのパーミッションを755に設定します。

 

カレントディレクトリからのディレクトリ構造を以下のようにして、Webサーバを起動します。

 

アドレス'localhost:3000/cgi-bin/test.cgi'にブラウザでアクセスしてみると以下のように表示されます。

アクセス結果

access-test-cgi-page

 

 

 

CGIの環境変数を確認してみる

クライアント要求をCGI要求に変換したとき渡される情報として、RFC3875に規定されているいくつかの環境変数があります。この環境変数を確認してみたいと思います。

表示する環境変数を絞るために、Webサーバを起動させるときにenvコマンドの-iオプションを通して、実行します。そうすると、現在の環境変数を一度すべて削除した状態でプログラムを実行することができます。

 

env - 環境変数を一時的に修正してコマンドを実行する
envコマンドは、別のコマンドを引数に取ります。その別のコマンドに対して、envコマンドで一時的に修正した環境変数を用いてコマンドを実行します。 envコマンドでコマンドを引数に取らない場合は環境変数を表示することができます。また、envコ...

 

この環境変数を削除した状態で、どのような環境変数があるかを確認するCGIプログラムを作成します。htmlではなく、単純なテキストとして出力するため、Content-Typeをtext/plainにします。

cgi-env.cgi

 

このCGIプログラムのパーミッションを変更します。

 

カレントディレクトリからのディレクトリ構造を以下のようにして、コマンドを実行します。

 

'localhost:3000/cgi-bin/cgi-env.cgi'にアクセスすると以下のようなページが表示されます。

アクセス結果

access-cgi-env

 

私の環境での、cgi-env.cgiにアクセスした内容は以下のようになりました。

 

CGIの環境変数について、少し見てみたいと思います。

REQUEST_METHODの情報はクライアントからの要求がGETメソッドで送られたかPOSTメソッドで送られたか等の情報を見ることができます。この環境変数を元にGETかPOSTか等の条件分岐でCGIプログラムの動作を変更することができます。

QUERY_STRINGの情報は'http://localhost:3000/cgi-bin/cgi-env.cgi?var1=aaa&var2=bbb'のようにアクセスしたときに、'?'以降の文字列がQUERY_STRINGに以下のように情報が入ります。

このQUERY_STRINGの情報はGETメソッドで情報の渡すときに利用できます。

他の環境変数についてはRFC3875の4.1.節を確認してみるとよいでしょう。

 

 

 

まとめ

pythonの短いコマンドでWebサーバを簡単に起動できます。簡単なCGIプログラムを動かしてみたいなら、十分利用できます。例えば、CGIプログラムの簡単な学習などに利用できると思います。

Apacheがなくても、Pythonがインストールされているならば、CGIが動かせるWebサーバを起動でき、CGIプログラムも簡単に実行できるので、興味があれば試してみてください。

 

 

 

参考

python2のWebサーバで使用するモジュールについては、SimpleHTTPServerCGIHTTPServerのドキュメントが参考になります。

Python3のWebサーバで使用するモジュールについてはhttp.serverのドキュメントが参考になります。

CGIの仕様のRFCはRFC3875になります。