Debian + Python 3.4 + django1.7 を試す……が

振り返ってみるとあまりに馬鹿らしい結末なんですが、一応やったので記録。

# やりたかったこと

* Ubuntu(14.04 LTS)うらやましいなぁ。DebianでもPython 3.4試せないかなぁ
* ついでにdjango1.7も試してみたいなぁ
* Debianシステム標準の2系(2.7)は残しておきたいなぁ
* Debianシステム標準の3系(3.2)も残しておきたいなぁ
* 特定のdjangoプロジェクトだけPython 3.4でdjango1.7(b3)を使って「わはー」な世界を目指そう
* Apache2上でバラバラのバージョンで動いたら楽しい！

あるいは「emacsとterminal開いている開発環境本体でとりあえず全部動いていて欲しい」という要望です。

結論から言うと、```./manage.py runserver```まではいけるものの、mod_wsgiが最後の要望は許してくれません。

# 参考リンク

* https://github.com/tagomoris/xbuild
* https://github.com/tagomoris/xbuild/blob/master/python-install
* https://www.djangoproject.com/download/
* https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/modwsgi/

# 作業

* python3.4.0 をとにかく用意する
* それをベースにpyvenvを使ってdjango1.7専用世界を作る
* プロジェクトを作る
* Apache2のmod_wsgi経由で走らせてわはー

    > xbuild/python-install 3.4.0 /opt/python3.4.0
    > /opt/python3.4.0/bin/pyvenv /opt/django1.7
    > source /opt/django1.7/bin/activate
    (django1.7) > which pip
    /opt/django1.7/bin/pip
    (django1.7) > pip install https://www.djangoproject.com/download/1.7b3/tarball/
    ..
    (django1.7) > pip list
    Django (1.7b3)
    pip (1.5.4)
    setuptools (2.1)
    (django1.7) > cd /opt    
    (django1.7) > django-admin.py startproject mysite
    (django1.7) > cd mysite
    (django1.7) > ls
    manage.py mysite
    (django1.7) > ./manage.py syncdb
    ..
    (django1.7) > ./manage.py runserver 
    (Visit http://localhost:8000/)

「ここまで動けばとりあえず勝ちだろう。後はapache2の設定だぜ」みたいな気分でいたんですがね。

    WSGIDaemonProcess mysite user=www-data group=www-data processes=2 threads=2 \
      maximum-requests=100 umask=0007 \
      python-path=/opt/mysite:/opt/django1.7/lib/python3.4/site-packages
    WSGIScriptAlias /mysite  /opt/mysite/mysite/wsgi.py
    <Directory /opt/mysite/mysite>
        <Files wsgi.py>
            SetEnv PROCESS_GROUP mysite
            Order deny,allow
            Allow from all
        </Files>
    </Directory>    

SQLiteのDBをとりあえずwww-dataから書き込み可能な状態に。

    (django1.7) > chmod 777 db.sqlite3
    (django1.7) > chmod 777 .
    (django1.7) > sudo service apache2 restart

    (Visit http://localhost/mysite/admin)

バージョンが本当に3.4になっていることを確信持つためにurls.pyとviews.pyをちょっとだけ変更

```py3:urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'mysite.views.home', name='home'),
)
```

```py3:views.py
from django.http import HttpResponse
import sys

def home(request):
    return HttpResponse(str(sys.version_info), content_type="text/plain")
```

# 結果

(venv activate済で) ./manage.py runserverから走らせると

    sys.version_info(major=3, minor=4, micro=0, releaselevel='final', serial=0)

apache2 + mod_wsgiで走らせると

    sys.version_info(major=3, minor=2, micro=3, releaselevel='final', serial=0)

にょろーん…… (libapache2-mod-wsgi-py3 を入れてないと、ここが 2.7系を示すアレになってさらにショックが大きい)

apache2のログは全てを語っている。

    [Thu May 01 17:01:31 2014] [notice] Apache/2.2.22 (Debian) mod_auth_tkt/2.1.0 PHP/5.4.4-14+deb7u9 mod_ssl/2.2.22 OpenSSL/1.0.1e mod_wsgi/3.3 Python/2.7.3 configured -- resuming normal operations
    [Thu May 01 17:04:01 2014] [notice] caught SIGTERM, shutting down
    [Thu May 01 17:04:02 2014] [warn] mod_wsgi: Compiled for Python/3.2.2rc1.
    [Thu May 01 17:04:02 2014] [warn] mod_wsgi: Runtime using Python/3.2.3.

そこか orz

mod_wsgiを複数持つとかは多分有り得ないので、Apacheも別途持たなければならないとかいうことに。
そこまでやるならdockerとかkvmとか使うよな。
ただ、そうやってOS分裂させると、設定ファイルも四方八方に分裂するので、最初の要望からは程遠いということに。

# 追記

tornado + apacheからのリバースプロキシではどうかというアイディアいただきました。ここまでトルネードを知らなかった事実に身震いが

* http://www.tornadoweb.org/en/stable/
* http://stackoverflow.com/questions/22062307/tornado-vs-wsgiwith-gunicorn

いやしかしxbuildもpyenvも今日知ったもんだからな。仕方ないな。