Web上でPython3を駆動するためにさくらVPSサーバーにmod_wsgiをインストールする

契約しているさくらのVPSサーバーにプログラミング言語 Python をインストールしてみたものの、 此の儘ではサーバー上でPythonは走らせられても、Webとの連携は図れません。

今月初め2013年10月01日の記事 さくらVPSにPython2系と並存する3系をインストールする でインストールしたPythonは折角Linuxサーバー運用々の2系と分けて態々3系をインストールしたのですから 出来れば3系をWebと連携させたいものです。

PythonとWebの連携を図る方法

Pythonをプログラミング言語としてWebサーバー上に駆動させるには幾つか方法があり、 古くはPerlなどでもお馴染みの CGI(Common Gateway Interface) が用いられもしたようですが現代に用いるには些かオーバーヘッドが過ぎるようです。

現代的な手法で言えば Heroku などのASPを用いる方法もありますが、今回の独自サーバーで駆動するには合いません。

Webサーバーと連携させたいのですからWebサーバーソフトウェアも問題となる処で、 頃日シェアを伸ばしている nginx も魅力的ですが、今回は枯れたソフトウェアでもあり一般的で情報も比較的多い Apache と連携させることとすれば、取り得る手法の代表的なものは以下となるようです。

スポンサーリンク
  • Zope
  • Apache + mod_python
  • Apache + mod_wsgi

mod_wsgiの選択

上記選択肢に於いて Zope はPythonのWebフレームワークとして老舗で定評もあり、 Apacheと連携を図れる処か、自らもWebサーバープログラムを内蔵し単体で完結します。 しかし教育コストが高く簡単なWebアプリ構築の際には些か大仰に過ぎもするようです。

Apacheのモジュールとして提供される環境の mod_python はこれもプログラミング言語 PHP と同じアイデアから作られたもので、PythonとApacheの連携を専門領域とし、 CGIのようなオーバーヘッドも少ないため今回の目的に合一しますが、 些か設計が古くメンテナンスも不安定なようですので問題が有ります。

其処で設計も最新で ウィズギー (WSG:Web Server Gateway Interface) と言うWebサーバーとプログラム言語との連携の最新定義に準拠した mod_wsgi を選択しました。

基本的にはサーバーにmod_wsgiをインストールして然るべきテストプログラムをWeb領域に置き、 オンラインから表示を確認するだけなのですが、情報も少なくなかなか厄介な作業となりました。 今回は作業的に行きつ戻りつし、結果的に対処療法を重ねた結果、何とかオンライン表示を確認出来た、 と言う状況であるのを予め断っておきます。

必要モジュールのインストール

先ずmod_wsgiをインストールする際に事前に必要となるモジュールをインストールしました。 具体的には以下の2モジュールです。

$ sudo yum install httpd-devel
$ sudo yum install python-devel

mod_wsgiのインストール

mod_wsgiの2013年10月2日に於ける最新版の3.4を Google Project Hostingmodwsgi - Python WSGI adapter module for Apache. に用意される Downloads - modwsgi から選択しダウンロードして、解凍、ビルド、インストールしました。

$ sudo wget https://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
$ sudo tar xvzf mod_wsgi-3.4.tar.gz
$ cd /usr/local/src/mod_wsgi-3.4
$ sudo ./configure --with-apxs=/usr/sbin/apxs --with-python=/usr/local/bin/python3.3
$ sudo make

インストールサーバに於いては2013年10月01日の記事にあるように Pythonの2系と3系が並存していますので3系でmod_wsgiを駆動するようにオプションを付加してします。 しかし以下エラーが出力されmakeに失敗してしまいました。

apxs:Error: Command failed with rc=65536
.
make: *** [mod_wsgi.la] Error 1

Python 3.3の再インストール

此処等辺りは正直作業が錯綜しているので参考にならないでしょうが、 自らの備忘録としても記しておきます。

此処で原因と目星を付けたのがPython3.3のインストール時のオプションでした。 2013年10月01日の記事でオプションを何も指定していないのが問題だと思われたのでした。 mod_wsgiの使用前提であるならばPythonインストール時に --enable-shared オプションが必要である 〔※1〕 旨の情報も有り、当該オプションを付記してPythonを再インストールしました。

$ sudo tar xvzf Python-3.3.2.tgz
$ cd Python-3.3.2
$ sudo ./configure --enable-shared
    …
    creating Makefile
$ sudo make
$ sudo make altinstall
$ python -V
    Python 2.4.3
$ python3.3 -V
    python3.3: error while loading shared libraries: libpython3.3m.so.1.0: cannot open shared object file: No such file or directory

Python3.3でエラーが発生したのでハードリンクで対処しました。

$ whereis libpython3.3m.so.1.0
    libpython3.3m.so.1: /usr/local/lib/libpython3.3m.so.1.0
$ sudo ln -s /usr/local/lib/libpython3.3m.so.1.0 /lib64/
$ python3.3 -V
    Python 3.3.2

mod_wsgiの再インストール失敗

しかしmod_wsgiを再インストールした処、 同じエラーが出力されてインストール出来ません。

--enable-shared オプションに於いてはPythonのバージョン違いを並存させていると問題を招く 〔※2〕 旨の情報もあり、此処でも原因と特定は出来ませんでしたので、 今回の様な事例に於けるPythonインストール時には指定しない方が良策かも知れません。

mod_wsgiのMakefileの書き換え

すると他に原因が有ることになり、其の目で再び環境を見てみれば Python3.3のインストール後には当該ディレクトリにpython3.3とpython3.3mが同時に存在したり -configが最終的にpython3.3m-configを指していたりしており、 -lpython3.3の指定が拙いのではないかと類推し、 ネットで同じ症状と其の対処法 〔※3〕 を見付けて参考にMakefileを以下の様に書き換えて見ました。

APXS = /usr/sbin/apxs
PYTHON = /usr/local/bin/python3.3

DESTDIR =
LIBEXECDIR = /usr/lib64/httpd/modules

CPPFLAGS = -I/usr/local/include/python3.3m -DNDEBUG
CFLAGS =
LDFLAGS = -L/usr/local/lib -L/usr/local/lib/python3.3/config
LDLIBS = -lpython3.3 -lpthread -ldl -lutil -lm

其の後再度mod_wsgiをインストールした処、 どうやら上手く納まってくれたようです。

$ sudo vi Makefile
$ sudo make
$ sudo make install
$ sudo find / -name mod_wsgi.so
    /usr/local/src/mod_wsgi-3.4/.libs/mod_wsgi.so
    /usr/lib64/httpd/modules/mod_wsgi.so

mod_wsgi稼動確認

以上でmod_wsgiのインストール作業は完了です。 此のインストールが上手く行ったか如何かは上に記した様に 然るべきテストプログラムをWeb領域に置いてオンラインから表示を確認すれば良く、 結論から言えば上首尾と相成りました。

ただPython3.3とApache連携のオンライン確認に於いても 幾つか問題が発生し、試行錯誤する処となりました。 本記事の稿も長くなりましたので、此れ以上加えるよりは 其の顛末は本ブログ次稿に譲りたく思います。

使用写真
  1. Python( photo credit: Roberto Verzo via Flickr cc
参考URL(※)
  1. さくら VPS 1G の CentOS に Python と Apache と mod_wsgi をインストールしてベンチマークとってみた(present:2012年5月4日)
  2. LinuxでPythonをビルドするときの --enable-shared オプションについて(Qiita [キータ]:2012年10月)
  3. Python3.3 + mod_wsgi3.4 をさくらVPS(CentOS)にインストールした時に少しハマったので振り返りメモ(Qiita [キータ]:2013年2月)