DigitalOcean Managed DatabasesおよびSpacesを使用してスケーラブルなDjangoアプリをセットアップする方法

前書き

Djangoは強力なWebフレームワークであり、PythonアプリケーションまたはWebサイトを迅速に立ち上げるのに役立ちます。 object-relational_mapping[object-relational mapper、Python API、アプリケーション用のカスタマイズ可能な管理インターフェイスなど、いくつかの便利な機能が含まれています。 また、https://docs.djangoproject.com/en/2.1/topics/cache/ [キャッシュフレームワーク]が含まれており、https://docs.djangoproject.com/en/2.1/topics/httpを通じてクリーンなアプリの設計を促進します。 / urls / [URLディスパッチャ]およびhttps://docs.djangoproject.com/en/2.1/topics/templates/ [テンプレートシステム]。

すぐに使用できるDjangoには、テストおよびローカル開発用の最小限のWebサーバーが含まれていますが、実稼働ユースケース向けのより堅牢なサービスインフラストラクチャと組み合わせる必要があります。 Djangoは、静的ファイルリクエストとHTTPSリダイレクトを処理するNginx Webサーバーと、アプリを提供するhttps://gunicorn.org/[Gunicorn] WSGIサーバーでロールアウトされることがよくあります。

このガイドでは、JavascriptやCSSスタイルシートなどの静的ファイルをDigitalOcean Spacesにオフロードし、オプションで C ontent D elivery N etwork、またはCDNを使用してそれらを配信することにより、このセットアップを強化します。これらのファイルをエンドユーザーの近くに保存して、転送時間を短縮します。 また、DigitalOcean Managed PostgreSQL databaseをデータストアとして使用して、データレイヤーを簡素化し、スケーラブルなPostgreSQLデータベースを手動で構成する必要を回避します。

前提条件

このガイドを始める前に、次のものを用意しておく必要があります。

  • 基本的なファイアウォールと「+ sudo +」権限が設定された非ルートユーザーを備えた新しいUbuntu 18.04サーバーインスタンス。 Ubuntu 18.04での初期サーバー設定を実行して、これを設定する方法を学ぶことができます。

  • DigitalOceanが管理するPostgreSQLクラスター。 クラスターの作成方法については、DigitalOcean Managed Databases製品ドキュメントを参照してください。

  • Djangoプロジェクトの静的ファイルとこのスペースのアクセスキーのセットを保存するDigitalOceanスペース。 スペースの作成方法については、https://www.digitalocean.com/docs/spaces/how-to/create/ [スペースの作成方法]製品ドキュメントを参照し、スペースのアクセスキーの作成方法については、 https://www.digitalocean.com/docs/spaces/how-to/administrative-access/#access-keys [アクセスキーを使用したスペースへのアクセスの共有]を参照してください。

  • Nginxは、選択したドメイン名で動作するようにサーバーにインストール、保護、および構成されます。 Aレコードの設定およびhttps://letsencrypt.org/[Let’s Encrypt]を使用したNginxインストールのセキュリティ保護の詳細については、https://www.digitalocean.com/community/tutorials/how-to-secure-nginxをご覧ください。 -with-let-s-encrypt-on-ubuntu-18-04 [Ubuntu 18.04で暗号化してNginxを保護する方法]。

ステップ1-Ubuntuリポジトリからパッケージをインストールする

まず、必要なすべてのアイテムをUbuntuリポジトリからダウンロードしてインストールします。 Pythonパッケージマネージャーの `+ pip +`を使用して、後ほど追加のコンポーネントをインストールします。

最初にローカルの `+ apt +`パッケージインデックスを更新してから、パッケージをダウンロードしてインストールする必要があります。

このガイドでは、* Python 3 *でDjangoを使用します。 必要なライブラリをインストールするには、サーバーにログインして次を入力します。

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev curl postgresql-client

これにより、 + pip +、Gunicornのビルドに必要なPython開発ファイル、http://initd.org/psycopg/ [+ Pyscopg +] PostgreSQL Pythonアダプターのビルドに必要なlibpqヘッダーファイル、およびPostgreSQLコマンドがインストールされます。ラインクライアント。

パッケージのダウンロードとインストールを開始するように求められたら、「+ Y 」を押してから「 ENTER +」を押します。

次に、Djangoアプリで動作するようにデータベースを構成します。

ステップ2-PostgreSQLデータベースとユーザーの作成

次に、Djangoアプリケーションのデータベースとデータベースユーザーを作成します。

まず、https://cloud.digitalocean.com/ [クラウドコントロールパネル]から[データベース]に移動し、データベースをクリックして、クラスターの[接続パラメーター]を取得します。 クラスターのパラメーターを含む[接続の詳細]ボックスが表示されます。 これらに注意してください。

コマンドラインに戻り、これらの認証情報とインストールしたばかりの + psql + PostgreSQLクライアントを使用してクラスターにログインします。

psql -U  -h  -p  -d  -set=sslmode=require

プロンプトが表示されたら、Postgresユーザー名の横に表示されるパスワードを入力し、「+ ENTER +」を押します。

データベースを管理できるPostgreSQLプロンプトが表示されます。

まず、 `+ polls +`というプロジェクト用のデータベースを作成します。

CREATE DATABASE polls;

`+ polls +`データベースに切り替えることができます:

\c polls;

次に、プロジェクトのデータベースユーザーを作成します。 安全なパスワードを選択してください:

CREATE USER  WITH PASSWORD '';

ここで、作成したユーザーの接続パラメーターのいくつかを変更します。 これにより、データベース操作が高速化されるため、接続が確立されるたびに正しい値を照会および設定する必要がなくなります。

デフォルトのエンコーディングを `+ UTF-8 `に設定していますが、これはDjangoが期待しています。 また、デフォルトのトランザクション分離スキームを「コミット済み読み取り」に設定しています。これは、コミットされていないトランザクションからの読み取りをブロックします。 最後に、タイムゾーンを設定しています。 デフォルトでは、Djangoプロジェクトは ` UTC`を使用するように設定されます。 これらはすべてhttps://docs.djangoproject.com/en/2.0/ref/databases/#optimizing-postgresql-s-configuration[Djangoプロジェクト自体]からの推奨事項です。

PostgreSQLプロンプトで次のコマンドを入力します。

ALTER ROLE  SET client_encoding TO 'utf8';
ALTER ROLE  SET default_transaction_isolation TO 'read committed';
ALTER ROLE  SET timezone TO 'UTC';

これで、新しいユーザーに新しいデータベースを管理するアクセス権を与えることができます。

GRANT ALL PRIVILEGES ON DATABASE polls TO ;

終了したら、次を入力してPostgreSQLプロンプトを終了します。

\q

これで、Djangoアプリはこのデータベースに接続して管理する準備ができました。

次のステップでは、 `+ virtualenv +`をインストールし、Djangoプロジェクト用のPython仮想環境を作成します。

ステップ3-プロジェクト用のPython仮想環境の作成

アプリケーションと連携するようにデータベースを設定したので、このプロジェクトの依存関係をシステムのグローバルPythonインストールから分離するPython仮想環境を作成します。

これを行うには、最初に `+ virtualenv `コマンドにアクセスする必要があります。 これは ` pip +`でインストールできます。

`+ pip +`をアップグレードし、次を入力してパッケージをインストールします。

sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv

`+ virtualenv `をインストールしたら、Python仮想環境を保存するディレクトリを作成し、Djangoの ` polls +`アプリで使用するディレクトリを作成できます。

`+ envs +`というディレクトリを作成し、そこに移動します:

mkdir envs
cd envs

このディレクトリ内で、次のように入力して、 `+ polls +`というPython仮想環境を作成します。

virtualenv polls

これにより、 `+ envs `ディレクトリ内に ` polls `というディレクトリが作成されます。 内部では、Pythonのローカルバージョンと ` pip +`のローカルバージョンがインストールされます。 これを使用して、プロジェクトの分離されたPython環境をインストールおよび構成できます。

プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。 次のように入力して、それを行うことができます。

source polls/bin/activate

プロンプトが変わり、Python仮想環境内で操作していることを示す必要があります。 次のようになります: +(polls)@:〜/ $ +

仮想環境をアクティブにして、Django、Gunicorn、および + psycopg2 + PostgreSQLアダプターをローカルインスタンスの `+ pip +`とともにインストールします。

pip install django gunicorn psycopg2-binary

これで、Djangoの `+ polls +`アプリを実行するために必要なソフトウェアがすべて揃ったはずです。 次のステップでは、Djangoプロジェクトを作成し、このアプリをインストールします。

ステップ4-Polls Djangoアプリケーションの作成

これで、サンプルアプリケーションをセットアップできます。 このチュートリアルでは、https://docs.djangoproject.com/en/2.1/intro/tutorial01/ [Django documentation]のPollsデモアプリケーションを使用します。 ユーザーが投票を表示して投票できる公開サイトと、管理者が投票を変更、作成、削除できる管理コントロールパネルで構成されています。

このガイドでは、チュートリアルの手順をスキップして、DigitalOceanコミュニティhttps://github.com/do-community/django-polls[django-polls repo]から最終的なアプリケーションを複製します。

手順を手動で完了したい場合は、ホームディレクトリに「+ django-polls +」というディレクトリを作成し、そこに移動します:

cd
mkdir django-polls
cd django-polls

そこから、公式のDjangoドキュメントのhttps://docs.djangoproject.com/en/2.1/intro/tutorial01/ [最初のDjangoアプリの作成]チュートリアルに従うことができます。 完了したら、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-django-app-with-digitalocean-managed-databases-and-spaces#にスキップしますstep-5-%E2%80%94-adjusting-the-app-settings [ステップ5]。

完成したアプリを複製する場合は、ホームディレクトリに移動し、「+ git +」を使用してhttps://github.com/do-community/django-polls[django-polls repo]を複製します。

cd
git clone https://github.com/do-community/django-polls.git

それに `+ cd +`を追加し、ディレクトリの内容をリストします:

cd django-polls
ls

次のオブジェクトが表示されるはずです。

OutputLICENSE  README.md  manage.py  mysite  polls  templates

`+ manage.py `は、アプリの操作に使用されるメインのコマンドラインユーティリティです。 ` polls `には ` polls `アプリコードが含まれ、 ` mysite `にはプロジェクトスコープコードと設定が含まれます。 ` templates +`には、管理インターフェイス用のカスタムテンプレートファイルが含まれています。 プロジェクトの構造とファイルの詳細については、Djangoの公式ドキュメントからhttps://docs.djangoproject.com/en/2.1/intro/tutorial01/#creating-a-project [プロジェクトの作成]をご覧ください。

アプリを実行する前に、デフォルト設定を調整してデータベースに接続する必要があります。

ステップ5-アプリ設定の調整

このステップでは、Djangoプロジェクトのデフォルト設定を変更して、セキュリティを強化し、Djangoをデータベースに接続し、静的ファイルをローカルディレクトリに収集します。

テキストエディターで設定ファイルを開くことから始めます。

nano ~/django-polls/mysite/settings.py

`+ ALLOWED_HOSTS +`ディレクティブを見つけることから始めます。 これは、Djangoインスタンスへの接続に使用するアドレスまたはドメイン名のリストを定義します。 このリストにない* Host *ヘッダーを持つ受信リクエストは例外を発生させます。 Djangoでは、https://docs.djangoproject.com/en/2.1/topics/security/#host-headers-virtual-hosting [特定のセキュリティ脆弱性]を防ぐためにこれを設定する必要があります。

角括弧内に、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名をリストします。 各項目は、引用符で囲み、エントリをコンマで区切ってリストする必要があります。 ローカルNginxインスタンスを介して接続をプロキシするため、リストには「+ localhost +」も含まれます。 ドメイン全体およびサブドメインのリクエストを含める場合は、エントリの先頭にピリオドを追加します。

以下のスニペットには、これらのエントリがどのように見えるかを示すコメントアウトされた例がいくつかあります。

〜/ django-polls / mysite / settings.py

. . .

# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['', '', , 'localhost']

. . .

次に、データベースアクセスを構成するファイルのセクションを見つけます。 `+ DATABASES +`で始まります。 ファイル内の構成は、SQLiteデータベース用です。 プロジェクト用にPostgreSQLデータベースをすでに作成しているため、これらの設定を調整する必要があります。

デフォルトのSQLiteエンジンの代わりに、 `+ pip `でインストールした ` psycopg2 +`データベースアダプターを使用するようDjangoに指示します。 また、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-django-app-with-digitalocean-managed-databases-で参照されている*接続パラメーター*も再利用しますand-spaces#step-2-%E2%80%94-creating-the-postgresql-database-and-user [ステップ2]。 この情報は、DigitalOcean Cloud Control PanelのManaged Databasesセクションからいつでも見つけることができます。

データベース設定(データベース名( + polls +)、データベースユーザー名、データベースユーザーのパスワード、データベース + host +`および `+ port +)でファイルを更新します。 データベース固有の値を独自の情報に置き換えてください:

〜/ django-polls / mysite / settings.py

. . .

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.',
       'NAME': 'polls',
       'USER': '',
       'PASSWORD': '',
       'HOST': '',
       'PORT': '',
   }
}

. . .

次に、ファイルの一番下まで移動し、静的ファイルを配置する場所を示す設定を追加します。 これは、Nginxがこれらのアイテムのリクエストを処理できるようにするために必要です。 次の行は、Djangoにベースプロジェクトディレクトリの `+ static +`というディレクトリに配置するように指示します。

〜/ django-polls / mysite / settings.py

. . .

STATIC_URL = '/static/'

完了したら、ファイルを保存して閉じます。

この時点で、Djangoプロジェクトのデータベース、セキュリティ、および静的ファイルの設定を構成しました。 最初から `+ polls +`チュートリアルに従い、GitHubリポジトリのクローンを作成しなかった場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalableに移動できます-django-app-with-digitalocean-managed-databases-and-spaces#step-6-%E2%80%94-testing-the-app [ステップ6]。 GitHubリポジトリを複製した場合、1つの追加手順が残ります。

Django設定ファイルには、さまざまなDjangoオブジェクトのハッシュを作成するために使用される + SECRET_KEY +`変数が含まれています。 一意の予測不可能な値に設定することが重要です。 `+ SECRET_KEY +`変数はGitHubリポジトリからスクラブされているため、 `+ get_random_secret_key()+`と呼ばれる `+ django + Pythonパッケージに組み込まれた関数を使用して、新しい変数を作成します。 コマンドラインから、Pythonインタープリターを開きます。

python

次の出力とプロンプトが表示されます。

OutputPython 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Djangoパッケージから `+ get_random_secret_key +`関数をインポートし、関数を呼び出します:

from django.core.management.utils import get_random_secret_key
get_random_secret_key()

結果のキーをクリップボードにコピーします。

`+ CTRL + D +`を押してPythonインタープリターを終了します。

次に、テキストエディターで設定ファイルをもう一度開きます。

nano ~/django-polls/mysite/settings.py

`+ SECRET_KEY +`変数を見つけて、生成したばかりのキーを貼り付けます:

〜/ django-polls / mysite / settings.py

. . .

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ''

. . .

ファイルを保存して閉じます。

Django開発サーバーを使用してアプリをローカルでテストし、すべてが正しく構成されていることを確認します。

ステップ6-アプリのテスト

Django開発サーバーを実行する前に、 `+ manage.py `ユーティリティを使用してデータベーススキーマを作成し、静的ファイルを ` STATIC_ROOT +`ディレクトリに収集する必要があります。

プロジェクトのベースディレクトリに移動し、 `+ makemigrations `および ` migrate +`コマンドを使用して、PostgreSQLデータベースに初期データベーススキーマを作成します。

cd django-polls
./manage.py makemigrations
./manage.py migrate

`+ makemigrations `は、Djangoモデルに加えられた変更に基づいて、移行またはデータベーススキーマの変更を作成します。 ` migrate +`はこれらの移行をデータベーススキーマに適用します。 Djangoでの移行の詳細については、公式のDjangoドキュメントからhttps://docs.djangoproject.com/en/2.1/topics/migrations/[Migrations]を参照してください。

次を入力して、プロジェクトの管理ユーザーを作成します。

./manage.py createsuperuser

ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。

次のように入力して、すべての静的コンテンツを構成したディレクトリの場所に収集できます。

./manage.py collectstatic

静的ファイルは、プロジェクトディレクトリ内の「+ static +」というディレクトリに配置されます。

サーバーの初期セットアップガイドに従った場合は、サーバーを保護するUFWファイアウォールが必要です。 開発用サーバーをテストするには、使用するポートへのアクセスを許可する必要があります。

次を入力して、ポート `+ 8000 +`の例外を作成します。

sudo ufw allow 8000

Django開発サーバーを使用したアプリのテスト

最後に、次のコマンドでDjango開発サーバーを起動して、プロジェクトをテストできます。

./manage.py runserver 0.0.0.0:8000

Webブラウザで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に「:8000」と「+ polls +」パスを続けます。

http://:8000/polls

Pollsアプリのインターフェースが表示されます:

image:https://assets.digitalocean.com/articles/scalable_django/polls_app.png [Polls App Interface]

管理インターフェイスを確認するには、サーバーのドメイン名またはIPアドレスにアクセスし、その後に「:8000」と管理インターフェイスのパスを入力します。

http://:8000/admin

Pollsアプリの管理者認証ウィンドウが表示されます。

image:https://assets.digitalocean.com/articles/scalable_django/polls_admin.png [Polls Admin Auth Page]

`+ createsuperuser +`コマンドで作成した管理ユーザー名とパスワードを入力します。

認証後、Pollsアプリの管理インターフェースにアクセスできます。

image:https://assets.digitalocean.com/articles/scalable_django/polls_admin_main.png [Polls Admin Main Interface]

探索が終了したら、ターミナルウィンドウで「+ CTRL-C +」を押して開発サーバーをシャットダウンします。

Gunicornを使用したアプリのテスト

静的ファイルをオフロードする前に行う最後の作業は、Gunicornをテストして、アプリケーションを提供できることを確認することです。 これを行うには、プロジェクトディレクトリを入力し、 `+ gunicorn +`を使用してプロジェクトのWSGIモジュールを読み込みます。

gunicorn --bind 0.0.0.0:8000 mysite.wsgi

これにより、Django開発サーバーが実行されていたのと同じインターフェースでGunicornが起動します。 戻ってアプリをもう一度テストできます。

アプリケーションへのエントリポイントであるDjangoの `+ wsgi.py `ファイルへの相対ディレクトリパスを指定して、Gunicornにモジュールを渡しました。 このファイルは、アプリケーションと通信する「 application +」という関数を定義します。 WSGI仕様の詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14をクリックしてください。 -04#definitions-and-concepts [こちら]。

テストが終了したら、ターミナルウィンドウで「+ CTRL-C +」を押してGunicornを停止します。

アプリケーションの静的ファイルをDigitalOcean Spacesにオフロードします。

手順7-静的ファイルをDigitalOcean Spacesにオフロードする

この時点で、GunicornはDjangoアプリケーションを提供できますが、静的ファイルは提供できません。 通常、これらのファイルを提供するようにNginxを構成しますが、このチュートリアルではhttps://django-storages.readthedocs.io/en/latest/ [+ django-storages +]プラグインを使用してDigitalOcean Spacesにオフロードします。 これにより、静的コンテンツを集中化し、サーバーリソースを解放することにより、Djangoを簡単に拡張できます。 さらに、DigitalOcean Spaces CDNを使用してこの静的コンテンツを配信できます。

Django静的ファイルをオブジェクトストレージにオフロードするための完全なガイドについては、https://www.digitalocean.com/community/tutorials/how-to-set-up-object-storage-with-django [オブジェクトストレージの設定方法]を参照してください。 Djangoと]。

`+ django-storages +`のインストールと設定

まず、 + django-storages + Pythonパッケージをインストールします。 `+ django-storages `パッケージは、Djangoに ` boto3 `ライブラリを使用してS3互換オブジェクトストレージサービスにファイルをアップロードする ` S3Boto3Storage +`ストレージバックエンドを提供します。

まず、 + pip`を使用して + django-storages`および + boto3 + Pythonパッケージをインストールします。

pip install django-storages boto3

次に、アプリのDjango設定ファイルをもう一度開きます。

nano ~/django-polls/mysite/settings.py

ファイルの `+ INSTALLED_APPS `セクションに移動し、インストール済みアプリのリストに ` storages +`を追加します。

〜/ django-polls / mysite / settings.py

. . .

INSTALLED_APPS = [
   . . .
   'django.contrib.staticfiles',

]

. . .

ファイルをさらに下にスクロールして、前に変更した「+ STATIC_URL 」に移動します。 これらの値を上書きし、新しい ` S3Boto3Storage +`バックエンドパラメータを追加します。 前に入力したコードを削除し、次のブロックを追加します。これらのブロックには、スペースのアクセスおよび位置情報が含まれます。 ここで強調表示されている値を独自の情報に置き換えることを忘れないでください。

〜/ django-polls / mysite / settings.py

. . .

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

AWS_ACCESS_KEY_ID =
AWS_SECRET_ACCESS_KEY =

AWS_STORAGE_BUCKET_NAME =
AWS_S3_ENDPOINT_URL =
AWS_S3_OBJECT_PARAMETERS = {
   'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = 'public-read'

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

STATIC_URL = '{}/{}/'.format(AWS_S3_ENDPOINT_URL, AWS_LOCATION)
STATIC_ROOT = 'static/'

次の構成アイテムを定義します。

  • + AWS_ACCESS_KEY_ID +:チュートリアルの前提条件で作成したスペースのアクセスキーID。 アクセスキーのセットを作成しなかった場合は、https://www.digitalocean.com/docs/spaces/how-to/administrative-access/#access-keys [アクセスキーを使用したスペースへのアクセスの共有]を参照してください。

  • + AWS_SECRET_ACCESS_KEY +:DigitalOcean Spaceの秘密鍵。

  • + AWS_STORAGE_BUCKET_NAME +:DigitalOcean Spaceの名前。

  • + AWS_S3_ENDPOINT_URL +:オブジェクトストレージサービスへのアクセスに使用されるエンドポイントURL。 DigitalOceanの場合、これはSpaceリージョンに応じて `+ https:// nyc3.digitaloceanspaces.com +`のようなものになります。

  • `+ AWS_S3_OBJECT_PARAMETERS +`静的ファイルのキャッシュ制御ヘッダーを設定します。

  • + AWS_LOCATION +:すべての静的ファイルが配置されるオブジェクトストレージバケット内のディレクトリを定義します。

  • + AWS_DEFAULT_ACL +:静的ファイルのアクセス制御リスト(ACL)を定義します。 これを「+ public-read +」に設定すると、エンドユーザーがファイルにパブリックにアクセスできるようになります。

  • + STATICFILES_STORAGE +:Djangoが静的ファイルをオフロードするために使用するストレージバックエンドを設定します。 このバックエンドは、DigitalOcean Spacesを含むS3互換のバックエンドで動作するはずです。

  • + STATIC_URL +:Djangoが静的ファイルのURLを生成するときに使用するベースURLを指定します。 ここでは、エンドポイントURLと静的ファイルのサブディレクトリを組み合わせて、静的ファイルのベースURLを作成します。

  • + STATIC_ROOT +:オブジェクトストレージにコピーする前にローカルで静的ファイルを収集する場所を指定します。

編集が完了したら、ファイルを保存して閉じます。

これ以降、「+ collectstatic +」を実行すると、Djangoはアプリの静的ファイルをSpaceにアップロードします。 Djangoを起動すると、このスペースからCSSやJavascriptなどの静的アセットの提供が開始されます。

次のセクションでは、このスペースのCDNを有効にし、オプションでスペースCDNのカスタムサブドメインを構成します。 これにより、エッジサーバーの地理的に分散したネットワークでDjangoプロジェクトの静的ファイルをキャッチすることで、静的ファイルの配信が高速化されます。 CDNの詳細については、https://www.digitalocean.com/community/tutorials/using-a-cdn-to-speed-up-static-content-delivery [CDNを使用した静的コンテンツ配信の高速化]をご覧ください。 Spaces CDNを有効にしたくない場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-django-app-with-digitalocean-managed-にスキップしてください。 databases-and-spaces#configuring-cors-headers [CORSヘッダーの設定]。

CDNの有効化(オプション)

DigitalOcean Spaces CDNを介した静的ファイル配信を有効にするには、DigitalOcean SpaceのCDNを有効にすることから始めます。 これを行う方法については、DigitalOcean製品ドキュメントのhttps://www.digitalocean.com/docs/spaces/how-to/enable-cdn/[Spaces CDNを有効にする方法]を参照してください。

Spaces CDNでhttps://www.digitalocean.com/docs/spaces/how-to/customize-cdn-endpoint [カスタムドメイン]を使用する場合は、次の手順でサブドメインCNAMEレコードと適切なSSL証明書を作成しますhttps://www.digitalocean.com/docs/spaces/how-to/customize-cdn-endpoint [サブドメインでSpaces CDNエンドポイントをカスタマイズする方法]。

Spaces CDNでカスタムドメインを使用することを強くお勧めします。 これにより、オフロードされたアセットURLをDjangoサイトのURLに近づけることにより、サイトの検索エンジン最適化(SEO)が大幅に改善されます。 Spaces CDNでカスタムドメインを使用するには、まずDigitalOceanアカウントにドメインを追加する必要があります。 これを行う方法については、https://www.digitalocean.com/docs/networking/dns/how-to/add-domains/ [ドメインを追加する方法]を参照してください。

SpaceのCDNを有効にし、必要に応じてカスタムサブドメインを作成したら、https://cloud.digitalocean.com/spaces [クラウドコントロールパネル]を使用してSpaceに移動します。 Space名の下に新しい* Endpoints *リンクが表示されます。

image:https://assets.digitalocean.com/articles/scalable_django/spaces_endpoints.png [スペースエンドポイントのリスト]

これらのエンドポイントには、スペース名が含まれている必要があります。 Spaces CDNのカスタムサブドメインを作成した場合、このリストには* Subdomain *という追加のエンドポイントが含まれます。

  • Edge エンドポイントは、CDNを介してSpacesオブジェクトのリクエストをルーティングし、エッジキャッシュから可能な限りそれらを処理します。 この Edge エンドポイントをメモします。これを使用して、 `+ django-storages +`プラグインを設定します。 Spaces CDNのサブドメインを作成した場合、 Subdomain エンドポイントはこの Edge *エンドポイントのエイリアスです。

次に、アプリのDjango設定ファイルをもう一度編集します。

nano ~/django-polls/mysite/settings.py

最近変更した静的ファイルセクションに移動します。 `+ AWS_S3_CUSTOM_DOMAIN `パラメーターを追加して ` django-storages `プラグインCDNエンドポイントを設定し、 ` STATIC_URL +`パラメーターを更新してこの新しいCDNエンドポイントを使用します。

〜/ django-polls / mysite / settings.py

. . .

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

# Moving static assets to DigitalOcean Spaces as per:
# https://www.digitalocean.com/community/tutorials/how-to-set-up-object-storage-with-django
AWS_ACCESS_KEY_ID = 'your_spaces_access_key'
AWS_SECRET_ACCESS_KEY = 'your_spaces_secret_key'

AWS_STORAGE_BUCKET_NAME = 'your_space_name'
AWS_S3_ENDPOINT_URL = 'spaces_endpoint_URL'

AWS_S3_OBJECT_PARAMETERS = {
   'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'
AWS_DEFAULT_ACL = 'public-read'

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

STATIC_URL = '{}/{}/'.format(, AWS_LOCATION)
STATIC_ROOT = 'static/'

ここで、 `+ spaces_edge_endpoint_URL `を書き留めたばかりのEdgeエンドポイントで置き換え、 ` https:// `プレフィックスを切り捨てます。 たとえば、EdgeエンドポイントURLが「 https://.cdn.digitaloceanspaces.com+」の場合、「+ AWS_S3_CUSTOM_DOMAIN 」は「 .cdn.digitaloceanspaces.com +」に設定する必要があります。

カスタムサブドメインを作成した場合は、 `+ spaces_edge_endpoint_URL `をカスタムサブドメインエンドポイントに置き換え、 ` https:// `プレフィックスを切り捨てます。 たとえば、サブドメインのエンドポイントURLが「 https://.example.com+」の場合、「+ AWS_S3_CUSTOM_DOMAIN」は「+ .example.com +」に設定する必要があります。

完了したら、ファイルを保存して閉じます。

Djangoを起動すると、DigitalOcean SpaceのCDNを使用して静的コンテンツが提供されるようになります。

これがすべて正しく機能することをテストする前に、Spacesファイルのhttps://developer.mozilla.org/en-US/docs/Web/HTTP/CORS[Cross-Origin Resource Sharing(CORS)]ヘッダーを構成する必要がありますまたは、特定の静的アセットへのアクセスがWebブラウザによって拒否される場合があります。 Djangoが使用するのと同じドメインのSpaces CDNでカスタムサブドメインを使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-djangoにスキップできます。 -app-with-digitalocean-managed-databases-and-spaces#testing-spaces-static-file-delivery [Testing Spaces Static File Delivery]。

CORSヘッダーの構成

CORSヘッダーは、あるドメインで実行されているアプリケーションが別のドメインにあるスクリプトまたはリソースにアクセスできることをWebブラウザーに伝えます。 この場合、Djangoサーバーのドメインのクロスオリジンリソース共有を許可する必要があります。これにより、スペース内の静的ファイルのリクエストがWebブラウザーによって拒否されません。

開始するには、クラウドコントロールパネルを使用して、スペースの[設定]ページに移動します。

image:https://assets.nyc3.cdn.digitaloceanspaces.com/spaces/settings.png [[設定]タブのスクリーンショット]

  • CORS Configurations セクションで、 Add *をクリックします。

image:https://assets.nyc3.cdn.digitaloceanspaces.com/spaces/cors-options.png [CORS詳細設定]

ここで、* Origin *の下に、ワイルドカードの起源である `+ * +`を入力します

許可されたメソッド*で、 GET *を選択します。

[*ヘッダーの追加]をクリックし、表示されるテキストボックスに「+ Access-Control-Allow-Origin」と入力します。

  • Access Control Max Age *を「600」に設定して、作成したばかりのヘッダーが10分ごとに期限切れになるようにします。

[オプションを保存]をクリックします。

今後、スペース内のオブジェクトには適切な「+ Access-Control-Allow-Origin」応答ヘッダーが含まれ、最新の安全なWebブラウザーがこれらのファイルをドメイン間で取得できるようになります。

スペースの静的ファイル配信のテスト

DjangoがDigitalOcean Spaceから静的ファイルを正しく提供していることをテストします。

Djangoアプリディレクトリに移動します。

cd ~/django-polls

ここから、 `+ collectstatic +`を実行して、静的ファイルを収集してDigitalOcean Spaceにアップロードします。

python manage.py collectstatic

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

OutputYou have requested to collect static files at the destination
location as specified in your settings.

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel:

「+ yes 」と入力し、「 ENTER」を押して確認します。

次のような出力が表示されます。

Output121 static files copied.

これは、Djangoが `+ polls `アプリの静的ファイルをSpaceに正常にアップロードしたことを確認します。 https://cloud.digitalocean.com/spaces [クラウドコントロールパネル]を使用してスペースに移動し、 ` static +`ディレクトリ内のファイルを検査できます。

次に、Djangoが適切なURLを書き換えていることを確認します。

Gunicornサーバーを起動します。

gunicorn --bind 0.0.0.0:8000 mysite.wsgi

ウェブブラウザで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に「:8000」と「+ / admin +」を続けます。

http://:8000/admin

Pollsアプリの管理者認証ウィンドウが表示されるはずです。今回は正しいスタイルが設定されています。

次に、ブラウザの開発者ツールを使用してページのコンテンツを調べ、ソースファイルの保存場所を明らかにします。

Google Chromeを使用してこれを行うには、ページを右クリックし、* Inspect *を選択します。

次のウィンドウが表示されます。

image:https://assets.digitalocean.com/articles/scalable_django/chrome_dev_tools.png [Chrome開発ツールウィンドウ]

ここから、ツールバーの*ソース*をクリックします。 左側のペインのソースファイルのリストで、Djangoサーバーのドメインの下に「+ / admin / login 」、SpaceのCDNエンドポイントの下に「 static / admin 」が表示されます。 ` static / admin `内には、 ` css `と ` fonts +`ディレクトリの両方が表示されるはずです。

これにより、CSSスタイルシートとフォントがSpaceのCDNから正しく提供されていることが確認されます。

テストが終了したら、ターミナルウィンドウで「+ CTRL-C +」を押してGunicornを停止します。

`+ deactivate +`を入力すると、アクティブなPython仮想環境を無効にできます。

deactivate

プロンプトは通常に戻ります。

この時点で、Djangoサーバーから静的ファイルを正常にオフロードし、オブジェクトストレージから静的ファイルを提供しています。 これで、Gunicornをシステムサービスとして自動的に開始するように構成できます。

ステップ8-Gunicorn用のsystemdソケットおよびサービスファイルの作成

https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-django-app-with-digitalocean-managed-databases-and-spaces#step-6-%E2% 80%94-testing-the-app [ステップ6] GunicornがDjangoアプリケーションとやり取りできることをテストしましたが、アプリケーションサーバーを起動および停止するより堅牢な方法を実装する必要があります。 これを実現するために、systemdサービスとソケットファイルを作成します。

Gunicornソケットは起動時に作成され、接続をリッスンします。 接続が発生すると、systemdはGunicornプロセスを自動的に開始して接続を処理します。

`+ sudo +`権限を持つGunicornのsystemdソケットファイルを作成して開くことから始めます。

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

内部では、ソケットを記述するための `+ [Unit] `セクション、ソケットの場所を定義するための ` [Socket] `セクション、およびソケットが確実に存在するようにするための ` [Install] +`セクションを作成します。適切なタイミングで作成されました。 ファイルに次のコードを追加します。

/etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

完了したら、ファイルを保存して閉じます。

次に、テキストエディタでGunicornのsystemdサービスファイルを作成し、 `+ sudo +`権限で開きます。 サービスファイル名は、拡張子を除き、ソケットファイル名と一致する必要があります。

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

メタデータと依存関係を指定する `+ [Unit] `セクションから始めます。 ここにサービスの説明を入力し、ネットワーキングターゲットに到達した後にのみ開始するようにinitシステムに指示します。 サービスはソケットファイルのソケットに依存しているため、その関係を示すために ` Requires +`ディレクティブを含める必要があります。

/etc/systemd/system/gunicorn.service

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

次に、 `+ [Service] `セクションを開きます。 実行するために処理するユーザーとグループを指定します。 関連するすべてのファイルを所有しているため、通常のユーザーアカウントにプロセスの所有権を付与します。 NginxがGunicornと簡単に通信できるように、グループの所有権を「 www-data」グループに付与します。

次に、作業ディレクトリをマップし、サービスを開始するために使用するコマンドを指定します。 この場合、仮想環境内にインストールされているGunicorn実行可能ファイルへのフルパスを指定する必要があります。 プロセスがNginxと通信できるように、プロセスを `+ / run `ディレクトリ内に作成したUnixソケットにバインドします。 ` journald +`プロセスがGunicornログを収集できるように、すべてのデータを標準出力に記録します。 ここで、ワーカープロセスの数など、オプションのGunicorn調整を指定することもできます。 ここでは、3つのワーカープロセスでGunicornを実行します。

次のサービスセクションをファイルに追加します。 ここにリストされているユーザー名を自分のユーザー名に置き換えてください:

/etc/systemd/system/gunicorn.service

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

[Service]
User=
Group=www-data
WorkingDirectory=/home//django-polls
ExecStart=/home//envs/polls/bin/gunicorn \
         --access-logfile - \
         --workers 3 \
         --bind unix:/run/gunicorn.sock \
         mysite.wsgi:application

最後に、 `+ [Install] +`セクションを追加します。 これにより、ブート時に起動できるようにした場合、このサービスをリンクする対象がsystemdに指示されます。 通常のマルチユーザーシステムが稼働しているときにこのサービスを開始する必要があります。

/etc/systemd/system/gunicorn.service

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

[Service]
User=
Group=www-data
WorkingDirectory=/home//django-polls
ExecStart=/home//envs/polls/bin/gunicorn \
         --access-logfile - \
         --workers 3 \
         --bind unix:/run/gunicorn.sock \
         mysite.wsgi:application

[Install]
WantedBy=multi-user.target

これで、systemdサービスファイルが完成しました。 今すぐ保存して閉じます。

これで、Gunicornソケットを開始して有効にすることができます。 これにより、現在および起動時に `+ / run / gunicorn.sock `にソケットファイルが作成されます。 そのソケットに接続されると、systemdはそれを処理するために ` gunicorn.service`を自動的に開始します:

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

ソケットファイルを確認することで、操作が成功したことを確認できます。

Gunicornソケットファイルの確認

プロセスのステータスをチェックして、正常に開始したかどうかを確認します。

sudo systemctl status gunicorn.socket

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

OutputFailed to dump process list, ignoring: No such file or directory
● gunicorn.socket - gunicorn socket
  Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor preset: enabled)
  Active: active (running) since Tue 2019-03-05 19:19:16 UTC; 1h 22min ago
  Listen: /run/gunicorn.sock (Stream)
  CGroup: /system.slice/gunicorn.socket

Mar 05 19:19:16 django systemd[1]: Listening on gunicorn socket.

次に、 `+ / run `ディレクトリ内の ` gunicorn.sock +`ファイルの存在を確認します。

file /run/gunicorn.sock
Output/run/gunicorn.sock: socket

`+ systemctl status `コマンドがエラーの発生を示した場合、またはディレクトリに ` gunicorn.sock +`ファイルが見つからない場合、Gunicornソケットが正しく作成されなかったことを示しています。 次を入力して、Gunicornソケットのログを確認します。

sudo journalctl -u gunicorn.socket

続行する前に、 `+ / etc / systemd / system / gunicorn.socket +`ファイルをもう一度見て問題を修正してください。

ソケットアクティベーションのテスト

現在、 + gunicorn.socket`ユニットのみを開始した場合、ソケットはまだ接続を受信して​​いないため、 + gunicorn.service ie`はアクティブになりません。 これを確認するには、次のように入力します。

sudo systemctl status gunicorn
Output● gunicorn.service - gunicorn daemon
  Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)

ソケットアクティベーションメカニズムをテストするには、次のように入力して、 `+ curl +`を介してソケットへの接続を送信できます。

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

端末にアプリケーションからのHTML出力が表示されるはずです。 これは、Gunicornが開始され、Djangoアプリケーションを提供できることを示しています。 次のように入力して、Gunicornサービスが実行されていることを確認できます。

sudo systemctl status gunicorn
Output● gunicorn.service - gunicorn daemon
  Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
  Active: active (running) since Tue 2019-03-05 20:43:56 UTC; 1s ago
Main PID: 19074 (gunicorn)
   Tasks: 4 (limit: 4915)
  CGroup: /system.slice/gunicorn.service
          ├─19074 /home/sammy/envs/polls/bin/python3 /home/sammy/envs/polls/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock mysite.wsgi:application
          ├─19098 /home/sammy/envs/polls/bin/python3 /home/sammy/envs/polls/bin/gunicorn
. . .

Mar 05 20:43:56 django systemd[1]: Started gunicorn daemon.
Mar 05 20:43:56 django gunicorn[19074]: [2019-03-05 20:43:56 +0000] [19074] [INFO] Starting gunicorn 19.9.0
. . .
Mar 05 20:44:15 django gunicorn[19074]:  - - [05/Mar/2019:20:44:15 +0000] "GET / HTTP/1.1" 301 0 "-" "curl/7.58.0"

+ curl`の出力または + systemctl status`の出力が問題の発生を示している場合は、ログで詳細を確認してください。

sudo journalctl -u gunicorn

`+ / etc / systemd / system / gunicorn.service +`ファイルに問題がないか確認することもできます。 このファイルに変更を加えた場合は、デーモンをリロードしてサービス定義を再読み込みし、Gunicornプロセスを再起動してください。

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Nginxサーバーの構成に進む前に、問題をトラブルシューティングしてください。

ステップ8-Nginx HTTPSおよびGunicornプロキシの受け渡しの構成

Gunicornがより堅牢な方法で設定されたので、接続を暗号化し、トラフィックをGunicornプロセスに渡すようにNginxを構成する必要があります。

前提条件に従って、Let’s Encryptを使用してNginxをセットアップした場合、ドメインに対応するサーバーブロックファイルがNginxの「+ sites-available +」ディレクトリで利用可能になっているはずです。 そうでない場合は、https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04 [Let’s Encrypt onでNginxを保護する方法Ubuntu 18.04]そしてこのステップに戻ります。

この `+`サーバーブロックファイルを編集する前に、Nginxのインストール後にデフォルトでロールアウトされる ` default +`サーバーブロックファイルを削除します。

sudo rm /etc/nginx/sites-enabled/default

次に、前提条件のステップで設定されたデフォルトの `+ index.html `ページの代わりに、トラフィックをGunicornに渡すために、 `+`サーバーブロックファイルを変更します。

エディターでドメインに対応するサーバーブロックファイルを開きます。

sudo nano /etc/nginx/sites-available/

次のようなものが表示されるはずです。

/etc/nginx/sites-available/example.com

server {

       root /var/www//html;
       index index.html index.htm index.nginx-debian.html;

       server_name ;

       location / {
               try_files $uri $uri/ =404;
       }

   listen [::]:443 ssl ipv6only=on; # managed by Certbot
   listen 443 ssl; # managed by Certbot
   ssl_certificate /etc/letsencrypt/live//fullchain.pem; # managed by Certbot
   ssl_certificate_key /etc/letsencrypt/live//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 = ) {
       return 301 https://$host$request_uri;
   } # managed by Certbot


       listen 80;
       listen [::]:80;

       server_name ;
   return 404; # managed by Certbot


}

これは、https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04#step-5-setting-up-で作成されたデフォルトのサーバーブロックファイルの組み合わせです。 server-blocks-(推奨)[Ubuntu 18.04にNginxをインストールする方法]およびLet’s Encryptによって自動的に追加される追加。 このファイルの内容を削除し、HTTPトラフィックをHTTPSにリダイレクトし、前の手順で作成したGunicornソケットに着信要求を転送する新しい構成を作成します。

必要に応じて、「+ cp 」を使用してこのファイルのバックアップを作成できます。 テキストエディターを終了し、 ` example.com.old +`というバックアップを作成します。

sudo cp /etc/nginx/sites-available/ /etc/nginx/sites-available/.old

次に、ファイルを再度開き、その内容を削除します。 ブロックごとに新しい構成を作成します。

まず、ポート `+ 80 +`のHTTPリクエストをHTTPSにリダイレクトする次のブロックに貼り付けます。

/etc/nginx/sites-available/example.com

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name _;
   return 301 https://$request_uri;
}

ここでは、ポート `+ 80 `でHTTP IPv4およびIPv6リクエストをリッスンし、301レスポンスヘッダーを送信して、リクエストを `+`ドメインを使用してHTTPSポート `+ 443 +`にリダイレクトします。 これにより、直接HTTPリクエストがサーバーのIPアドレスにリダイレクトされます。

このブロックの後に、 `+ example.com +`ドメインのHTTPSリクエストを処理する次の設定コードのブロックを追加します。

/etc/nginx/sites-available/example.com

. . .
server {
   listen [::]:443 ssl ipv6only=on;
   listen 443 ssl;
   server_name ;

   # Let's Encrypt parameters
   ssl_certificate /etc/letsencrypt/live//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

   location = /favicon.ico { access_log off; log_not_found off; }

   location / {
       proxy_pass         http://unix:/run/gunicorn.sock;
       proxy_redirect     off;

       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 https;
   }
}

ここでは、最初にポート「443」で「+」ドメインと「 www。+」ドメインにヒットするリクエストをリッスンします。

次に、デフォルトのサーバーブロックファイルに含まれる同じLet’s Encrypt構成を提供します。これは、SSL証明書と秘密キーの場所、および追加のセキュリティパラメーターを指定します。

`+ location = / favicon.ico +`行は、ファビコンを見つける際の問題を無視するようにNginxに指示します。

最後の `+ location = / +`ブロックは、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-django-で設定されたGunicornソケットにリクエストを渡すようにNginxに指示しますdigitalocean-managed-databases-and-spacesを使用したアプリ#step-8-%E2%80%94-creating-systemd-socket-and-service-files-for-gunicorn [ステップ8]。 さらに、ヘッダーを追加して、リクエストが転送されたことをアップストリームのDjangoサーバーに通知し、さまざまなリクエストプロパティを提供します。

これら2つの構成ブロックを貼り付けた後、最終ファイルは次のようになります。

/etc/nginx/sites-available/example.com

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name _;
   return 301 https://$request_uri;
}
server {
       listen [::]:443 ssl ipv6only=on;
       listen 443 ssl;
       server_name ;

       # Let's Encrypt parameters
       ssl_certificate /etc/letsencrypt/live//fullchain.pem;
       ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
       include /etc/letsencrypt/options-ssl-nginx.conf;
       ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

       location = /favicon.ico { access_log off; log_not_found off; }

       location / {
         proxy_pass         http://unix:/run/gunicorn.sock;
         proxy_redirect     off;

         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 https;
       }
}

完了したら、ファイルを保存して閉じます。

次のように入力して、構文エラーのNginx設定をテストします。

sudo nginx -t

設定にエラーがない場合は、次を入力してNginxを再起動します。

sudo systemctl restart nginx

これで、サーバーのドメインまたはIPアドレスにアクセスして、アプリケーションを表示できるようになります。 ブラウザは安全なHTTPS接続を使用してDjangoバックエンドに接続する必要があります。

Djangoプロジェクトを完全に保護するには、いくつかのセキュリティパラメータをその `+ settings.py +`ファイルに追加する必要があります。 エディターでこのファイルを再度開きます。

nano ~/django-polls/mysite/settings.py

ファイルの一番下までスクロールし、次のパラメーターを追加します。

〜/ django-polls / mysite / settings.py

. . .

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True

これらの設定は、サーバーでHTTPSを有効にしたことをDjangoに伝え、「安全な」Cookieを使用するよう指示します。 これらの設定の詳細については、https://docs.djangoproject.com/en/のhttps://docs.djangoproject.com/en/2.1/topics/security/#ssl-https[SSL/HTTPSセクション]をご覧ください。 2.1 / topics / security /#security-in-django [Djangoのセキュリティ]。

完了したら、ファイルを保存して閉じます。

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

sudo systemctl restart gunicorn

この時点で、HTTP要求をリダイレクトし、これらの要求をGunicornに渡すようにNginxを構成しました。 これで、DjangoプロジェクトとアプリでHTTPSが完全に有効になります。 エラーが発生した場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18でこのディスカッションを行ってください。 -04#troubleshooting-nginx-and-gunicorn [NginxとGunicornのトラブルシューティング]が役立つ場合があります。

結論

このガイドでは、Ubuntu 18.04サーバーで実行されるスケーラブルなDjangoアプリケーションをセットアップおよび構成しました。 このセットアップを複数のサーバーに複製して、可用性の高いアーキテクチャを作成できます。 さらに、このアプリとその構成は、http://nginx.org/en/docs/http/configuring_https_servers.html [Docker]または別のコンテナーランタイムを使用してコンテナー化して、展開とスケーリングを容易にすることができます。 これらのコンテナーは、https://kubernetes.io/ [Kubernetes]のようなコンテナークラスターに展開できます。 今後のチュートリアルシリーズでは、このDjangoの `+ polls +`アプリをKubernetesクラスターで実行できるようにコンテナー化およびモダナイズする方法を検討します。

静的ファイルに加えて、Django Mediaファイルをオブジェクトストレージにオフロードすることもできます。 これを行う方法については、https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your-Django-sites-static-and-media-files/を参照してください[Amazon S3を使用してDjangoサイトの静的ファイルとメディアファイルを保存する]。 静的ファイルを圧縮して、エンドユーザーへの配信をさらに最適化することも検討してください。 これを行うには、https://github.com/django-compressor/django-compressor [Django compresser]のようなDjangoプラグインを使用できます。

前の投稿:JavaScriptでオブジェクトメソッドを使用する方法
次の投稿:UseRoamingを無効にしてOpenSSHのクライアントバグCVE-0216-0777およびCVE-0216-0778を修正する方法