python3 Django1.9 を mod_wsgi で動かす ( デプロイする )

mod_wsgiでDjangoデプロイ環境を作る手順についてまとめた。
備忘録メインなので、手順しか書いてない。ちゃんと理解したい方は他の記事も見たほうが良いでしょう。

# 環境

- Ubuntu Server 14.04
- python3.5.1 (on pyenv)
- Django1.9.4
- mod_wsgi

# 環境構築

sshでUbuntuサーバーに接続し、環境を整えていく。

## apache

apacheのインストールがまだの場合は下記コマンドでインストールする。

```
$ sudo apt-get install apache2
```

## python , Django

次にpyenvからpythonをインストールする。下記参照。(pythonのバージョンを3.5.1に直そう)
http://qiita.com/tonkatu05/items/d0422a2050d669c72f54#1-%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89

```
$ python --version
Python 3.5.1
```

Djangoもインストールする。

```
$ pip install django==1.9.4
```

## mod_wsgi

次にmod_wsgiをインストールする。

```
$ sudo apt-get install libapache2-mod-wsgi-py3
```


(※ 別の方法 [mod_wsgiをソースからインストールする](##mod_wsgiをソースからインストールする) )

# まずはHello World から

/home/hoge/hello.pyを作成する。

```py3:hello.py

import sys

def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World! python version : ' + sys.version.encode("utf-8")

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]
```

/etc/apache2/sites-available/python.confを作成する。

```apache:python.conf

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias / /home/hoge/hello.py
# WSGIScriptAlias / /home/hoge/TestProject/TestProject/wsgi.py
WSGIPythonPath /home/hoge/TestProject:/home/hoge/.pyenv/versions/3.5.1/lib/python3.5/site-packages

<Directory /home/hoge>
   Require all granted
</Directory>
```

設定を反映させる。

```
$ sudo a2ensite python.conf
```

apacheを再起動する。

```
$ sudo service apache2 restart
```

ブラウザからアクセスしてみる。

```
Hello World! python version : 3.4.3 (default, Oct 14 2015, 20:31:36) 
[GCC 4.8.4]
```

と表示される。
(python のバージョンが謎)

# Django を動かす

```
$ cd 
$ django-admin startproject TestProject
```

/home/hoge/TestProject/TestProject/wsgi.pyを編集しする。

```py3:wsgi.py
"""
WSGI config for TestProject project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/
"""

import os
import sys

from django.core.wsgi import get_wsgi_application

sys.path.append('home/hoge/TestProject')
sys.path.append('home/hoge/TestProject/TestProject')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "TestProject.settings")

application = get_wsgi_application()
```

/etc/apache2/sites-available/python.confを編集しする。
( `WSGIScriptAlias / /home/hoge/hello.py` をコメントアウトし、
`WSGIScriptAlias / /home/hoge/TestProject/TestProject/wsgi.py` をアンコメントする)


```apache:python.conf

LoadModule wsgi_module modules/mod_wsgi.so

# WSGIScriptAlias / /home/hoge/hello.py
WSGIScriptAlias / /home/hoge/TestProject/TestProject/wsgi.py
WSGIPythonPath /home/hoge/.pyenv/versions/3.5.1/lib/python3.5/site-packages

<Directory /home/hoge>
   Require all granted
</Directory>
```

```
$ sudo service apache2 restart
```

またブラウザからアクセスしてみる
Djangoの「It worked!」の画面が表示されたら成功。

![image](https://qiita-image-store.s3.amazonaws.com/0/69140/c5f026a6-0b9f-fb51-b24c-a7fc7fc4a6aa.png)


# 別の方法

##mod_wsgiをソースからインストールする

hello.pyの結果を見て分かるように何故かpythonのバージョン3.4.3が使われてた。mod_wsgiをapt-get でインストールするとバージョンを指定できない感じなのかな〜。どういう仕組みか分からないけど、バージョンの差異で何か不便があるかもしれない、、、？（バージョン周りの知識にうとい）

ということでmod_wsgiをソースからインストールする方法も試してみた。こちらは結構手ごわかった。結局pythonの3.5-devというのをインストールすることになった。エラーコードでぐぐってstackoverflowとか頑張って読みながら進めた感じで、自分でも色々意味が分かっていない。

前置きは終わりにして、以下手順で多分ok。

とりあえずインストールしたものを消す。（インストールしていた場合）

```
$ apt-get remove libapache2-mod-wsgi-py3
$ pyenv uninstall 3.5.1
```

apache2-devをインストール

```
$ sudo apt-get install apache2-dev
```

python3.5-devをインストールしようとすると、

```
$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.5-dev
Cloning https://hg.python.org/cpython...
error: please install `mercurial` and try again
```

と言われるので、mercurialをインストール

```
$ sudo apt-get install mercurial
$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.5-dev
```

mod_wsgiをインストール

```
$ cd 
$ wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.4.13.tar.gz
$ tar zxvf 4.4.13.tar.gz
$ mv mod_wsgi-4.4.13 /usr/local/src
$ cd /usr/local/src/mod_wsgi-4.4.13
$./configure LDFLAGS='-Wl,-rpath=/home/hoge/.pyenv/versions/3.5-dev/lib'
$ make
$ sudo make install
```

apacheにモジュールを適用

```
$ sudo a2enmod wsgi
```

apacheを再起動

```
$ sudo service apache2 restart
```

# まとめ

文献とか探すのとかけっこう大変で時間かかった。環境構築に詳しい人を隣に置いて作業したい...(_ _)
何か変なことやってたらぜひ教えてください。