Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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をソースからインストールする )

まずはHello World から

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

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を作成する。

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を編集しする。

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 をアンコメントする)

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

別の方法

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

まとめ

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

macinjoke
Webをやっていく 主戦力: React, TypeScript
http://tonkatu05.hatenablog.com/
dwango
Born in the net, Connected by the net.
https://dwango.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした