Django + venv + Apache【Ubuntu16.04】
今回はPythonのインストールからDjangoのインストール、Apache経由でDjangoにアクセスするまでを行います。
- 環境
- 構築前に
- Pythonのインストール
- venvのインストールと実行方法の確認
- Djangoのインストール
- 動作確認&チュートリアル
- Apache
- staticディレクトリの集約
- パーミッションやグループ(www-data(Apacheのグループ))の変更
- Apacheの設定
- Apacheの設定読み込み
- アクセス
環境
構築前に
- $ : プロンプト
- # : コメント
- 今回rootという意味では使いません
- [文字列] : 任意の文字列もしくは環境で変わる文字列
- 例 : python3.8 -m venv [venv_name] → python3.8 -m venv django-venv
- (venv) : 仮想環境上で操作することを示す
- このマークがないときは、仮想環境でも仮想環境でなくてもどちらでもよいときです
- ... : 設定ファイル等で表示を省略した行を示します
Pythonのインストール
標準のリポジトリではPython3.5だったので、PPAを追加してPython3.8をインストールします。
PPAリポジトリを追加
PPAリポジトリを追加します。
「OK」と表示されればOKです。
$ sudo add-apt-repository ppa:deadsnakes/ppa
リポジトリを追加したので、アップデートしておきます。
$ sudo apt update
Python3.8とpipのインストール
Python3.8をインストールします。
$ sudo apt install -y python3.8 python3.8-distutils
pipをインストールします。
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ sudo python3.8 get-pip.py # 「Successfully」と表示されればOK
venvのインストールと実行方法の確認
venvをインストールし、実行方法を確認します。
venvのインストール
venvをインストールします。
$ sudo apt install -y python3.8-venv
仮想環境の作成
仮想環境はpython3.8 -m venv [venv_name]
で作成します。
「[venv_name]」には任意の名前を指定してください。
ここでは「django_venv」という名前で作成します。
以降、「django_venv」と表記された箇所は環境に合わせて読み替えてください。
$ python3.8 -m venv [venv_name] # django_venvという名前で作成した場合 $ ls -l total 1772 drwxrwxr-x 5 user user 4096 Feb 5 14:06 django_venv -rw-rw-r-- 1 user user 1807342 Feb 5 13:33 get-pip.py
venvの起動 / 停止
起動方法はsource [venv_name]/bin/activate
です。
「[venv_name]」は先程のvenv作成時に指定した名前です。
起動すると「$」の前に「([venv_name])」が表示されます。
以降、venvを起動した状態を「(venv)」と表記します。
# ここではvenv_nameはdjango_venvです $ source [venv_name]/bin/activate ([venv_name]) $
停止方法はdeactivate
を実行するだけです。
([venv_name]) $ deactivate $
Djangoのインストール
Djangoのインストールを行います。
venvの起動
起動していない場合は、起動してください。
$ source django_venv/bin/activate
Djangoのインストール
最終行付近に「Successfully」が表示されていればOKです。
(venv) $ pip install -U django Collecting django Using cached https://files.pythonhosted.org/packages/55/d1/8ade70e65fa157e1903fe4078305ca53b6819ab212d9fbbe5755afc8ea2e/Django-3.0.2-py3-none-any.whl Collecting asgiref~=3.2 (from django) Using cached https://files.pythonhosted.org/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl Collecting sqlparse>=0.2.2 (from django) Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl Collecting pytz (from django) Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl Installing collected packages: asgiref, sqlparse, pytz, django Successfully installed asgiref-3.2.3 django-3.0.2 pytz-2019.3 sqlparse-0.3.0 WARNING: You are using pip version 19.2.3, however version 20.0.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command.
動作確認&チュートリアル
プロジェクトの作成など、簡単なチュートリアルを行います。
プロジェクトの作成
プロジェクトはdjango-admin startproject [project_name]
で作成します。
「[project_name]」には、任意の名前を指定してください。
ここでは、「test_project」という名前で作成します。
以降、「test_project」と表記された箇所は、環境に合わせて読み替えてください。
# venvの起動 $ source django_venv/bin/activate # プロジェクトの作成 (venv) $ django-admin startproject [project_name] # test_projectという名前で作成した場合 (venv) $ ls -l test_project/ total 8 -rwxrwxr-x 1 user user 632 Feb 5 14:31 manage.py drwxrwxr-x 2 user user 4096 Feb 5 14:31 test_project
アプリの作成
次にアプリを作成していきます。
アプリはpython manage.py startapp [test_app]
で作成します。
「[test_app]」に任意の名前を指定してください。
ここでは、「test_app」という名前で作成します。
以降、「test_app」と表記された箇所は環境に合わせて読み替えてください。
# プロジェクトのディレクトリに移動 (venv) $ cd test_project # アプリの作成 (venv) test_project $ python manage.py startapp [test_app] # test_app という名前で作成した場合 (venv) test_project $ ls -l test_app/ total 24 -rw-rw-r-- 1 user user 63 Feb 5 14:46 admin.py -rw-rw-r-- 1 user user 90 Feb 5 14:46 apps.py -rw-rw-r-- 1 user user 0 Feb 5 14:46 __init__.py drwxrwxr-x 2 user user 4096 Feb 5 14:46 migrations -rw-rw-r-- 1 user user 57 Feb 5 14:46 models.py -rw-rw-r-- 1 user user 60 Feb 5 14:46 tests.py -rw-rw-r-- 1 user user 63 Feb 5 14:46 views.py
views.pyの編集
test_appディレクトリ内のviews.pyを下記のように編集します。
(venv) test_project $ vim test_app/views.py from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse('Test App')
urls.pyの新規作成&編集
test_appディレクトリ内にurls.pyを新規作成し、下記の内容で保存します。
(venv) test_project $ vim test_app/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]
test_projectディレクトリ内のurls.pyを下記のように編集します。
(venv) test_project $ vim test_project/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('test_app/', include('test_app.urls')), ]
Allows hotsの設定
「settings.py」でAllows hostsを設定します。
「[IP_Address]」はお使いのサーバのアドレスを指定します。
もし名前解決ができる環境であればホスト名を記述してください。
ちなみに「'*'」を指定すると、どんな名前でも許可します。
(venv) test_project $ vim test_project/settings.py ... # アドレスは「'(シングルクォート)」で囲みます ALLOWED_HOSTS = ['[IP_Address]'] ...
サーバの起動&アクセス
(venv) test_project $ python manage.py runserver 0:8000 Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. February 05, 2020 - 06:09:37 Django version 3.0.3, using settings 'test_project.settings' Starting development server at http://0:8000/ Quit the server with CONTROL-C.
サーバが起動したらブラウザでhttp://[IP_Address]:8000/[app_name]/
にアクセスします。
今回は、VirtualBoxで作成しているためhttp://localhost:8000/test_app/
にアクセスしています。
下記のように表示されればOKです。
Apache
Apache経由でDjangoにアクセスできるようにします。
Apacheのインストール
# apache2-dev は mod_wsgi をインストールするのに必要 $ sudo apt install -y apache2 apache2-dev
WSGIのインストール
インストールの前に、引用ですが用語の確認です。
WSGIとは?
Web Server Gateway Interface (WSGI; ウィスキー) は、プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション(もしくはWebアプリケーションフレームワーク)を接続するための、標準化されたインタフェース定義である。
mod_wsgiとは?
mod_wsgiとは、WSGI (Web Server Gateway Interface) インターフェースに準拠した PythonのプログラムをApache HTTP Serverで動作させるためのモジュールである。
ではインストールをしていきます。
# mod_wsgiのインストールに必要 $ sudo apt install -y python3.8-dev # venv 起動、起動済みの場合は飛ばしてOK $ source ~/djang-venv/bin/activate # mod_wsgi のインストール (venv) $ pip install mod_wsgi
staticディレクトリの集約
Apache経由でDjangoを利用する場合は、staticディレクトリを集約させます。
test_projectディレクトリ内のsettings.pyを編集します。
# test_project に移動、移動済みの場合は飛ばしてOK (venv) $ cd ~/test_project # 最終行に追記 (venv) test_project $ vim test_project/settings.py ... STATIC_ROOT = os.path.join(BASE_DIR, 'static') # static ディレクトリを集約します (venv) test_project $ python manage.py collectstatic 130 static files copied to '/home/user/test_project/static'. # static ディレクトリが test_project ディレクトリ直下に作成されていることを確認します (venv) test_project $ ls -l total 16 -rw-r--r-- 1 user user 0 Feb 5 15:09 db.sqlite3 -rwxrwxr-x 1 user user 632 Feb 5 14:31 manage.py drwxrwxr-x 3 user user 4096 Feb 5 16:02 static drwxrwxr-x 4 user user 4096 Feb 5 15:09 test_app drwxrwxr-x 3 user user 4096 Feb 5 16:01 test_project
パーミッションやグループ(www-data(Apacheのグループ))の変更
Apacheがアクセス・実行できるようにパーミッションやグループを変更します。
「user」は、環境に合わせて読み替えてください。
# ユーザのホームディレクトリのパーミッションを変更、元から755なら変更不要です (venv) test_project $ sudo chmod 755 /home/user (venv) test_project $ sudo chmod 775 ./ (venv) test_project $ sudo chmod 664 ./db.sqlite3 # プロジェクトのディレクトリと db.sqlite3 のグループを「www-data」に変更します (venv) test_project $ sudo chgrp www-data ./ (venv) test_project $ sudo chgrp www-data ./db.sqlite3
Apacheの設定
Django用の設定ファイルを新規作成します。
# mod_wsgi モジュールがどこにあるか find で探します $ find ~/ -name "mod_wsgi*.so" /home/user/django_venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so # 設定ファイルを新規作成し、赤文字を記述します $ sudo vim /etc/apache2/sites-available/django.conf <VirtualHost *:80> # 先ほど find で探した mod_wsgi モジュールのパスを「LoadModule wsgi_module」に記述します LoadModule wsgi_module /home/user/django-venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so # 「WSGIDaemonProcess」にプロジェクト名と venv 環境のパスを記述します WSGIDaemonProcess test_project python-home=/home/user/django-venv python-path=/home/user/test_project # 「WSGIScriptAlias」に プロジェクト/アプリ内の wsgi.py のパスとプロジェクト名を記述します WSGIScriptAlias / /home/user/test_project/test_project/wsgi.py process-group=test_project # Apache のログ出力先を指定します ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # プロジェクト/アプリのパスを指定し、wsgi.py へのアクセスを許可します <Directory /home/user/test_project/test_project> <Files wsgi.py> Require all granted </Files> </Directory> # /static でアクセスできるようにエイリアスを設定します Alias /static/ /home/user/testproject/static/ # 集約した static ディレクトリのパスを指定し、static ディレクトリ内のディレクトリ・ファイルへのアクセスを許可します <Directory /home/user/testproject/static> Require all granted </Directory> </VirtualHost> # 設定ファイルのチェック、「Syntax OK」が出ればOK $ apache2ctl configtest AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK
Apacheの設定読み込み
デフォルトの「000-default.conf」を読み込ませずに、「django.conf」の設定を読み込ませるようにします。
# 000-default.conf を読み込まないようにする $ sudo a2dissite 000-default # django.conf を読み込むようにする $ sudo a2ensite django # Apache のリスタート $ sudo systemctl restart apache2
アクセス
実際にApache経由でDjangoにアクセスできるか試してみます。
ブラウザでhttp://[IP_Address]/[app_name]/
にアクセスします。
今回は、VirtualBoxで作成しているためhttp://localhost/test_app/
にアクセスしています。
下記のように表示されればOKです。
参考:
https://docs.djangoproject.com/ja/3.0/intro/tutorial01/
https://qiita.com/itisyuu/items/dafa535adc8197208af1
https://qiita.com/okoppe8/items/0f67753706cdc11ff1cd
https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa