UbuntuでPython3.4 + mod_wsgi + mysql5を使うときの注意点

python-logo

UbuntuでPython3.4 + mod_wsgi + mysql5をセットアップした際にかなりはまったので注意点をメモしておきます.

環境:

  • Ubuntu 14.04
  • Apache/2.4.7 (Ubuntu)
  • 5.5.44-0ubuntu0.14.04.1
  • Python 3.5.0 (pipでインストール)

この状況で,wsgiとmysqlを利用する場合,mysqlコネクタとmod_wsgiの選択を誤るとうまく動かないことがあるようです.

mysqlコネクタ

2015年8月の現時点で,python3ではmysqlclientが安定している模様.python3-devを入れた上で,pipでインストールできます1

$ sudo apt-get install python3-dev
$ pip install mysqlclient

mod_wsgi

ここにかなりはまりました.mysqlclientを導入して,pythonとmysqlが動くことを確認しても,wsgiアプリでimportエラーが止まらないという現象に遭遇.

[wsgi:error] mod_wsgi : Target WSGI script '****' cannot be loaded as Python module.
...
[wsgi:error]      import MySQLdb
[wsgi:error] ImportError: No module named MySQLdb

原因は大きく2点ありました.

  • python3用のmod_wsgiはlibapache2-mod-wsgiではなく,libapache2-mod-wsgi-py3であり,前者では正しく動作しません.
  • apt-get installでインストールされるUbuntu用のlibapache2-mod-wsgi-py3パッケージのバージョンは古いため,python3.4では動作しません(wsgiのv3.5以前のバージョンはセキリュティの問題で使用不可になっているが,apt-getで配布されているのはv3.4).従ってsudo apt-get install libapache2-mod-wsgi-py3でインストールしてはいけません.

python3.4で利用できるバージョンをインストールするには,Apacheのmodとして組み込む方法と,pipでインストールする(pip install mod_wsgi)方法があります2 .Apacheのmodとして組み込む場合,Debian用のStableパッケージが下記のリンクから提供されているので,sudo dpkg -iでインストールできます.

https://packages.debian.org/jessie/libapache2-mod-wsgi-py3

ただし,依存するlibpython,libpython-stdlib,libpython-minimulのアップグレードを先におこなう必要がありました.

追記

apt-getとの依存関係でエラーが出るため,Apacheのmodとして組み込む方法はやめ,pipでインストールする方法に変更しました.基本的に AssertionError using Apache2 and libapache2-mod-wsgi-py3 on Ubuntu 14.04 (Python 3.4) に書かれている方法に従いましたが,最後にApacheを再起動したところで下記のエラーが出ました.

Cannot load /usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so into server:/usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so: undefined symbol: forkpty

いろいろ調べたところ,下記のコードを /etc/apache2/envvars に追記し,apacheを再起動したところ,解消されました.

LD_PRELOAD=/lib/x86_64-linux-gnu/libutil.so.1
export LD_PRELOAD
  1. 参考:https://github.com/PyMySQL/mysqlclient-python  []
  2. 詳細はhttp://modwsgi.readthedocs.org/en/develop/index.html  []