apache2でpythonによるcgiを動かすまでのメモまとめ


概要

pythonファイルをcgiとして動かしたかったので
そのためにやったことをメモ程度にまとめておく

前提条件

・自分で作成した適当なhtmlの公開まではできている状態
・cgi用のpythonファイルは作成済み

環境

・OS:Ubuntu
・VERSION:16.04.5 LTS (Xenial Xerus)
・apache2 ver:Apache/2.4.18 (Ubuntu)

やったこと

cgiを置くdirectoryの作成

cgiについてしらべると、
・apacheのcgiのdirectoryは何もしなければ/var/www/cgi-bin/になる
・htmlのdir配下には作らないほうがよい
ということがわかった。
自分は/home/username/配下にhtmlのdirectoryをおいていたので
/home/username/配下にcgi用のdirectoryを作成し、その中にpythonファイルをおいた。

Apache2のmoduleファイル適用

次にapache2のcgiを動作させるために下記コマンドを投入

/etc/apache2/mods-enable配下
a2enmod cgi

このコマンドにより、mods-enable配下にcgid.confファイルと、cgid.loadファイルが入った。

configファイルの作成

通常apache2のcgiはpythonファイル(.py)を見ないので、.pyをcgiとして認識させるためにconfigファイルを作成する。
ファイルの中身は下記のとおりである。

.confファイル
ScriptAlias /cgi-bin/ "cgiをおいたdirectoryのフルパス"    
<Directory "cgiをおいたdirectoryのフルパス">
    Options +ExecCGI
    AddHandler cgi-script .cgi .py
    AllowOverride None
    Require all granted
</Directory>

.confファイル説明

ScriptAlias /cgi-bin/ "cgiをおいたdirectoryのフルパス" 

この行は/cgi-bin/というdir指定に対して、後ろのpathとして扱うためのもの。

<Directory "cgiをおいたdirectoryのフルパス">

この行は特に説明はないが、ここに書くpathは上の行のpathと微妙に違う。
上の行のは最後に"/"をつけてあげなければならない。
対してこちらはいらない。

    Options +ExecCGI
    AddHandler cgi-script .cgi .py
    AllowOverride None

Optionsの+ExecCGIは<Directory path>で指定したdirectoryに対してCGI実行の許可を出す。
AddHandlerは拡張子を指定することで、その拡張子のついたファイルの実行結果をcgiとして返すようにする。
AllowOverrideに関しては割愛

    Require all granted

この文はもともとOrderとallowで書かれていたアクセス制限の文がApache2.2から2.4になってこう書くようになったものらしい。
正直apache触りだしたのここ最近で、そもそも2.2を触ってなかったから知らなかった・・・
Requireを知っていれば検索しようがあったが、知らなかったので2.2の記事等を見てOrderとAllowを素直に書いていたらParmission denyが出たことでたどり着くことができた。

適用されている.confファイルの除外

これに関しては必要かわからないが影響がないと思われるためやったに過ぎない。
除外するファイルはserve-cgi-bin.confで、conf-enabled配下をいじっていなければ適用されているはず。
中身は下記になる

serve-cgi-bin.conf
<IfModule mod_alias.c>
    <IfModule mod_cgi.c>
        Define ENABLE_USR_LIB_CGI_BIN
    </IfModule>

    <IfModule mod_cgid.c>
        Define ENABLE_USR_LIB_CGI_BIN
    </IfModule>

    <IfDefine ENABLE_USR_LIB_CGI_BIN>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Require all granted
        </Directory>
    </IfDefine>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

このファイルがあるために起こりうる影響は
ScriptAliasがあり、/cgi-bin/に対してエイリアスを張っているためconfigtestを行った時に
エイリアスの対象がかぶっているという警告が出るくらいである。
実働には影響はないと思われる。

apache2 再起動

下記コマンドで行った

/etc/init.d/apache2 restart

確認

http://localhost/cgi-bin/pythonファイル名 で確認

まとめ

こんな感じで手順は少ないが、apache2でpythonで作ったcgiを動かすことに成功した。
実はちょいちょい関係ないことでcgiがうまく動かなかったりしたので、手順の数よりもかなり苦労している。
もうちょっとサーバーというものへの理解を勉強して深めていきたい。