前書き
Djangoは強力なWebフレームワークであり、PythonアプリケーションまたはWebサイトの開発を支援します。 Djangoには、ローカルでコードをテストするための簡素化された開発サーバーが含まれていますが、わずかに生産関連の場合でも、より安全で強力なWebサーバーが必要です。
このガイドでは、Djangoアプリケーションをサポートおよび提供するために、Ubuntu 14.04にいくつかのコンポーネントをインストールおよび構成する方法を示します。 デフォルトのSQLiteデータベースを使用する代わりに、PostgreSQLデータベースをセットアップします。 Gunicornアプリケーションサーバーを構成して、アプリケーションとインターフェイスします。 次に、GunicornにリバースプロキシするようにNginxを設定し、アプリを提供するためのセキュリティ機能とパフォーマンス機能にアクセスできるようにします。
前提条件と目標
このガイドを完了するには、sudo
権限が設定された非rootユーザーの新しいUbuntu14.04サーバーインスタンスが必要です。 initial server setup guideを実行することで、これを設定する方法を学ぶことができます。
仮想環境にDjangoをインストールします。 プロジェクト固有の環境にDjangoをインストールすると、プロジェクトとその要件を個別に処理できます。
データベースとアプリケーションを起動して実行したら、Gunicornアプリケーションサーバーをインストールして構成します。 これは、アプリケーションへのインターフェイスとして機能し、HTTPのクライアントリクエストをアプリケーションが処理できるPython呼び出しに変換します。 次に、Gunicornの前にNginxをセットアップして、高性能な接続処理メカニズムと実装しやすいセキュリティ機能を活用します。
始めましょう。
Ubuntuリポジトリからパッケージをインストールします
プロセスを開始するには、Ubuntuリポジトリから必要なすべてのアイテムをダウンロードしてインストールします。 Pythonパッケージマネージャーpip
を使用して、少し後で追加のコンポーネントをインストールします。
まず、ローカルパッケージインデックスを更新してから、パッケージをダウンロードしてインストールします。
sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx
これにより、pip
、後でGunicornをビルドするために必要なPython開発ファイル、Postgresデータベースシステムとそれと対話するために必要なライブラリ、およびNginxWebサーバーがインストールされます。
PostgreSQLデータベースとユーザーを作成する
Djangoアプリケーションのデータベースとデータベースユーザーをすぐに作成します。
デフォルト構成でPostgresを使用するには、一時的にpostgres
システムユーザーに変更するのが最善です。 次のように入力して、これを実行します。
sudo su - postgres
postgres
ユーザーとして操作している場合は、次のように入力することで、認証なしでPostgreSQLインタラクティブセッションに直接ログインできます。
psql
要件を設定できるPostgreSQLプロンプトが表示されます。
まず、プロジェクトのデータベースを作成します。
CREATE DATABASE myproject;
すべてのコマンドはセミコロンで終了する必要があるため、問題が発生している場合はコマンドがセミコロンで終了することを確認してください。
次に、プロジェクトのデータベースユーザーを作成します。 安全なパスワードを選択してください:
CREATE USER myprojectuser WITH PASSWORD 'password';
これで、新しいユーザーに新しいデータベースを管理するアクセス権を与えることができます。
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
終了したら、次のように入力してPostgreSQLプロンプトを終了します。
\q
ここで、postgres
ユーザーのシェルセッションを終了し、次のように入力して通常のユーザーのシェルセッションに戻ります。
exit
プロジェクト用のPython仮想環境を作成する
データベースの準備ができたので、残りのプロジェクト要件の準備を開始できます。 管理を容易にするために、仮想環境にPython要件をインストールします。
これを行うには、最初にvirtualenv
コマンドにアクセスする必要があります。 これはpip
でインストールできます:
sudo pip install virtualenv
virtualenv
がインストールされたら、プロジェクトの形成を開始できます。 プロジェクトを保持するディレクトリを作成し、その後ディレクトリに移動します。
mkdir ~/myproject
cd ~/myproject
プロジェクトディレクトリ内で、次のように入力してPython仮想環境を作成します。
virtualenv myprojectenv
これにより、myproject
ディレクトリ内にmyprojectenv
というディレクトリが作成されます。 内部では、Pythonのローカルバージョンとpip
のローカルバージョンがインストールされます。 これを使用して、プロジェクトの分離されたPython環境をインストールおよび構成できます。
プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。 次のように入力して、それを行うことができます。
source myprojectenv/bin/activate
プロンプトが変わり、Python仮想環境内で操作していることを示す必要があります。 (myprojectenv)user@host:~/myproject$
のようになります。
仮想環境をアクティブにして、Django、Gunicorn、およびpip
のローカルインスタンスを使用したpsycopg2
PostgreSQLアダプターをインストールします。
pip install django gunicorn psycopg2
新しいDjangoプロジェクトを作成して構成する
Pythonコンポーネントをインストールすると、実際のDjangoプロジェクトファイルを作成できます。
Djangoプロジェクトを作成する
既にプロジェクトディレクトリがあるので、ここにファイルをインストールするようDjangoに指示します。 通常の実際のコードで第2レベルのディレクトリを作成し、このディレクトリに管理スクリプトを配置します。 これの鍵は、Djangoに現在のディレクトリにファイルを作成するように指示する最後のドットです。
django-admin.py startproject myproject .
プロジェクト設定を調整する
新しく作成したプロジェクトファイルで最初に行うべきことは、設定を調整することです。 テキストエディターで設定ファイルを開きます。
nano myproject/settings.py
データベースアクセスを構成するセクションを見つけることから始めます。 DATABASES
で始まります。 ファイル内の構成は、SQLiteデータベース用です。 プロジェクト用にPostgreSQLデータベースをすでに作成しているため、設定を調整する必要があります。
PostgreSQLデータベース情報を使用して設定を変更します。 pip
でインストールしたpsycopg2
アダプターを使用するようにDjangoに指示します。 データベース名、データベースユーザー名、データベースユーザー名のパスワードを指定し、データベースがローカルコンピューターにあることを指定する必要があります。 PORT
設定は空の文字列のままにしておくことができます。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
次に、ファイルの一番下まで移動し、静的ファイルを配置する場所を示す設定を追加します。 これは、Nginxがこれらのアイテムのリクエストを処理できるようにするために必要です。 次の行は、ベースプロジェクトディレクトリのstatic
というディレクトリにそれらを配置するようにDjangoに指示しています。
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
完了したら、ファイルを保存して閉じます。
初期プロジェクトのセットアップを完了する
これで、管理スクリプトを使用して初期データベーススキーマをPostgreSQLデータベースに移行できます。
cd ~/myproject
./manage.py makemigrations
./manage.py migrate
次を入力して、プロジェクトの管理ユーザーを作成します。
./manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。
次のように入力して、すべての静的コンテンツを構成したディレクトリの場所に収集できます。
./manage.py collectstatic
操作を確認する必要があります。 静的ファイルは、プロジェクトディレクトリ内のstatic
というディレクトリに配置されます。
最後に、次のコマンドでDjango開発サーバーを起動して、プロジェクトをテストできます。
./manage.py runserver 0.0.0.0:8000
Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に:8000
を続けます。
http://server_domain_or_IP:8000
デフォルトのDjangoインデックスページが表示されます。
アドレスバーのURLの末尾に/admin
を追加すると、createsuperuser
コマンドで作成した管理ユーザー名とパスワードの入力を求められます。
認証後、デフォルトのDjango管理インターフェースにアクセスできます。
探索が終了したら、ターミナルウィンドウでCTRL-Cを押して、開発サーバーをシャットダウンします。
Gunicornのプロジェクト提供能力のテスト
仮想環境を離れる前にやりたい最後のことは、Gunicornをテストして、アプリケーションを提供できることを確認することです。 次のように入力することで、これを簡単に行うことができます。
cd ~/myproject
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
これにより、Django開発サーバーが実行されていたのと同じインターフェースでGunicornが起動します。 戻ってアプリをもう一度テストできます。 Gunicornはこれに関与する静的コンテンツを知らないため、管理インターフェイスにはスタイルが適用されないことに注意してください。
Pythonのモジュール構文を使用して、アプリケーションへのエントリポイントであるDjangoのwsgi.py
ファイルへの相対ディレクトリパスを指定することにより、Gunicornにモジュールを渡しました。 このファイル内には、アプリケーションとの通信に使用されるapplication
という関数が定義されています。 WSGI仕様の詳細については、hereをクリックしてください。
テストが終了したら、ターミナルウィンドウでCTRL-Cを押してGunicornを停止します。
これで、Djangoアプリケーションの構成が完了しました。 次のように入力して、仮想環境からバックアウトできます。
deactivate
Gunicorn Upstartファイルを作成する
GunicornがDjangoアプリケーションとやり取りできることをテストしましたが、アプリケーションサーバーを起動および停止するより堅牢な方法を実装する必要があります。 これを達成するために、Upstartスクリプトを作成します。
テキストエディタでsudo
権限を持つGunicornのUpstartファイルを作成して開きます。
sudo nano /etc/init/gunicorn.conf
まず、サービスファイルの目的を示す簡単な説明文字列から始めます。 次に、このサービスを自動的に開始するシステムランレベルの定義に進みます。 サービスを実行する通常のランレベルは、2、3、4、および5です。 システムがこれらのいずれかにある場合、サービスを実行します。 他の実行レベル(システムの再起動、シャットダウン、シングルユーザーモードなど)で停止するように指示します。
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
次に、Upstartにサービスが失敗した場合に自動的に再起動するよう指示します。 また、実行するユーザーとグループを指定します。 すべてのファイルはそのユーザーが所有しているため、通常のユーザーを使用します。 Nginxが属するwww-data
グループをグループ所有者にします。 また、Gunicornコマンドが正しく実行されるように、プロジェクトのディレクトリに変更する必要があります。
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid user
setgid www-data
chdir /home/user/myproject
ここで、Gunicornプロセスを開始するコマンドを指定するだけです。 仮想環境内に保存されているGunicorn実行可能ファイルへのパスを指定する必要があります。 両方のサービスがこのサーバーで実行されるため、ネットワークポートの代わりにUnixソケットを使用してNginxと通信するように指示します。 これはより安全で高速です。 ここでもGunicornの他の構成を追加できます。 たとえば、3つのワーカープロセスが必要であることを指定します。
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid user
setgid www-data
chdir /home/user/myproject
exec myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock myproject.wsgi:application
終了したら、ファイルを保存して閉じます。
次のように入力してGunicornサービスを開始します。
sudo service gunicorn start
NunicornをGunicornにプロキシパスするように構成する
Gunicornがセットアップされたので、プロセスにトラフィックを渡すようにNginxを構成する必要があります。
Nginxのsites-available
ディレクトリに新しいサーバーブロックを作成して開くことから始めます。
sudo nano /etc/nginx/sites-available/myproject
内部で、新しいサーバーブロックを開きます。 まず、このブロックが通常のポート80でリッスンし、サーバーのドメイン名またはIPアドレスに応答するように指定することから始めます。
server {
listen 80;
server_name server_domain_or_IP;
}
次に、ファビコンを見つける際の問題を無視するようにNginxに指示します。 また、~/myproject/static
ディレクトリで収集した静的アセットの場所も示します。 これらのファイルにはすべて「/ static」の標準URIプレフィックスが付いているため、これらの要求に一致する場所ブロックを作成できます。
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/myproject;
}
}
最後に、他のすべてのリクエストに一致するlocation / {}
ブロックを作成します。 この場所の中に、Nginxインストールに含まれている標準のproxy_params
ファイルを含めてから、Gunicornプロセスが作成したソケットにトラフィックを渡します。
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/user/myproject/myproject.sock;
}
}
完了したら、ファイルを保存して閉じます。 これで、ファイルをsites-enabled
ディレクトリにリンクして有効にできます。
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
次のように入力して、構文エラーのNginx設定をテストします。
sudo nginx -t
エラーが報告されていない場合は、次のように入力してNginxを再起動します。
sudo service nginx restart
これで、サーバーのドメインまたはIPアドレスにアクセスして、アプリケーションを表示できるようになります。
結論
このガイドでは、独自の仮想環境でDjangoプロジェクトを設定しました。 Djangoがクライアントリクエストを処理できるように、クライアントリクエストを変換するようにGunicornを設定しました。 その後、Nginxを設定してリバースプロキシとして機能し、クライアント接続を処理し、クライアントのリクエストに応じて正しいプロジェクトを提供します。
Djangoは、多くの共通部分を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。 この記事で説明した一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。