Django + PostgreSQL + Apache2 のセットアップ
djangoをとりあえず使ってみる
とりあえず、djangoを使ってみるために、apache2が動いているサーバーに追加してみます。 サーバーは Ubuntu 20.04 LTS です。
Step 1: python3のインストール
venvで仮想環境下にインストールをしたいので、次のコマンドでインストールします。
sudo apt-get install python3-venv python3-pip
次に、仮想環境を任意の場所に作成します。あとで、othersの読み込みアクセスが必要になるので、
/home/user
以下ではない方がよいかもしれません。ここでは、/var/django/
を作成して
その下に作ることにします。
python3 -m venv env
source env/bin/activate
(env)$
この仮想環境下に、これからインストールします。 source env/bin/activate
で仮想環境に入ると、
プロンプトの前に(env)と環境名がつきます。
これからの手順は、この仮想環境下で行うようにします。
Step 2: Djangoのインストール
pip を使って、Djangoをインストールします。
python -m pip install Django
Step 3: apache2のmod_wsgiモジュールのインストール
apacheで、pythonを実行するモジュールである mod_wsgiモジュールをインストールします。
pipで仮想環境下にインストールしますが、追加でモジュールが必要になるので先に入れておきます。
sudo apt-get install apache2-dev python3-setuptools git
pip install mod_wsgi
インストールが済んだら、次のコマンドでパスを確認します。
mod_wsgi-express module-config
Step 4: PostgreSQLのインストール
デフォルトでDBがあるので要らないのですが、将来的に使うことを考えPostgreSQLをインストールします。
sudo apt install postgresql
psql --version
また、仮想環境下に、psycopg2
をインストールします。
pip install psycopg2-binary
Step 5: DBの作成
これからのテストプロジェクトで使うデータベースを作成してみます。
sudo -u postgres psql
test1という名前のデーターベースを作成します。
CREATE DATABASE test1;
データーベースにアクセスするユーザーを作成します。 ここでは django ユーザーとし、パスワードは pass とします。
CREATE USER django WITH PASSWORD 'pass';
ALTER ROLE django SET client_encoding TO 'utf8';
ALTER ROLE django SET default_transaction_isolation TO 'read committed';
ALTER ROLE django SET timezone TO 'Asia/Tokyo';
作成した後の3つの設定は、Djangoの推奨設定への対応とタイムゾーンです。
GRANT ALL PRIVILEGES ON DATABASE test1 TO django;
django ユーザーに、test1 データーベースへの接続権を与えます。
終了するには、\q
を入力します。
次に、認証方式をpeer認証からパスワードでの認証に変更します。
cd /etc/postgresql/12/main
sudo vim pg_hba.conf
バージョンのところは適宜読み替えてください。
ファイルの最後の方にある、local all all peer
の行を探し、peer
を
md5
に変更します。
# "local" is for Unix domain socket connections only
-local all all peer
+local all all md5
変更したら、サービスを再起動します。
sudo systemctl restart postgresql
接続できるか確認するには、
psql -U django -d test1
で接続します。設定したパスワードをプロンプトに対して入力します。
終了するには、\q
を入力します。
Step 6: Djangoプロジェクトを作成する
コードを置きたい場所に移動して、仮想環境下でプロジェクトを作成します。
django-admin startproject test1
カレントディレクトリに、test1
フォルダが作成されます。
その中に入って、test1/settings.py
という設定ファイルを修正します。
DATABASES = {
'default': {
- 'ENGINE': 'django.db.backends.sqlite3',
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
- 'NAME': BASE_DIR / 'db.sqlite3',
+ 'NAME': 'test1',
+ 'USER': 'django',
+ 'PASSWORD': 'pass',
+ 'HOST': 'localhost',
+ 'PORT': '',
}
}
プロジェクトの、manage.py
と同じディレクトリで、DBのマイグレーションを行います。
python manage.py makemigrations
python manage.py migrate
Step 7: スーパーユーザーの作成
スーパーユーザーを作成し、管理できるようにします。
プロジェクトの、manage.py
と同じディレクトリで、createsuperuser
を実行します。
いろいろと聞かれるので適当に回答します。
python manage.py createsuperuser
Step 8: 静的ファイルの公開
設定ファイルを修正します。test1/settings.py
を以下のようにします。
ALLOWED_HOSTS
に自分のホスト名か * を入れてアクセスできるようにします。
ファイルの適当な場所に、STATIC_ROOT
を加えます。
ALLOWED_HOSTS = ['*']
STATIC_ROOT = BASE_DIR / 'static'
次に、プロジェクトの、manage.py
と同じディレクトリで、collectstatic
を実行します。
python manage.py collectstatic
Step 9: apacheとdjangoを結ぶ
次のパス /etc/apache2/sites-available/django.conf
に新規ファイルを以下の内容で作成します。
LoadModule wsgi_module /var/django/env/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so
WSGIDaemonProcess ichir.ai python-home=/var/django/env python-path=/var/django/test1
WSGIProcessGroup ichir.ai
WSGIScriptAlias /test1 /var/django/test1/test1/wsgi.py process-group=ichir.ai
<Directory /var/django/test1/test1>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static /var/django/test1/static
<Directory /var/django/test1/static>
Require all granted
</Directory>
ここで、LoadModule wsgi_module
のパスと、WSGIPythonHome
のパスは、
mod_wsgi-express module-config
の出力結果を使います。パスは、環境に合わせて適宜読み替えてください。
次に、django.confを有効にします。
sudo a2ensite django
sudo systemctl restart apache2
Step 10: 管理画面にアクセスしてみる
ここまでの作業で、http(s)://example.com/test1/admin/ にアクセスすることで、管理画面が出るようになります。 先程設定したスーパーユーザーのアカウントでログインできるか確認してください。