Django
Linux
apache2
wsgi

Django1.11 - プロジェクトのデプロイ

はじめに

 簡単なプロジェクトを作成し、それをLinuxサーバー上にデプロイします。

環境

  • Ubuntu 14.04
  • Django 1.11
  • Apache 2.4.7

プロジェクトの作成

 作業前にrootになっておきます。

$ sudo su -

 プロジェクトのルートディレクトリを/home/に作成し、移動します。
 今回はわかりやすさのために/home/に作成しています。

# mkdir /home/mysite.com
# cd /home/mysite.com

 仮想環境を作成しアクティベートします。この仮想環境は本番動作時に参照されます。

# virtualenv -p `which python3` venv
# source ./venv/bin/activate

 Djangoをインストールしてプロジェクトを作成します。

(venv) # pip install django==1.11
(venv) # django-admin startproject mysite
(venv) # cd mysite
(venv) # python3 manage.py startapp myapp
(venv) # ls
manage.py  myapp  mysite

 settings.pyを編集します。

(venv) # vi mysite/settings.py
settings.py
...
DEBUG = False # ここ

ALLOWED_HOSTS = ['*'] # ここ

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp', # ここ
]

...

 mysite/urls.pyを編集し、myapp/views.pyにビューを定義します。

mysite/urls.py
from django.conf.urls import url
from django.contrib import admin
from myapp import views as myapp_views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', myapp_views.index),
]

myapp/views.py
from django.shortcuts import render
from django.http import HttpResponse

def index(req):
    return HttpResponse('Hello, World!')

 開発サーバーで動作確認をします。

(venv) # python3 manage.py runserver 0.0.0.0:9123

 今回はメディアファイルとスタティックファイルの開発時の設定は省略します。代わりに、以下を作っておきます。

(venv) # pwd
/home/mysite.com/mysite

(venv) # mkdir static
(venv) # echo "This is static file." > ./static/file.txt

(venv) # mkdir media
(venv) # echo "This is media file." > ./media/file.txt

 完了です。仮想環境から抜けます。

(venv) # deactivate

デプロイ

 作成したプロジェクトをデプロイします。

モジュールのインストール

# apt install libapache2-mod-wsgi-py3

Apache2のコンフィグファイルを作成

# vi /etc/apache2/sites-available/mysite.com.conf
mysite.com.conf
# wsgi.py のエイリアスを設定。
WSGIScriptAlias / /home/mysite.com/mysite/mysite/wsgi.py

# PythonHomeの設定。仮想環境へのパスを指定する。
WSGIPythonHome /home/mysite.com/venv/

# PythonPathの設定。プロジェクトへのパスを指定する。
WSGIPythonPath /home/mysite.com/

<VirtualHost *:80>

    # メディアファイル。
    # エイリアスとファイル群のパーミッションを設定。
    Alias /media/ /home/mysite.com/mysite/media/
    <Directory /home/mysite.com/mysite/media/>
        Require all granted
    </Directory>

    # スタティックファイル。
    # エイリアスとファイル群のパーミッションを設定。
    Alias /static/ /home/mysite.com/mysite/static/
    <Directory /home/mysite.com/mysite/static/>
        Require all granted
    </Directory>

    # wsgi.py.
    # パーミッションを設定。
    <Directory /home/mysite.com/mysite/mysite/>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    # ログの設定
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

コンフィグファイルの有効化

 作成した設定を有効化します。

# a2ensite mysite.com

 その他の不要な設定は無効化します。

# a2dissite 000-default

wsgi.py の編集

 /home/mysite.com/mysite/mysite/wsgi.pyを編集します。

wsgi.py
import os

from django.core.wsgi import get_wsgi_application

# ここから
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../")))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
# ここまでを加える

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

application = get_wsgi_application()

プロジェクトのオーナーを変更

 プロジェクトのオーナーをwww-dataに変更します。
 変更前にcollectstaticなどを必要に応じて行ってください。

# chown www-data:www-data -R /home/mysite.com/mysite

確認

 Apache2をリロードしてから表示を確認します。「Hello, World!」が表示されていれば成功です。

# service apache2 reload
# curl localhost
Hello, World!

 スタティックファイルとメディアファイルの確認も行います。

# curl localhost/static/file.txt
This is static file.

# curl localhost/media/file.txt
This is media file.