mod-wsgi を python3.5.0 + pyenv + Apache2 で、AmazonLinux 上に構築

mod-wsgi は、python と1:1で紐付いているため、apacheに1つまでしか追加できない。

pyenv を入れる

公式に書いてあるとおり。
yyuu/pyenv · GitHub

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
・・・

python3 を入れる

このときに、オプションを付ける必要があります。
global にしても、しなくてもよいです。

$ CFLAGS="-fPIC"  pyenv install 3.5.0
$ pyenv global 3.5.0

apache2 を入れる

$ sudo aptitude install httpd
$ sudo aptitude install httpd-devel

mod_wsgi を入れる

以下の方法でインストールしてしまうと、system の python がつかわれる。

$ sudo aptitude install libapache2-mod-wsgi-py3 

*1

mod_wsgi.tar.gz をダウンロード

公式からダウンロード

install

python のパスを指定します。

$ tar zxvf mod_wsgi.tar.gz
$ cd mod_wsgi
$ ./configure --with-python=/home/username/.pyenv/versions/3.5.0/bin/python
$ make
$ sudo make install

apache2 設定

<VirtualHost *:80>

  ServerName   hoge.test
  ServerAdmin  server-mail@hoge.test
  DocumentRoot /hoge/public

  WSGIScriptReloading On
  WSGIDaemonProcess  my_name python-path=/home/username/.pyenv/versions/3.5.0/lib/python3.5/site-packages python-home=/home/username/.pyenv/versions/3.5.0  user=apache group=apache processes=2 threads=25
  WSGIProcessGroup   my_name
  WSGIScriptAlias    /  /hoge/app.wsgi

  <Directory "/hoge/">
    Order deny,allow
  </Directory>
</VirtualHost>

追加で、
LoadModule による wsgi のロードと、の設定が必要。
WSGISocketPrefix /var/run/wsgi

トラブルシューティング

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encoding'

python-home、 python-path が間違っている可能性があります。

python-home は、python コンパイルオプションの、prefix と同じにします。
確認方法は以下。

$ python
>>> import sysconfig
>>> sysconfig.get_config_vars('CONFIG_ARGS')

python-path は、site-packages までのパスを設定します。

/home/username にアクセス出来ていない可能性があります。
chmod 755 /home/username

pyenv のインストール先を変更するのでも良いと思います。

(13)Permission denied: mod_wsgi (pid=23797): Unable to connect to WSGI daemon process '***' on '/etc/httpd/logs/wsgi.12880.0.1.sock' after multiple attempts., referer: http://dummy.test

socket ファイルにアクセス出来ていない可能性があります

WSGISocketPrefix の設定を変更する

*1:ただし、pyenv で管理しているの system python は、python (version2) で、 python3 を使う場合は、3を付けます。