どちらかというと、自分メモ。
CGIというのは、環境変数からパラメータを受け取り、
標準出力へ HTTPヘッダ群とコンテンツを出力する、というのが基本的セオリーで特別なことは必要ないです。
しかし、昨今の Python3系では、WSGIインタフェースというものを意図してCGIを制作するのが普通になっており、これはパフォーマンスの点で有利とされています。
Apache に mod_wsgi 拡張モジュールをインストールする必要があります。
現在のところ、標準モジュールにはなっていないため、別途インストールが必要です。
FreeBSD11 における mod_wsgi インストールは、ソースコードから下記のように行うのが確実。
pip (後述しています) でのインストールは、環境判定を誤認識したり変にエラーを吐いたりすることが環境によっては発生するため、筆者は全くお勧めしません。
# cp mod_wsgi-4.5.20.tar.gz /usr/local/src
# cd /usr/local/src
# tar xvzf mod_wsgi-4.5.20.tar.gz
# cd mod_wsgi-4.5.20
# ./configure --with-python=/usr/local/bin/python3.5 --with-apxs=/usr/local/apache2/bin/apxs
# make
# make install
--with-apxs を指定することで、お使いのサーバにおける環境に合わせた構築が出来ます。
通常、mod_wsgi は、上記の場合、/usr/local/apache2/modules/ 配下に動的リンクでインストールされます。
Apache への mod_wsgi に対する設定は、以下を参考にどうぞ:
LoadModule wsgi_module modules/mod_wsgi.so
WSGIDaemonProcess cgi-bin user=webadmin group=webuser processes=1 threads=5
WSGIScriptAlias / /home/webroot/hoge/cgi/app.wsgi
<Directory "/home/webroot/hoge/cgi">
WSGIProcessGroup cgi-bin
WSGIApplicationGroup %{GLOBAL}
</Directory>
ちなみに WSGIインタフェース自体は、Python に特化する目的を持つものではありません。
この辺りは勘違いされている諸氏が結構多いようです。
Perl だと mod_perl という Apache に組み込む形での有名な高速化拡張モジュールがありますが、それと同じようなものでしょうか。
Python 以外では導入メリットが見えにくいです。
最近のPerl はそれ自身が高速化してきているので、mod_perl 導入のメリットが見えにくくなってきているのと、mod_perl を組み込んだ状態にてCGIをスレッド動作させると原因不明の不安定な動作になったり、Perl 5.26 にすると、静的モジュールでは何故かインストールできないなど、色々問題があり、筆者のサーバでは mod_perl の利用は見合わせている状況です。
次に、Python から、PostgreSQL インタフェースを扱うモジュールをインストールするのですが、このインストールに先立ち、pip というサポートツール(?)を導入する必要があります。
Perl で言うところの CPAN に該当するものですね。
# python3.5 -m ensurepip
あれ? と思った諸氏も居られるかもしれません。
多くのサイトには「Python 3.4 以降では、pip は同時にインストールされる」と説明されているからですが、FreeBSD11 にて Ports から Python を導入した場合、pip は導入されません。FreeBSD11 にて Ports から Python を導入した場合、pip は手動操作で導入しないと駄目らしいです。
でも、pip は今後のメンテナンスで必須になるものの、今回は使いません。
最後に Python の PostgreSQLインタフェースモジュールをインストールするのですが、これもpip では環境誤認識をするため、ソースコードを持ってきて、下記の手順が確実です。
事前に、PostgreSQL 本体をインストールしておくことは言うまでもありませんね。
# cp psycopg2-2.7.3.1.tar.gz /usr/local/src
# tar xvzf psycopg2-2.7.3.1.tar.gz
# cd psycopg2-2.7.3.1
# setenv PATH '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/pgsql/bin'
# python3.5 setup.py build
# python3.5 setup.py install
ここで重要なのは、pg_config コマンドのパスを、環境変数 PATH に含めることにあります。
Python の psycopg2 は、Perl における DBI と DBD::Pg の組み合わせに相当します。