UbuntuにDjangoを設定する

VPSサーバーのubuntu上にPythonのWebフレームワークのDjangoをインストールして、Nginxで起動するように設定してみたいと思います。

目次

前準備

STEP

VPSサーバー環境

  • OS:ubuntu22.04
  • Webサーバー:Nginx18.0
  • DB:MariaDB10.6.16
  • Python3.10.12
  • pip22.0.2
STEP

開発ツールのインストール

事前に下記の開発ツールをインストールします。

sudo apt install python3-dev default-libmysqlclient-dev build-essential
sudo apt install pkg-config
sudo apt install libmariadb-dev
STEP

前提条件

説明の都合上、下記内容で記述しますので、各自の環境に合わせて変更してください。

  • プロジェクトディレクトリ名:django
  • ドメイン名:django.winroad.blog
  • プロジェクト名:myproject

Djangoプロジェクトのセットアップ

STEP

プロジェクトディレクトリの作成

sudo mkdir -p /var/www/django
sudo chown $USER:$USER /var/www/django
cd /var/www/django
STEP

仮想環境の作成とアクティベート

python3 -m venv myenv
source myenv/bin/activate
Pythonの仮想環境について

Pythonの仮想環境

Pythonの仮想環境は、特定のプロジェクトに必要なライブラリをシステム環境に影響を与えずにインストール・管理できる機能です。

仮想環境のメリット

仮想環境を使用するメリットは、以下のとおりです。

  • 環境の独立性: プロジェクトごとに必要なライブラリを個別に管理できるため、異なるプロジェクト間でライブラリのバージョン競合が発生するリスクを抑えられます。
  • システム環境への影響: システム環境に影響を与えずにライブラリをインストール・アンインストールできるため、システム全体の安定性を保ちやすくなります。
  • 依存関係の管理: プロジェクトごとに必要なライブラリのバージョンを明確に管理できるため、コードの再現性と移植性を向上させることができます。

仮想環境の使い方

Pythonの仮想環境は、主に以下の2つの方法で作成できます。

1. venv モジュールを使う

venv モジュールは、Python 3.3 以降に標準搭載されている仮想環境管理モジュールです。

python -m venv my_env

上記のコマンドを実行すると、my_env という名前の仮想環境が作成されます。

仮想環境をアクティベートするには、以下のコマンドを実行します。

source my_env/bin/activate

仮想環境がアクティベートされると、プロンプトに (my_env) というプレフィックスが表示されます。

仮想環境を終了するには、以下のコマンドを実行します。

deactivate

2. virtualenv パッケージを使う

virtualenv は、venv モジュールよりも多くの機能を持つ仮想環境管理パッケージです。

pip install virtualenv
virtualenv my_env

上記のコマンドを実行すると、my_env という名前の仮想環境が作成されます。

仮想環境のアクティベートと終了方法は、venv モジュールを使う場合と同じです。

仮想環境の管理

仮想環境を管理するには、以下のコマンドを使用できます。

  • pip list: 仮想環境にインストールされているライブラリの一覧を表示
  • pip install: 仮想環境にライブラリをインストール
  • pip uninstall: 仮想環境からライブラリをアンインストール

仮想環境の注意点

仮想環境を使用する際には、以下の点に注意する必要があります。

  • 仮想環境内では、システム環境にインストールされているライブラリは利用できません。
  • 仮想環境をアクティベートしていない状態で pip コマンドを実行すると、システム環境にライブラリがインストールされます。
  • 仮想環境を削除すると、その仮想環境にインストールされていたライブラリもすべて削除されます。
STEP

Djangoのインストール

pip install django
STEP

Djangoプロジェクトの作成

django-admin startproject myproject .

※最後のドットを忘れずに!

データベースの設定

STEP

mysqlclientのインストール

pip install mysqlclient
STEP

MariaDBを起動

sudo mysql -u root -p
STEP

データベースの作成

CREATE DATABASE your_db_name;
STEP

ユーザーの作成

CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';
STEP

ユーザーへの権限付与

GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_db_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

settings.pyの編集

STEP

settings.pyを開く

vim myproject/settings.py
STEP

データベースの設定

データベース設定をMariaDBに合わせます。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your_db_name',
        'USER': 'your_db_user',
        'PASSWORD': 'your_db_password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
STEP

ALLOEWED_HOSTSの設定

ALLOEWED_HOSTSに許可するドメインを記述します。

ALLOWED_HOSTS = ['django.winroad.blog']
ALLOWED_HOSTSとは

ALLOWED_HOSTSは、Djangoアプリがアクセスを許可するウェブサイトのリストです。設定されていないサイトからのアクセスは拒否されます。

なぜ必要なの?

  • 悪意のあるユーザーが不正なアクセスを防ぐ
  • 間違ったサイトからのアクセスを防ぐ

設定方法は?

Djangoの設定ファイル(settings.py)に、許可するサイトのURLをリスト形式で記述します。

例:

Python

ALLOWED_HOSTS = ['www.example.com', 'example.com']

上記の場合、www.example.comexample.com からのアクセスのみ許可されます。

設定時の注意点

  • 開発中は ALLOWED_HOSTS = ['*'] と設定することもありますが、本番環境では必ず許可するサイトを具体的に記述してください。
  • ホスト名を変更した場合は、ALLOWED_HOSTSの設定も変更する必要があります。
  • ワイルドカード(*)はセキュリティリスクがあるので、できるだけ使用しないようにしましょう。

まとめ

ALLOWED_HOSTSは、Djangoアプリの安全性を守るために必要な設定です。設定方法は簡単なので、忘れずに設定しましょう。

補足

  • ホストヘッダーインジェクション攻撃:悪意のあるユーザーが偽のホスト名を設定して、アプリを不正操作する攻撃
  • CSRF攻撃:ユーザーの操作を偽装して、不正なリクエストを実行する攻撃
STEP

言語とタイムゾーンの設定

言語とタイムゾーンを設定します。

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
STEP

静的ファイルのURL設定

先頭あたりに、osをimportして、最後から5行目当たりにSTATIC_URLとSTATIC_ROOTの設定を記述します。

import os //先頭当たりに追加
.....
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Djangoプロジェクトの設定

STEP

静的ファイルの収集

python manage.py collectstatic
Pythonのファイルの収集について

PythonでWebアプリケーションを開発する際、画像やJavaScriptファイルなど、プログラムが動かす必要のない静的ファイルを扱うことは避けられません。これらのファイルを効率的に管理し、Webサーバーからアクセスできるようにするために、静的ファイルの収集という仕組みが用意されています。

収集のメリット

静的ファイルの収集には、以下のメリットがあります。

  • ファイル管理の簡便化: アプリの各ディレクトリに散らばっていた静的ファイルを、一箇所に集めて整理することで、管理が容易になります。
  • 開発環境と本番環境の統一: 開発環境と本番環境で同じ場所に静的ファイルを置くことで、環境間の差異を減らし、移行作業を簡略化できます。
  • バージョン管理の効率化: 静的ファイルをバージョン管理システムで管理することで、ファイルの変更履歴を簡単に追跡できます。
  • キャッシュ機能によるパフォーマンス向上: Webサーバーで静的ファイルをキャッシュすることで、ユーザーのブラウザへのダウンロード時間を短縮し、アプリの動作を高速化できます。

Djangoでの収集方法

Djangoでは、以下の2つの設定を使って静的ファイルを収集できます。

  1. STATIC_ROOT 設定: 収集された静的ファイルを置く場所を指定します。
    • 例:/var/www/static/
  2. staticfiles_dirs 設定: 収集対象となる静的ファイルのディレクトリを指定します。
    • 例:
staticfiles_dirs = [
    '/path/to/app1/static/',
    '/path/to/app2/static/',
]

収集の実行

静的ファイルの収集は、python manage.py collectstatic コマンドを実行することで実行できます。

このコマンドを実行すると、STATIC_ROOT 設定で指定された場所に、staticfiles_dirs 設定で指定されたディレクトリ内のすべてのファイルが収集されます。

開発環境と本番環境

開発環境では、STATIC_ROOT 設定で指定された場所に直接ファイルを置いて、開発サーバーでアクセスすることができます。

一方、本番環境では、Webサーバーの設定を変更して、収集されたファイルにアクセスできるようにする必要があります。

具体的には、以下のような設定が必要です。

  • Nginxの場合:
location /static/ {
    alias /var/www/static/;
}
  • Apacheの場合:
DocumentRoot /var/www/static/

その他の注意点

  • 静的ファイルは通常、static という名前のディレクトリに置かれます。
  • collectstatic コマンドは、デバッグモードで実行すると、ファイルの変更を監視し、自動的に収集されます。
  • 静的ファイルのURLは、STATIC_URL 設定で指定できます。
  • ファイル名の衝突を防ぐために、各アプリのstaticディレクトリ内に固有のファイル名を付けることを推奨します。

まとめ

静的ファイルの収集は、PythonでWebアプリケーションを開発する際に、ファイル管理とパフォーマンス向上のために必須の技術です。上記の内容を参考に、Djangoプロジェクトで静的ファイルを効率的に管理しましょう。

STEP

管理ユーザーの初期設定

python manage.py createsuperuser

ユーザー名、メールアドレス、パスワードを設定します。

DjangoのAdmin機能について

DjangoのAdmin機能は、Djangoプロジェクトの管理画面を提供する強力なツールです。この機能を使えば、モデルの追加、編集、削除、ユーザー管理、サイト設定の変更など、様々な操作をブラウザベースのインターフェースで行うことができます。

Admin機能の利点

  • 直感的な操作性: コードを書かずに、ブラウザ上で操作できるため、初心者でも簡単に使いこなすことができます。
  • 効率的なデータ管理: モデルの CRUD 操作をまとめて行うことができ、データ管理を効率化できます。
  • 強力なフィルタリング機能: データを絞り込んで検索することができ、目的のデータを見つけやすくなります。
  • 関連データの参照: モデル間の関連性を簡単に確認できます。
  • ユーザー管理: ユーザーの作成、編集、削除、権限設定などを行うことができます。
  • サイト設定: サイト名、ロゴ、言語など、サイトの設定を変更できます。
  • ログ閲覧: アプリケーションの動作ログを閲覧できます。
  • カスタマイズ性: 独自の管理画面を作成することができます。

Admin機能の利用方法

  1. プロジェクトの設定: INSTALLED_APPS 設定に 'django.contrib.admin' を追加します。
  2. モデルの登録: admin.py ファイルで、管理画面に表示したいモデルを登録します。
  3. URL設定: urls.py ファイルで、管理画面へのURLパターンを設定します。
  4. アクセス: ブラウザで http://localhost:8000/admin/ にアクセスすると、管理画面が表示されます。

Admin機能のカスタマイズ

  • モデル管理画面のカスタマイズ: ModelAdmin クラスを継承したクラスを作成することで、モデル管理画面の表示や編集機能をカスタマイズできます。
  • アクションの追加: admin_actions デコレータを使って、管理画面に独自のアクションを追加できます。
  • フィルターの追加: ListFilter クラスを継承したクラスを作成することで、管理画面に独自のフィルターを追加できます。

その他の注意点

  • Admin機能は開発環境でのみ使用し、本番環境ではアクセスできないようにする必要があります。
  • Admin機能は強力なツールですが、使い方を誤るとセキュリティリスクにつながる可能性があります。
STEP

データベースマイグレーションの実行

python manage.py migrate
自動生成されるテーブルについて

Djangoでpython manage.py createsuperuserコマンドを実行した後にpython manage.py migrateを実行すると、以下のテーブルが作成されます。

1. 認証関連のテーブル

  • auth_user: ユーザー情報
  • auth_group: グループ情報
  • auth_permission: 権限情報
  • auth_token: 認証トークン
  • auth_user_groups: ユーザーとグループの紐付け
  • auth_user_user_permissions: ユーザーと権限の紐付け

2. セッション関連のテーブル

  • sessions: セッション情報

3. コンテンツタイプ関連のテーブル

  • content_types: コンテンツタイプ情報

4. Django管理画面関連のテーブル

  • django_admin_log: 管理画面の操作ログ

5. その他

  • migrations: マイグレーション履歴

詳細なテーブル名の確認方法:

  1. python manage.py showmigrations コマンドを実行します。
  2. 各アプリのマイグレーションファイルを確認します。

マイグレーションファイルの場所:

  • プロジェクト名/migrations/ ディレクトリ

マイグレーションファイル内のテーブル名:

  • operations 変数に、作成されるテーブル名のリストが含まれています。

Gunicorn(ジーユニコーン)の設定

STEP

Gunicornのインストール

pip install gunicorn
Gunicornとは

PythonのGunicornを分かりやすく解説

Gunicornは、PythonでWebアプリを簡単に実行できる、高速で便利なWebサーバーです。FlaskやDjangoなどのフレームワークと組み合わせて、様々なアプリを動かすことができます。

Gunicornの利点

  • 速い: 複数の作業員を同時に働かせることで、サクサク処理できます。
  • 使いやすい: コマンドや設定ファイルで簡単に操作できます。
  • 豊富な機能: 静的ファイル配信、ログ記録、圧縮など、便利な機能が揃っています。
  • 安定性: 長年開発されてきた、信頼できるサーバーです。

Gunicornの始め方

Gunicornは、pipコマンドでインストールできます。

pip install gunicorn

Gunicornの実行は、以下のコマンドです。

gunicorn <WSGIアプリケーション>

例:Flaskアプリの場合

gunicorn app:app

上記は、app.pyファイルのappというFlaskアプリをGunicornで動かします。

Gunicornのログ

Gunicornは、ログファイルに記録できます。ファイル名は --log-file オプションで指定できます。

gunicorn --log-file gunicorn.log app:app

上記は、ログを gunicorn.log ファイルに記録します。

GunicornとuWSGI

Gunicornは、uWSGIと組み合わせて使うこともできます。uWSGIは、WSGIサーバーとアプリサーバーの両方の機能を持つツールです。

uWSGIとGunicornを組み合わせることで、さらに高速で機能豊富なサーバーになります。

STEP

アプリケーションのテスト起動

Gunicorn を使って Django アプリケーションを起動します(テスト用)

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
STEP

systemdサービスファイルの作成

Gunicorn を systemd サービスとして実行できるようにします。これにより、サーバーの起動時に自動で Django アプリケーションが起動するようになります。

sudo vim /etc/systemd/system/gunicorn.service

以下の内容を記述します。

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/django
ExecStart=/var/www/django/myvenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/var/www/django/myproject.sock myproject.wsgi:application

[Install]
WantedBy=multi-user.target
STEP

Gunicornサービスの起動

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Nginxの設定

STEP

設定ファイルの作成

sudo vim /etc/nginx/sites-available/django

下記内容を記述します。

server {
    listen 80;
    server_name django.winroad.blog;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /var/www/django/staticfiles/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/django/myproject.sock;
    }
}
STEP

シンボリックリンクの作成

シンボリックリンクを作成して、サイトを有効にします。

sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled
STEP

Nginxのテスト

Nginx の設定をテストして、エラーがないことを確認します。

sudo nginx -t
STEP

Nginxの再起動

最後に、Nginx を再起動します。

sudo systemctl restart nginx

SSL証明書の設定

STEP

certbotのインストール

certbotをインストールしていない場合は、インストールします。

sudo snap install --classic certbot
STEP

SSL証明書の作成

sudo certbot --nginx -d django.winroad.blog

下記の内容に自動的に書き換わっているはずです。

server {
    server_name django.winroad.blog

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /var/www/django/staticfiles/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/django/myproject.sock;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/django.winroad.blog/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/django.winroad.blog/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = django.winroad.blog) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name django.winroad.blog;
    return 404; # managed by Certbot
}

最後の設定

STEP

ディレクトリオーナーの変更

アプリケーションから、/var/www/django以下のファイルがアクセスできるようにディレクトリのオーナーを変更します。

sudo chown -R www-data:www-data /var/www/django
STEP

最終確認

最後に、指定のドメイン(今回は https://django.winroad.blog)にアクセスして、djangoのトップページが表示されたら、OKです。

STEP

管理サイトの確認

又、下記の管理画面(https://django.winroad.blog/admin)が表示されるかどうかも確認してください。先ほど作成した管理ユーザーの名前とパスワードでアクセスできたら、OKです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次