Djangoインストール · 8 min read · Oct 13, 2025

Rocky Linux 9にPostgres、Nginx、Gunicornを使ってDjangoをインストールする方法

Djangoは、動的なウェブサイトやアプリケーションを開発するために使用されるPythonフレームワークです。MVC(Model-View-Controller)アーキテクチャに従っています。Djangoを使用すると、基盤となるタスクのほとんどが処理されるため、アプリケーションの開発プロセスが加速します。

このチュートリアルでは、Rocky Linux 9サーバーにDjangoフレームワークをインストールする方法を学びます。また、デモプロジェクトを作成し、テストします。

前提条件

  • Rocky Linux 9を実行しているサーバー。

  • sudo権限を持つ非rootユーザー。

  • サーバーを指す完全修飾ドメイン名(FQDN)。ここでは、ドメイン名としてdjango.example.comを使用します。

  • すべてが更新されていることを確認します。 $ sudo dnf update

  • 基本的なユーティリティパッケージをインストールします。いくつかはすでにインストールされているかもしれません。 $ sudo dnf install wget curl nano unzip yum-utils -y

  • SELinuxが無効になっていること。

ステップ1 - ファイアウォールの設定

最初のステップはファイアウォールの設定です。Rocky LinuxはFirewalldファイアウォールを使用します。ファイアウォールの状態を確認します。

$ sudo firewall-cmd --state
running

ファイアウォールは異なるゾーンで機能し、パブリックゾーンがデフォルトで使用されます。ファイアウォールでアクティブなすべてのサービスとポートをリストします。

$ sudo firewall-cmd --permanent --list-services

次の出力が表示されるはずです。

cockpit dhcpv6-client ssh

Djangoは機能するためにHTTPおよびHTTPSポートが必要です。それらを開きます。

$ sudo firewall-cmd --add-service=http --permanent
$ sudo firewall-cmd --add-service=https --permanent

変更を適用するためにファイアウォールを再読み込みします。

$ sudo firewall-cmd --reload

ステップ2 - PostgreSQLとユーティリティのインストール

Rocky Linux 9には古いバージョンのPostgreSQLが付属しています。このチュートリアルではPostgres 14をインストールします。

PostgreSQLのリポジトリRPMをインストールします。

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

PostgreSQL 14サーバーをインストールします。

$ sudo dnf install -y postgresql14-server postgresql14-contrib postgresql14-devel python3-psycopg2

データベースを初期化します。

$ sudo /usr/pgsql-14/bin/postgresql-14-setup initdb

PostgreSQLサービスを有効にして開始します。

$ sudo systemctl enable postgresql-14 --now

サービスの状態を確認します。

$ sudo systemctl status postgresql-14
? postgresql-14.service - PostgreSQL 14 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-14.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2022-09-12 01:17:24 UTC; 2s ago
       Docs: https://www.postgresql.org/docs/14/static/
    Process: 87995 ExecStartPre=/usr/pgsql-14/bin/postgresql-14-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 88000 (postmaster)
      Tasks: 8 (limit: 5915)
     Memory: 16.5M
        CPU: 60ms
     CGroup: /system.slice/postgresql-14.service
             ??88000 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
             ??88001 "postgres: logger "
             ??88003 "postgres: checkpointer "
             ??88004 "postgres: background writer "
             ??88005 "postgres: walwriter "
             ??88006 "postgres: autovacuum launcher "
             ??88007 "postgres: stats collector "
             ??88008 "postgres: logical replication launcher "

Sep 12 01:17:24 board.example.com systemd[1]: Starting PostgreSQL 14 database server...

Djangoが動作するために必要な追加のユーティリティをインストールします。

$ sudo dnf install -y python3 python3-devel python3-pip gcc

pg_configが見つからないという将来のエラーを解決するために、PostgreSQLのbinフォルダーへのパスを追加する必要があります。.bashrcファイルを編集のために開きます。

$ nano ~/.bashrc

ファイルの最後に次の行を追加します。

export PATH=$PATH:/usr/pgsql-14/bin 

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

ステップ3 - PostgreSQLの設定

PostgreSQLシェルにログインします。

$ sudo -i -u postgres psql

Django用の新しいデータベースを作成します。

postgres=# CREATE DATABASE djangoapp;

強力なパスワードを持つ新しいデータベースユーザーを作成します。

postgres=# CREATE USER djangouser WITH ENCRYPTED PASSWORD 'dbpassword';

データベースを使用するためのユーザーの権限を付与します。

postgres=# GRANT ALL PRIVILEGES ON DATABASE djangoapp TO djangouser;

Postgresシェルを終了します。

postgres=# \q

ステップ4 - Djangoのインストール

Djangoをインストールする方法はいくつかあります。どの方法が最適かは、開発環境をどのように構成したいかやニーズによって異なります。各方法にはそれぞれの利点と欠点があります。これらの方法をすべて見ていきましょう。

pipを使用してインストール

これはDjangoをインストールする最も一般的な方法です。推奨される方法は、仮想Python環境を作成することです。これにより、システムに影響を与えずにPythonパッケージをインストールできます。

デモプロジェクトディレクトリを作成します。

$ mkdir ~/sampleproject
$ cd ~/sampleproject

次のコマンドを使用して仮想環境を作成します。sample_envを仮想環境の名前に置き換えます。

$ python3 -m venv sample_env

これにより、プロジェクトディレクトリ内にポータブルなPythonとpipのバージョンがインストールされます。プロジェクトにパッケージをインストールするには、次のコマンドを使用して環境をアクティブにする必要があります。

$ source sample_env/bin/activate

シェルプロンプトが仮想環境を反映するように変更されます。

(sample_env) navjot@django:~/sampleproject$

仮想環境がアクティブになったので、pipを使用してDjangoをインストールします。次のコマンドを実行してDjangoをインストールします。

(sample_env) $ pip install django

インストールを確認します。

(sample_env) $ django-admin --version
4.1.2

プロジェクトの要件に応じて、次のように異なるバージョンのDjangoをインストールできます。

(sample_env) $ pip install django==3.2.1

インストールを確認します。

(sample_env) $ django-admin --version
3.2.1

この方法では、Rocky Linuxリポジトリから取得したバージョンよりも新しいDjangoがインストールされることがわかります。

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

(sample_env) $ deactivate

開発版をインストール

pipを使用してDjangoの開発版をインストールすることもできます。このために、DjangoのGithubリポジトリから開発版を取得します。

次のコマンドを使用して~/django-devディレクトリにリポジトリをクローンします。

$ git clone https://github.com/django/django ~/django-dev

新しく作成されたディレクトリに移動します。

$ cd ~/django-dev

仮想環境を作成します。

$ python3 -m venv dev_django_env

環境をアクティブにします。

$ source dev_django_env/bin/activate

pipを使用してDjangoをインストールします。-eフラグは、バージョン管理からインストールする場合に必要な編集可能モードでインストールします。

(dev_django_dev) $ pip install -e ~/django-dev

インストールを確認します。

(dev_django_dev) $ django-admin --version
4.2.dev20221012095013

ここでのバージョンは最新の開発版です。Djangoの開発版は本番環境には役立ちません。

ステップ5 - サンプルプロジェクトを作成

サンプルDjangoプロジェクトを構築しましょう。サンプルプロジェクト用のディレクトリを作成します。

$ mkdir ~/dj-sample
$ cd ~/dj-sample

Python仮想環境を作成します。

$ python3 -m venv sample_proj

環境をアクティブにします。

$ source sample_proj/bin/activate

Wheelパッケージをインストールします。

(sample_proj) $ pip install wheel

Djangoと必要なパッケージをインストールします。

(sample_proj) $ pip install django psycopg2 psycopg2-binary

プロジェクトを構築するには、startprojectコマンドを使用する必要があります。このコマンドは、次の内容を含む別のディレクトリを作成します。

  • Django特有のタスクを管理するために使用される管理スクリプトmanage.py
  • プロジェクトコードを含む、プロジェクトと同じ名前のディレクトリ。

現在の作業ディレクトリにプロジェクトディレクトリを作成します。そのためには、次のコマンドの最後にドット(.)を使用します。

(sample_proj) $ django-admin startproject demoproject .

DjangoはSECRET_KEY変数を使用して暗号署名を提供します。インストール中にデフォルト値が生成されます。これを安全な値に置き換える必要があります。次のコマンドを実行してキーを生成し、後でコピーします。

(sample_proj) $ python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'

次のようなキーを含む出力が得られます。

wm#dzb^ymuo3s3tza=f5cx^kan!$4sch1!b-q=v%)=d0pb(jqf

最初のステップはプロジェクト設定を調整することです。設定ファイルを編集のために開きます。

(sample_proj) $ nano demoproject/settings.py

生成したキーでSECRET_KEY変数の現在の値を置き換えます。

SECRET_KEY = 's)3m=4s&!a=p#brttcqu@1s$8(z6e+u8(^tkpw28qyj0t#8ku2'

DATABASESセクションの設定を次のように変更します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'DATABASE_DB',
        'USER': 'DATABASE_USER',
        'PASSWORD': 'DATABASE_PASSWORD',
        'HOST': 'DATABASE_HOST',
        'PORT': 'DATABASE_PORT',
    },
}

次に、ファイルの下部に静的ファイルの場所に関する設定を追加します。これはNginxが機能し、これらのファイルのリクエストを処理するために重要です。次の行をSTATIC_URL変数の上に追加します。

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

STATIC_ROOT変数はosモジュールを使用しているため、デフォルトではインポートされていないので、インポートする必要があります。次の行をfrom pathlib import Pathの上に追加します。

import os

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

データベース設定を確認します。

(sample_proj) $ python manage.py check --database default

次の出力が得られるはずです。

System check identified no issues (0 silenced).

次に、migrateコマンドを使用してデータベースを移行する必要があります。Djangoのマイグレーションは、モデルに加えた変更をデータベーススキーマに伝播させます。

(sample_proj) $ python manage.py makemigrations
(sample_proj) $ python manage.py migrate

次の出力が得られます。

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

次に、Djangoの管理インターフェースにアクセスするための管理ユーザーを作成します。

(sample_proj) $ python manage.py createsuperuser

ユーザー名、メールアドレス、パスワードを求められます。

Username (leave blank to use 'navjot'):
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.

静的ファイルを静的ディレクトリにコピーします。プロンプトが表示されたらyesと入力します。

(sample_proj) $ python manage.py collectstatic
130 static files copied to '/home/navjot/dj-sample/static'.

ステップ6 - 開発サーバーのテスト

アプリケーションをテストする時が来ました。そのためには、Django設定のALLOWED_HOSTSディレクティブを変更する必要があります。このディレクティブは、Djangoアプリケーションへのアクセスが許可されているIPアドレスとドメイン名のリストを定義します。

次のコマンドを使用して設定ファイルを開きます。

(sample_proj) $ nano demoproject/settings.py

次のエントリを見つけます。

ALLOWED_HOSTS = []

角括弧内にサーバーのIPアドレスを入力します。各エントリは引用符で囲む必要があり、複数のエントリはカンマで区切る必要があります。www.example.comを入力すると正確に一致します。しかし、.example.comexample.comwww.example.com、およびexample.comの他のサブドメインと一致します。したがって、ドメイン名を一致させるためにピリオドを使用することをお勧めします。

ALLOWED_HOSTS = ['']

サーバーに一致させるためにIPアドレスを使用しました。Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

開発サーバーをテストする前に、Djangoが動作するようにファイアウォールを設定する必要があります。Djangoはデフォルトでポート8000を使用します。Uncomplicated Firewall(UFW)を使用してポートを開きます。

(sample_proj) $ sudo firewall-cmd --add-port=8000/tcp --permanent
(sample_proj) $ sudo firewall-cmd --reload

開発サーバーを開始します。

(sample_proj) $ python manage.py runserver 0.0.0.0:8000

ブラウザでURL http://:8000を開くと、次の画面が表示されます。

Django Homepage

管理インターフェースには、URL http://:8000/admin/に従ってアクセスでき、次のログイン画面が表示されます。

Django Login Page

以前に作成した資格情報を入力して、以下の管理パネルにログインします。

Django Admin Panel

デモプロジェクトが終了したら、ターミナルでCtrl + Cを押してサーバーを閉じることができます。

ステップ7 - Gunicornのインストールとテスト

nohupを使用して永続的なDjangoサーバーを実行

これまでのところ、Djangoのサービスは永続的ではありません。サービスを永続的にするためには、2つの方法があります。最初の方法は、nohupユーティリティを使用することです。nohupはPOSIXコマンドで、no hang upを意味します。ユーザーがログアウトしても停止しないようにコマンドを実行するために使用されます。

ターミナルからサーバーを終了したことを確認するために、Ctrl + Cを押します。

次のコマンドを実行してDjangoの開発サーバーを実行します。

(sample_proj) $ nohup python manage.py runserver 0.0.0.0:8000 &

これで、Djangoサーバーは手動で終了するまで実行され続けます。このコマンドはプロセスIDを提供し、別のコマンドを出力します。

[1] 42595
(sample_proj) $ nohup: ignoring input and appending output to 'nohup.out'
^C

終了するにはCtrl + Cを押します。元のDjangoサーバーは実行され続けます。ブラウザでURLを開いて確認できます。

終了したら、プロセスを終了する必要があります。nohupコマンドは1つのプロセスIDを提供します。しかし、実際には2つのプロセスが実行されています。両方のプロセスのIDを見つけるには、次のコマンドを実行します。

(sample_proj) $ ps aux | grep manage.py
navjot    153474  1.6  3.9  46264 39016 pts/0    S    04:15   0:00 python manage.py runserver 0.0.0.0:8000
navjot    153475  3.0  4.4 196060 43500 pts/0    Sl   04:15   0:00 /home/navjot/dj-sample/sample_proj/bin/python manage.py runserver 0.0.0.0:8000
navjot    153483  0.0  0.2   6420  2248 pts/0    S+   04:15   0:00 grep --color=auto manage.py

ご覧のとおり、ID 153474のプロセスとID 153475のプロセスの2つが実行されています。

次のコマンドを実行して、上記で取得したプロセスIDを使用してサーバーを終了します。

(sample_proj) $ sudo kill -9 153474 153475

Gunicornのインストール

永続的なDjangoサーバーを実行するための2番目の方法は、GunicornとNginxウェブサーバーをインストールする必要があります。GunicornはPython WSGI HTTPサーバーです。Djangoアプリケーションとインターフェースを持ち、NginxはGunicornへのリバースプロキシとして機能します。この方法には、Nginxを使用することによるセキュリティとパフォーマンスの利点があります。

Gunicornをインストールします。

(sample_proj) $ pip install gunicorn

進む前に、プロジェクトを提供するGunicornの能力をテストする必要があります。次のコマンドを実行してGunicornを実行します。

(sample_proj) $ gunicorn --bind 0.0.0.0:8000 demoproject.wsgi:application

これにより、GunicornはDjangoが実行されていたのと同じインターフェースで起動します。確認するために、ブラウザでURL http://:8000を開くと、同じDjangoホームページが表示されます。これは、Gunicornが正常に実行されていることを意味します。

テストが終了したら、ターミナルでCtrl + Cを押してGunicornを終了します。

仮想環境を非アクティブにして、通常のシェルに戻ります。

(sample_proj) $ deactivate

ステップ8 - Gunicornのソケットとサービスファイルを作成

最初のステップは、Gunicornソケットファイルを作成することです。Gunicornソケットはブート時に作成され、接続をリッスンします。接続が発生すると、systemdは自動的にGunicornプロセスを開始して処理します。

Gunicornソケットファイルを作成して編集のために開きます。

$ sudo nano /etc/systemd/system/gunicorn.socket

次のコードを貼り付けます。

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

次に、Gunicornサービスファイルを作成して編集のために開きます。

$ sudo nano /etc/systemd/system/gunicorn.service

次のコードを貼り付けます。

[Unit]
Description=django gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=navjot
Group=nginx
WorkingDirectory=/home/navjot/dj-sample
ExecStart=/home/navjot/dj-sample/sample_proj/bin/gunicorn \
          -t 3000 \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          demoproject.wsgi:application -w 2

[Install]
WantedBy=multi-user.target

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。navjotをシステムユーザー名に置き換えます。nginxグループは、NginxサーバーがDjangoと通信できるようにします。

システムデーモンをリロードして、systemdファイルを更新します。

$ sudo systemctl daemon-reload

Gunicornソケットファイルを有効にして開始します。

$ sudo systemctl start gunicorn.socket
$ sudo systemctl enable gunicorn.socket

Gunicornソケットの状態を確認します。

$ sudo systemctl status gunicorn.socket

次のような出力が得られます。

? gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: disabled)
     Active: active (listening) since Thu 2022-10-13 04:19:28 UTC; 14s ago
      Until: Thu 2022-10-13 04:19:28 UTC; 14s ago
   Triggers: ? gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
     CGroup: /system.slice/gunicorn.socket

Oct 13 04:19:28 django.nspeaks.xyz systemd[1]: Listening on gunicorn socket.

Gunicornサービスはまだ実行されていないことを確認できます。

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
TriggeredBy: ? gunicorn.socket

ソケットアクティベーションメカニズムをテストするために、次のコマンドを実行します。

$ curl --unix-socket /run/gunicorn.sock localhost

ターミナルにDjangoホームページのHTML出力が表示されます。これにより、Gunicornがアプリケーションを提供するために起動します。サービスの状態を再度確認すると、現在は実行中であることがわかります。

$ sudo systemctl status gunicorn.service
? gunicorn.service - django gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: disabled)
     Active: active (running) since Thu 2022-10-13 06:13:55 UTC; 1min 34s ago
TriggeredBy: ? gunicorn.socket
   Main PID: 157742 (gunicorn)
      Tasks: 4 (limit: 5915)
     Memory: 96.2M
        CPU: 1.198s
     CGroup: /system.slice/gunicorn.service
             ??157742 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
             ??157746 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
             ??157747 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
             ??157748 /home/navjot/dj-sample/sample_proj/bin/python3 /home/navjot/dj-sample/sample_proj/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock demoproject.wsgi:application -w 2
........

ステップ9 - Nginxのインストール

最後のステップは、Nginxをインストールして構成することです。Rocky Linuxには古いバージョンのNginxが付属しています。最新バージョンをインストールするために公式のNginxリポジトリをダウンロードする必要があります。

公式のNginxリポジトリを作成するために、/etc/yum.repos.d/nginx.repoファイルを作成して開きます。

$ sudo nano /etc/yum.repos.d/nginx.repo

次のコードを貼り付けます。

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

Nginxサーバーをインストールします。

$ sudo dnf install nginx -y

インストールを確認します。

$ nginx -v
nginx version: nginx/1.22.1

Nginxサーバーを有効にして開始します。

$ sudo systemctl enable nginx --now

サーバーの状態を確認します。

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
     Active: active (running) since Thu 2022-10-13 06:17:24 UTC; 1s ago
       Docs: http://nginx.org/en/docs/
    Process: 157900 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 157901 (nginx)
      Tasks: 2 (limit: 5915)
     Memory: 1.9M
        CPU: 18ms
     CGroup: /system.slice/nginx.service
             ??157901 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??157902 "nginx: worker process"

Oct 13 06:17:24 django.example.com systemd[1]: Starting nginx - high performance web server...

ステップ10 - SSLのインストール

これまでのところ、Djangoアプリケーションは平文のHTTP接続で提供されています。SSL証明書で保護することを強くお勧めします。このために、Snapdツールを使用してCertbotツールを使用します。これにはEPELリポジトリが必要です。

$ sudo dnf install epel-release

Snapdを使用してCertbotをインストールします。Snapdをインストールします。

$ sudo dnf install snapd

Snapサービスを有効にして開始します。

$ sudo systemctl enable snapd.socket --now

Snapdが機能するために必要なリンクを作成します。

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

コアSnapdリポジトリをインストールします。

$ sudo snap install core
$ sudo snap refresh core

Certbotをインストールします。

$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

証明書を生成します。次のコマンドはNginxを自動的に構成します。

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d django.example.com

上記のコマンドは、サーバーの/etc/letsencrypt/live/django.example.comディレクトリに証明書をダウンロードします。

Diffie-Hellmanグループ証明書を生成します。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

SSL更新が正常に機能しているかどうかを確認するために、プロセスのドライランを実行します。

$ sudo certbot renew --dry-run

エラーが表示されない場合は、すべて設定完了です。証明書は自動的に更新されます。

ステップ11 - Nginxの構成

/etc/nginx/conf.d/django-gunicorn.confファイルを作成して開きます。

$ sudo nano /etc/nginx/conf.d/django-gunicorn.conf

次のコードを貼り付けます。

# enforce HTTPS
server {
  listen 80 default_server;
  server_name django.example.com;
  return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name django.example.com;

    access_log  /var/log/nginx/django.access.log;
    error_log   /var/log/nginx/django.error.log;

    http2_push_preload on; # Enable HTTP/2 Server Push

    ssl_certificate /etc/letsencrypt/live/django.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/django.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/django.example.com/chain.pem;
    ssl_session_timeout 1d;

    # Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
    ssl_protocols TLSv1.2 TLSv1.3;

    # Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
    # prevent replay attacks.
    #
    # @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
    ssl_early_data on;

    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:50m;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    add_header X-Early-Data $tls1_3_early_data;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/navjot/dj-sample;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
  "~." $ssl_early_data;
  default "";
}

上記のファイル内のルート位置をサーバー上のディレクトリに置き換えます。

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

/etc/nginx/nginx.confファイルを開きます。

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf;の前に次の行を追加します。

server_names_hash_bucket_size  64;

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

Nginx構成を確認します。

$ sudo nginx -t

エラーが表示されない場合は、準備完了です。

ドメイン名をALLOWED_HOSTSディレクティブに追加する必要があります。settings.pyファイルを開きます。

$ nano ~/dj-sample/demoproject/settings.py

ALLOWED_HOSTS変数の値を変更します。

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

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

Gunicornソケットとサービスを再起動します。

$ sudo systemctl restart gunicorn.socket
$ sudo systemctl restart gunicorn.service

Nginxサーバーを再読み込みします。

$ sudo systemctl reload nginx

HTTPポートを開きます。もう使用しない場合は8000ポートを削除することもできます。

$ sudo firewall-cmd --remove-port=8000/tcp --permanent
$ sudo firewall-cmd --reload

URL http://django.example.comを開いて確認すると、Djangoホームページが表示されます。

結論

これで、Rocky Linux 9サーバーにDjangoをGunicornとNginxと共にインストールする方法を学んだチュートリアルが終了しました。また、Djangoプロジェクトのセキュリティを強化するためにSSL証明書もインストールしました。質問がある場合は、下のコメントに投稿してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。