Djangoは、PythonアプリケーションまたはWebサイトを立ち上げるのに役立つ強力なWebフレームワークです。 Djangoには、コードをローカルでテストするための簡略化された開発サーバーが含まれていますが、本番環境に少しでも関連する場合は、より安全で強力なWebサーバーが必要です(Nginx-Apache)。
このガイドでは、Djangoアプリケーションをサポートおよび提供するためにUbuntu18.04にいくつかのコンポーネントをインストールして構成する方法を示します。デフォルトのSQLiteデータベースを使用する代わりに、PostgreSQLデータベースをセットアップします。アプリケーションとインターフェイスするようにGunicornアプリケーションサーバーを構成します。次に、GunicornにリバースプロキシするようにNginxを設定し、アプリを提供するためのセキュリティ機能とパフォーマンス機能にアクセスできるようにします。
sudo権限が設定されたroot以外のユーザーを作成する
- ルートとしてログイン
- 新しいユーザーの作成
# adduser bobby
- 管理者権限の付与
これらの特権を新しいユーザーに追加するには、新しいユーザーをsudoグループに追加する必要があります。デフォルトでは、Ubuntu 18.04では、sudoグループに属するユーザーがsudoコマンドを使用できます。# usermod -aG sudo bobby
Ubuntuリポジトリからパッケージをインストールする
プロセスを開始するには、Ubuntuリポジトリから必要なすべてのアイテムをダウンロードしてインストールします。 Pythonパッケージマネージャーのpipを使用して、少し後で追加のコンポーネントをインストールします。
ローカルのaptパッケージインデックスを更新してから、パッケージをダウンロードしてインストールする必要があります。インストールするパッケージは、プロジェクトで使用するPythonのバージョンによって異なります。
Python 3でDjangoをインストールするには、次のように入力します:
$ sudo apt-get update
$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
これにより、pip、後でGunicornを構築するために必要なPython開発ファイル、Postgresデータベースシステムとそれと対話するために必要なライブラリ、およびNginxWebサーバーがインストールされます。
PostgreSQLデータベースとユーザーを作成する
すぐに参加して、Djangoアプリケーション用のデータベースとデータベースユーザーを作成します。デフォルトでは、Postgresはローカル接続にピア認証と呼ばれる認証スキームを使用します。基本的に、これは、ユーザーのオペレーティングシステムのユーザー名が有効なPostgresユーザー名と一致する場合、そのユーザーはそれ以上の認証なしでログインできることを意味します。
Postgresのインストール中に、postgresPostgreSQL管理ユーザーに対応するpostgresという名前のオペレーティングシステムユーザーが作成されました。このユーザーを使用して管理タスクを実行する必要があります。 sudoを使用して、-uオプションを使用してユーザー名を渡すことができます。
次のように入力して、インタラクティブなPostgresセッションにログインします:
$ sudo -u postgres psql
要件を設定できるPostgreSQLプロンプトが表示されます。
まず、プロジェクトのデータベースを作成します
Postgres=# CREATE DATABASE newproject;
注: すべてのPostgresステートメントはセミコロンで終了する必要があります
次に、プロジェクトのデータベースユーザーを作成します。安全なパスワードを選択してください
Postgres=# CREATE USER newprojectuser WITH PASSWORD 'password';
その後、作成したユーザーの接続パラメーターのいくつかを変更します。これにより、データベース操作が高速化されるため、接続が確立されるたびに正しい値を照会して設定する必要がなくなります。
Djangoが期待するデフォルトのエンコーディングをUTF-8に設定しています。また、デフォルトのトランザクション分離スキームを読み取りコミットに設定しています。これにより、コミットされていないトランザクションからの読み取りがブロックされます。最後に、タイムゾーンを設定します。デフォルトでは、DjangoプロジェクトはUTCを使用するように設定されます。これらはすべて、Djangoプロジェクト自体からの推奨事項です。
Postgres=# ALTER ROLE newprojectuser SET client_encoding TO 'utf8';
Postgres=# ALTER ROLE newprojectuser SET default_transaction_isolation TO 'read committed';
Postgres=# ALTER ROLE newprojectuser SET timezone TO 'UTC';
これで、新しいユーザーに新しいデータベースを管理するためのアクセス権を与えることができます
Postgres=# GRANT ALL PRIVILEGES ON DATABASE newproject TO newprojectuser;
終了したら、次のように入力してPostgreSQLプロンプトを終了します。
Postgres=# \q
プロジェクト用のPython3仮想環境を作成する
データベースができたので、残りのプロジェクト要件の準備を始めることができます。管理を容易にするために、Python3要件を仮想環境内にインストールします。
これを行うには、最初にvirtualenvコマンドにアクセスする必要があります。これはpip3でインストールできます。
pip3をアップグレードし、次のように入力してパッケージをインストールします。
$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install virtualenv
virtualenvをインストールすると、プロジェクトの形成を開始できます。プロジェクトファイルを保存できるディレクトリを作成して移動します:
$ mkdir ~/djangoproject
$ cd ~/djangoproject
プロジェクトディレクトリ内で、次のように入力してPython仮想環境を作成します。
$ virtualenv djangoprojectenv
これにより、djangoprojectenv
というディレクトリが作成されます。 djangoproject
内 ディレクトリ。内部には、ローカルバージョンのPythonとローカルバージョンのpipがインストールされます。これを使用して、プロジェクト用に分離されたPython環境をインストールおよび構成できます。
プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。次のように入力してください:
$ source djangoproject/bin/activate
プロンプトが変化して、Python仮想環境内で操作していることを示します。次のようになります:(djangoprojectenv)user@host:~/djangoproject$
。
仮想環境をアクティブにして、Django、Gunicorn、およびpsycopg2PostgreSQLアダプターをpipのローカルインスタンスとともにインストールします。
注: 使用しているPython3またはPython2のバージョンに関係なく、仮想環境がアクティブ化されている場合は、pipコマンド(pip3ではなく)を使用する必要があります。
(djangoprojectenv)$ pip install django gunicorn psycopg2-binary
これで、Djangoプロジェクトを開始するために必要なすべてのソフトウェアが揃いました。
新しいDjangoプロジェクトを作成して構成する
Pythonコンポーネントをインストールすると、実際のDjangoプロジェクトファイルを作成できます。
すでにプロジェクトディレクトリがあるので、ここにファイルをインストールするようにDjangoに指示します。通常の実際のコードを使用して第2レベルのディレクトリを作成し、このディレクトリに管理スクリプトを配置します。これの鍵は、Djangoが現在のディレクトリに関連して決定を下せるようにするのではなく、ディレクトリを明示的に定義していることです。
(djangoprojectenv)$ django-admin.py startproject djangoproject ~/djangoproject
この時点で、プロジェクトディレクトリ(~/djangoproject
この場合)次のコンテンツが必要です:
-
~/djangoproject/manage.py
:Djangoプロジェクト管理スクリプト。 -
~/djangoproject/myproject/
:Djangoプロジェクトパッケージ。これには、__init__.py
が含まれている必要があります 、settings.py
、urls.py
、およびwsgi.py
ファイル。 -
~/djangoproject/djangoprojectenv/
:以前に作成した仮想環境ディレクトリ。
新しく作成したプロジェクトファイルで最初に行うべきことは、設定を調整することです。テキストエディタで設定ファイルを開きます:
(djangoprojectenv)$ nano ~/djangoproject/djangoproject/settings.py
ALLOWED_HOSTSディレクティブを見つけることから始めます。これは、サーバーのアドレスまたはドメイン名のリストを定義し、Djangoインスタンスへの接続に使用できます。このリストにないHostヘッダーを持つ着信要求は、例外を発生させます。 Djangoでは、特定のクラスのセキュリティの脆弱性を防ぐためにこれを設定する必要があります。
角かっこ内に、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名をリストします。各項目は、エントリをコンマで区切って引用符で囲む必要があります。ドメイン全体とサブドメインのリクエストを希望する場合は、エントリの先頭にピリオドを追加します。以下のスニペットには、デモンストレーションに使用されるコメントアウトされた例がいくつかあります。
~/djangoproject/djangoproject/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', '103.25.111.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]
次に、データベースアクセスを構成するセクションを見つけます。それはDATABASESで始まります。ファイル内の構成はSQLiteデータベース用です。プロジェクト用にPostgreSQLデータベースをすでに作成しているので、設定を調整する必要があります。
PostgreSQLデータベース情報で設定を変更します。 Pipでインストールしたpsycopg2adaptorを使用するようにDjangoに指示します。データベース名、データベースユーザー名、データベースユーザーのパスワードを指定してから、データベースがローカルコンピューター上にあることを指定する必要があります。 PORT設定は空の文字列のままにしておくことができます:
~/djangoproject/djangoproject/settings.py
. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'newproject',
'USER': 'newprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
次に、ファイルの一番下に移動し、静的ファイルを配置する場所を示す設定を追加します。これは、Nginxがこれらのアイテムのリクエストを処理できるようにするために必要です。次の行は、Djangoにベースプロジェクトディレクトリのstaticというディレクトリに配置するように指示しています。
~/djangoproject/djangoproject/settings.py
. . .
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Ctrl + x
と入力して、保存して閉じます 終了したときのファイル。
これで、管理スクリプトを使用して、初期データベーススキーマをPostgreSQLデータベースに移行できます。
(djangoprojectenv)$ ~/djangoproject/manage.py makemigrations
(djangoprojectenv)$ ~/djangoproject/manage.py migrate
次のように入力して、プロジェクトの管理ユーザーを作成します。
(djangoprojectenv)$ ~/djangoproject/manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。
次のように入力して、構成したディレクトリの場所にすべての静的コンテンツを収集できます。
(djangoprojectenv)$ ~/djangoproject/manage.py collectstatic
操作を確認する必要があります。静的ファイルは、プロジェクトディレクトリ内のstaticというディレクトリに配置されます。
サーバーの初期設定ガイドに従った場合は、サーバーを保護するUFWファイアウォールが必要です。開発サーバーをテストするには、使用するポートへのアクセスを許可する必要があります。
次のように入力して、ポート8000の例外を作成します。
(djangoprojectenv)$ sudo ufw allow 8000
最後に、次のコマンドでDjango開発サーバーを起動して、プロジェクトをテストできます。
(djangoprojectenv)$ ~/djangoproject/manage.py runserver 0.0.0.0:8000
Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に:8000:
を続けます。http://server_domain_or_IP:8000
Django2.0.7のデフォルトのDjangoインデックスページが表示されます。
アドレスバーにhttp:// server_domain_or_IP:8000 / adminと入力すると、createsuperuserコマンドで作成した管理ユーザー名とパスワードの入力を求められます。
認証後、デフォルトのDjango管理インターフェースにアクセスできます:
探索が終了したら、CTRL-C
を押します。 ターミナルウィンドウで開発サーバーをシャットダウンします。
プロジェクトにサービスを提供するGunicornの能力のテスト
仮想環境を離れる前に最後にやりたいことは、Gunicornをテストして、アプリケーションに対応できることを確認することです。これを行うには、プロジェクトディレクトリに入り、gunicornを使用してプロジェクトのWSGIモジュールをロードします。
(djangoprojectenv)$ cd ~/djangoproject
(djangoprojectenv)$ gunicorn --bind 0.0.0.0:8000 djangoproject.wsgi
これにより、Django開発サーバーが実行されていたのと同じインターフェースでGunicornが起動します。戻ってアプリをもう一度テストできます。
注: Gunicornはこれに関与する静的CSSコンテンツを認識していないため、管理インターフェースにはスタイルが適用されません。
Pythonのモジュール構文を使用して、アプリケーションへのエントリポイントであるDjangoのwsgi.pyファイルへの相対ディレクトリパスを指定することにより、Gunicornにモジュールを渡しました。このファイル内には、アプリケーションとの通信に使用されるアプリケーションと呼ばれる関数が定義されています。
テストが終了したら、ターミナルウィンドウでCTRL-Cを押してGunicornを停止します。
これで、Djangoアプリケーションの構成が完了しました。次のように入力すると、仮想環境から戻ることができます:
(myprojectenv)$ deactivate
プロンプトの仮想環境インジケーターが削除されます。
Gunicornsystemdサービスファイルを作成する
GunicornがDjangoアプリケーションと対話できることをテストしましたが、アプリケーションサーバーを起動および停止するためのより堅牢な方法を実装する必要があります。これを実現するために、systemdサービスファイルを作成します。
テキストエディタでsudo権限を持つGunicornのsystemdサービスファイルを作成して開きます:
$ sudo nano /etc/systemd/system/gunicorn.service
[Unit]
から始めます セクション。メタデータと依存関係を指定するために使用されます。ここにサービスの説明を記載し、ネットワークターゲットに到達した後にのみこれを開始するようにinitシステムに指示します。
次に、[Service]
を開きます セクション。実行する処理を行うユーザーとグループを指定します。プロセスは関連するすべてのファイルを所有しているため、通常のユーザーアカウントにプロセスの所有権を付与します。 www-data
にグループの所有権を付与します NginxがGunicornと簡単に通信できるようにグループ化します。
次に、作業ディレクトリをマップし、サービスの開始に使用するコマンドを指定します。この場合、仮想環境内にインストールされているGunicorn実行可能ファイルへのフルパスを指定する必要があります。 Nginxは同じコンピューターにインストールされているため、プロジェクトディレクトリ内のUnixソケットにバインドします。これは、ネットワークポートを使用するよりも安全で高速です。ここでは、オプションのGunicornの微調整を指定することもできます。たとえば、この場合、3つのワーカープロセスを指定しました。
最後に、[Install]
を追加します セクション。これにより、起動時にサービスを開始できるようにした場合に、このサービスを何にリンクするかがsystemdに通知されます。通常のマルチユーザーシステムが稼働しているときにこのサービスを開始する必要があります:
/etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=bobby
Group=www-data
WorkingDirectory=/home/bobby/djangoproject
ExecStart=/home/bobby/djangoproject/djangoproject/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/bobby/djangoproject/djangoproject.sock djangoproject.wsgi:application
[Install]
WantedBy=multi-user.target
これで、systemdサービスファイルが完成しました。今すぐ保存して閉じます。
ボビーユーザーをwww-dataグループに追加する必要があります:
$ sudo usermod –a –G www-data bobby
これで、作成したGunicornサービスを開始し、起動時に開始するように有効にすることができます。
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
ソケットファイルを確認することで、操作が成功したことを確認できます。
プロセスのステータスをチェックして、プロセスを開始できたかどうかを確認します。
$ sudo systemctl status gunicorn
次に、djangoproject.sock
の存在を確認します プロジェクトディレクトリ内のファイル:
$ ls /home/bobby/djangoproject
Output
manage.py djangoproject djangoprojectenv djangoproject.sock static
systemctl statusコマンドでエラーが発生したことが示された場合、またはdjangoproject.sock
が見つからない場合 ディレクトリ内のファイルは、Gunicornが正しく起動できなかったことを示しています。次のように入力して、Gunicornのプロセスログを確認します。
$ sudo journalctl -u gunicorn
ログのメッセージを見て、Gunicornが問題に遭遇した場所を見つけてください。問題が発生した理由はたくさんありますが、Gunicornがソケットファイルを作成できなかった場合は、次のいずれかの理由が考えられます。
- プロジェクトファイルは、sudoユーザーではなくrootユーザーが所有します
-
WorkingDirectory
/etc/systemd/system/gunicorn.service
内のパス ファイルがプロジェクトディレクトリを指していない -
ExecStart
でgunicornプロセスに指定された構成オプション ディレクティブが正しくありません。次の項目を確認してください。- gunicornバイナリへのパスは、仮想環境内のバイナリの実際の場所を指します
-
--bind
ディレクティブは、Gunicornがアクセスできるディレクトリ内に作成するファイルを定義します -
djangoproject.wsgi:application
WSGI呼び出し可能オブジェクトへの正確なパスです。つまり、WorkingDirectoryにいるときは、djangoproject.wsgi
を調べることで、呼び出し可能な名前付きアプリケーションにアクセスできるはずです。 モジュール(./djangoproject/wsgi.py
というファイルに変換されます )
/etc/systemd/system/gunicorn.serviceファイルに変更を加えた場合は、デーモンをリロードしてサービス定義を再読み込みし、次のように入力してGunicornプロセスを再起動します。
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
続行する前に、上記の問題のいずれかをトラブルシューティングしてください。
GunicornへのプロキシパスにNginxを設定
Gunicornがセットアップされたので、トラフィックをプロセスに渡すようにNginxを構成する必要があります。 Nginxのサイトで利用可能なディレクトリに新しいサーバーブロックを作成して開くことから始めます:
$ sudo nano /etc/nginx/sites-available/djangoproject
内部で、新しいサーバーブロックを開きます。まず、このブロックが通常のポート80でリッスンし、サーバーのドメイン名またはIPアドレスに応答するように指定します。
次に、ファビコンの検索に関する問題を無視するようにNginxに指示します。また、~/djangoproject/static
で収集した静的アセットの場所も教えてくれます ディレクトリ。これらのファイルはすべて、"/static"
の標準URIプレフィックスを持っています 、これらのリクエストに一致するロケーションブロックを作成できます。
最後に、他のすべてのリクエストに一致する場所/{}ブロックを作成します。この場所の中に、標準のproxy_params
を含めます Nginxインストールに含まれているファイル。次に、Gunicornプロセスが作成したソケットにトラフィックを渡します。
/etc/nginx/sites-available/djangoproject
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/bobby/djangoproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/bobby/djangoproject/djangoproject.sock;
}
}
終了したら、ファイルを保存して閉じます。これで、ファイルをsites-enabled
にリンクして有効にできます。 ディレクトリ:
$ sudo ln -s /etc/nginx/sites-available/djangoproject /etc/nginx/sites-enabled
次のように入力して、構文エラーについてNginx構成をテストします。
$ sudo nginx -t
エラーが報告されていない場合は、次のように入力してNginxを再起動してください。
$ sudo systemctl restart nginx
最後に、ポート80で通常のトラフィックに対してファイアウォールを開く必要があります。開発サーバーにアクセスする必要がなくなったため、ポート8000を開くルールを削除することもできます。
$ sudo ufw delete allow 8000
$ sudo ufw allow 'Nginx Full'
これで、サーバーのドメインまたはIPアドレスにアクセスしてアプリケーションを表示できるようになります。
また読む
- Ubuntu18.04でUFWファイアウォールを設定する方法
- Ubuntu18.04にLAMPスタックをインストールする方法
注:Nginxを構成した後、次のステップはSSL/TLSを使用してサーバーへのトラフィックを保護することです。これがないと、パスワードを含むすべての情報がプレーンテキストでネットワーク経由で送信されるため、これは重要です。