フルスタックエンジニアへの道

「フルスタックエンジニアになりたい。。。いや、なってやる!」という備忘録

Django + venv + Apache【Ubuntu16.04】

今回はPythonのインストールからDjangoのインストール、Apache経由でDjangoにアクセスするまでを行います。

環境

  • Ubuntu16.04
    • ユーザ名 : user
    • 各項目で「user」と記載されているところは、環境に合わせて読み替えてください
  • Python(3.8)
  • Django(3.0.3)

構築前に

  • $ : プロンプト
    • 基本的に基本的にホームディレクトリで操作を行い、別ディレクトリで操作が必要な場合は「cd」を行います
    • プロンプトの左側に文字がある場合、その文字はcdで移動したディレクトリ名で、そのディレクトリ上で操作をしていることを示します
  • # : コメント
    • 今回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です。 f:id:ryasshi:20200205152847p:plain

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アプリケーションフレームワーク)を接続するための、標準化されたインタフェース定義である。

ja.wikipedia.org

mod_wsgiとは?

mod_wsgiとは、WSGI (Web Server Gateway Interface) インターフェースに準拠した PythonのプログラムをApache HTTP Serverで動作させるためのモジュールである。

ja.wikipedia.org


ではインストールをしていきます。

# 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です。 f:id:ryasshi:20200205152847p:plain


参考:
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