Debian Linux にapacheとPythonでCGIなWEBサイトを作る手順

CGIとはCommon Gateway Interfaceの略で、Webサーバー上で受け取ったデータを処理し、結果を表示させる機能のことです。 この記事ではDebian Linux上でApache WEBサーバーを動作させPythonのプログラムに受け取らせる方法を紹介します。

Pythonを使うメリット

CGIといえば私がサーバーをいじり始めたときはPerlでデータを受けるのが普通でした。多分今はPHPが主流だと思います。

一方Pythonは機械学習や深層学習のプログラムで使われるため、近年急速にシェアを伸ばしています。Pythonの長所は多くのライブラリを使ってプログラムをより簡単に作れることで、このブログでも過去にPythonを勉強する方法を紹介しています。

Pythonのライブラリの中にcgiという機能があります。このライブラリを使うとWEBサーバーが受けたリクエストを簡単にPythonのプログラムに取り込むことができます。

CGIにPerlやPHPを使わずPythonを使うことはメリットがあります。人気のあるLinuxディストリビューションはアプリの管理にパッケージマネージャを使っていますが、このパッケージマネージャはPythonが必要なので、ほとんどのLinuxはデフォルトでPythonがインストールされています。

せっかくならすでにインストールされたアプリケーションを使った方がストレージの節約にもなりますし、インストールの際のトラブルからも開放されます。

試しに使って見たところ、この方法はPerlよりもシンプルに書けるようなのでもう少し流行ってもいいかもしれません。この記事ではこのようにPythonでCGIを実行する方法を説明します。

apacheのインストール

apacheはWEBサーバーです。普通はapacheはデフォルトでインストールされていないのでapt-get(aptでもよし)でインストールします。apacheのインストールは他のブログでもたくさん説明されているので詳細がわからない場合はググってください。

# apt-get install apache2

Pythonの拡張子の.pyでもCGIが動くように/etc/apache2/conf-enabled/serve-cgi-bin.confの<Directory “/usr/lib/cgi-bin”>の次の行に”AddHandler cgi-script .cgi .py”を追加します。

             <Directory "/usr/lib/cgi-bin">
                     AddHandler cgi-script .cgi .py
                     AllowOverride None
                     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                     Require all granted
             </Directory>

apacheでCGIが動くように次のコマンドでCGIDを有効化します。

# a2enmod cgid

設定を反映するためにapacheを再起動します。

# services apache2 restart

ここまでの設定でapacheのCGIが動くようになります。

Pythonファイルの書き方

Pythonのプログラムが書いてあるファイル(例えばtest.pyとする)は次のような書き出しにします。

#!/usr/bin/python3
import cgi

一行目の#!/usr/bin/python3はそのファイルを実行するコマンドを指定します。パスがよくわからない場合はwhichコマンドで確認できます。次の行にPythonのライブラリをインポートするimport cgiを書きます。

続けてPOSTメソッドのデータを取得するためのコードを書きます。POSTメソッドによってアドレスに付加されたデータはcgi.FieldStorage()で取得することができます。

recieve_data = cgi.FieldStorage()
print(recieve_data["a"].value)

このtest.pyファイルを/usr/lib/cgi-bin/に保存してパーミッションを755にします。例えばhttp://testsite.jp/testpy?a=1のアドレスにアクセスすると「1」がプリントされます。

このサンプルコードではPOSTの入力を単純にプリントしましたが、この部分を計算したり、データベースに入出力したり、いろいろなことに書き換えることができます。

test.pyは全体で次のようになります。

#!/usr/bin/python3
import cgi

recieve_data = cgi.FieldStorage()
print(recieve_data["a"].value)

まとめ

今回はDebian LinuxでPerl CGIの代わりにPythonでCGIを動かす方法を紹介しました。PythonでWEBサイトを書いているうちにもしかするとPerlよりもいいんじゃないかと思ってきます。(PHPと比較するとメリットデメリットがあるが。)

もしかすると私の知らないPerl CGIにしかできないメリットがあるのかもしれませんが、今のところPythonの方が書きやすい印象があり、今後Python CGIが流行るかもしれません。