VPSサーバーのubuntu上にPythonのWebフレームワークのDjangoをインストールして、Nginxで起動するように設定してみたいと思います。
前準備
VPSサーバー環境
- OS:ubuntu22.04
- Webサーバー:Nginx18.0
- DB:MariaDB10.6.16
- Python3.10.12
- pip22.0.2
開発ツールのインストール
事前に下記の開発ツールをインストールします。
sudo apt install python3-dev default-libmysqlclient-dev build-essential
sudo apt install pkg-config
sudo apt install libmariadb-dev
前提条件
説明の都合上、下記内容で記述しますので、各自の環境に合わせて変更してください。
- プロジェクトディレクトリ名:django
- ドメイン名:django.winroad.blog
- プロジェクト名:myproject
Djangoプロジェクトのセットアップ
プロジェクトディレクトリの作成
sudo mkdir -p /var/www/django
sudo chown $USER:$USER /var/www/django
cd /var/www/django
仮想環境の作成とアクティベート
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
コマンドを実行すると、システム環境にライブラリがインストールされます。 - 仮想環境を削除すると、その仮想環境にインストールされていたライブラリもすべて削除されます。
Djangoのインストール
pip install django
Djangoプロジェクトの作成
django-admin startproject myproject .
※最後のドットを忘れずに!
データベースの設定
mysqlclientのインストール
pip install mysqlclient
MariaDBを起動
sudo mysql -u root -p
データベースの作成
CREATE DATABASE your_db_name;
ユーザーの作成
CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_db_password';
ユーザーへの権限付与
GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_db_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
settings.pyの編集
settings.pyを開く
vim myproject/settings.py
データベースの設定
データベース設定をMariaDBに合わせます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost',
'PORT': '',
}
}
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.com
と example.com
からのアクセスのみ許可されます。
設定時の注意点
- 開発中は
ALLOWED_HOSTS = ['*']
と設定することもありますが、本番環境では必ず許可するサイトを具体的に記述してください。 - ホスト名を変更した場合は、ALLOWED_HOSTSの設定も変更する必要があります。
- ワイルドカード(*)はセキュリティリスクがあるので、できるだけ使用しないようにしましょう。
まとめ
ALLOWED_HOSTSは、Djangoアプリの安全性を守るために必要な設定です。設定方法は簡単なので、忘れずに設定しましょう。
補足
- ホストヘッダーインジェクション攻撃:悪意のあるユーザーが偽のホスト名を設定して、アプリを不正操作する攻撃
- CSRF攻撃:ユーザーの操作を偽装して、不正なリクエストを実行する攻撃
言語とタイムゾーンの設定
言語とタイムゾーンを設定します。
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
静的ファイルのURL設定
先頭あたりに、osをimportして、最後から5行目当たりにSTATIC_URLとSTATIC_ROOTの設定を記述します。
import os //先頭当たりに追加
.....
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Djangoプロジェクトの設定
静的ファイルの収集
python manage.py collectstatic
Pythonのファイルの収集について
PythonでWebアプリケーションを開発する際、画像やJavaScriptファイルなど、プログラムが動かす必要のない静的ファイルを扱うことは避けられません。これらのファイルを効率的に管理し、Webサーバーからアクセスできるようにするために、静的ファイルの収集という仕組みが用意されています。
収集のメリット
静的ファイルの収集には、以下のメリットがあります。
- ファイル管理の簡便化: アプリの各ディレクトリに散らばっていた静的ファイルを、一箇所に集めて整理することで、管理が容易になります。
- 開発環境と本番環境の統一: 開発環境と本番環境で同じ場所に静的ファイルを置くことで、環境間の差異を減らし、移行作業を簡略化できます。
- バージョン管理の効率化: 静的ファイルをバージョン管理システムで管理することで、ファイルの変更履歴を簡単に追跡できます。
- キャッシュ機能によるパフォーマンス向上: Webサーバーで静的ファイルをキャッシュすることで、ユーザーのブラウザへのダウンロード時間を短縮し、アプリの動作を高速化できます。
Djangoでの収集方法
Djangoでは、以下の2つの設定を使って静的ファイルを収集できます。
STATIC_ROOT
設定: 収集された静的ファイルを置く場所を指定します。- 例:
/var/www/static/
- 例:
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プロジェクトで静的ファイルを効率的に管理しましょう。
管理ユーザーの初期設定
python manage.py createsuperuser
ユーザー名、メールアドレス、パスワードを設定します。
DjangoのAdmin機能について
DjangoのAdmin機能は、Djangoプロジェクトの管理画面を提供する強力なツールです。この機能を使えば、モデルの追加、編集、削除、ユーザー管理、サイト設定の変更など、様々な操作をブラウザベースのインターフェースで行うことができます。
Admin機能の利点
- 直感的な操作性: コードを書かずに、ブラウザ上で操作できるため、初心者でも簡単に使いこなすことができます。
- 効率的なデータ管理: モデルの CRUD 操作をまとめて行うことができ、データ管理を効率化できます。
- 強力なフィルタリング機能: データを絞り込んで検索することができ、目的のデータを見つけやすくなります。
- 関連データの参照: モデル間の関連性を簡単に確認できます。
- ユーザー管理: ユーザーの作成、編集、削除、権限設定などを行うことができます。
- サイト設定: サイト名、ロゴ、言語など、サイトの設定を変更できます。
- ログ閲覧: アプリケーションの動作ログを閲覧できます。
- カスタマイズ性: 独自の管理画面を作成することができます。
Admin機能の利用方法
- プロジェクトの設定:
INSTALLED_APPS
設定に'django.contrib.admin'
を追加します。 - モデルの登録:
admin.py
ファイルで、管理画面に表示したいモデルを登録します。 - URL設定:
urls.py
ファイルで、管理画面へのURLパターンを設定します。 - アクセス: ブラウザで
http://localhost:8000/admin/
にアクセスすると、管理画面が表示されます。
Admin機能のカスタマイズ
- モデル管理画面のカスタマイズ:
ModelAdmin
クラスを継承したクラスを作成することで、モデル管理画面の表示や編集機能をカスタマイズできます。 - アクションの追加:
admin_actions
デコレータを使って、管理画面に独自のアクションを追加できます。 - フィルターの追加:
ListFilter
クラスを継承したクラスを作成することで、管理画面に独自のフィルターを追加できます。
その他の注意点
- Admin機能は開発環境でのみ使用し、本番環境ではアクセスできないようにする必要があります。
- Admin機能は強力なツールですが、使い方を誤るとセキュリティリスクにつながる可能性があります。
データベースマイグレーションの実行
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
: マイグレーション履歴
詳細なテーブル名の確認方法:
python manage.py showmigrations
コマンドを実行します。- 各アプリのマイグレーションファイルを確認します。
マイグレーションファイルの場所:
プロジェクト名/migrations/
ディレクトリ
マイグレーションファイル内のテーブル名:
operations
変数に、作成されるテーブル名のリストが含まれています。
Gunicorn(ジーユニコーン)の設定
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を組み合わせることで、さらに高速で機能豊富なサーバーになります。
アプリケーションのテスト起動
Gunicorn を使って Django アプリケーションを起動します(テスト用)
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
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
Gunicornサービスの起動
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
Nginxの設定
設定ファイルの作成
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;
}
}
シンボリックリンクの作成
シンボリックリンクを作成して、サイトを有効にします。
sudo ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled
Nginxのテスト
Nginx の設定をテストして、エラーがないことを確認します。
sudo nginx -t
Nginxの再起動
最後に、Nginx を再起動します。
sudo systemctl restart nginx
SSL証明書の設定
certbotのインストール
certbotをインストールしていない場合は、インストールします。
sudo snap install --classic certbot
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
}
最後の設定
ディレクトリオーナーの変更
アプリケーションから、/var/www/django以下のファイルがアクセスできるようにディレクトリのオーナーを変更します。
sudo chown -R www-data:www-data /var/www/django
最終確認
最後に、指定のドメイン(今回は https://django.winroad.blog)にアクセスして、djangoのトップページが表示されたら、OKです。
管理サイトの確認
又、下記の管理画面(https://django.winroad.blog/admin)が表示されるかどうかも確認してください。先ほど作成した管理ユーザーの名前とパスワードでアクセスできたら、OKです。
コメント