序章

Djangoは、PythonアプリケーションまたはWebサイトを立ち上げるのに役立つ強力なWebフレームワークです。 Djangoには、コードをローカルでテストするための簡略化された開発サーバーが含まれていますが、本番環境に少しでも関連する場合は、より安全で強力なWebサーバーが必要です。

このガイドでは、Djangoアプリケーションをサポートおよび提供するためにUbuntu14.04にいくつかのコンポーネントをインストールして構成する方法を示します。 デフォルトのSQLiteデータベースを使用する代わりに、PostgreSQLデータベースをセットアップします。 アプリケーションとインターフェイスするようにGunicornアプリケーションサーバーを構成します。 次に、GunicornにリバースプロキシするようにNginxを設定し、アプリを提供するためのセキュリティ機能とパフォーマンス機能にアクセスできるようにします。

前提条件と目標

このガイドを完了するには、sudo権限が設定されたroot以外のユーザーがいる新しいUbuntu14.04サーバーインスタンスが必要です。 初期サーバーセットアップガイドを実行すると、これをセットアップする方法を学ぶことができます。

仮想環境内に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、およびpsycopg2PostgreSQLアダプターをpipのローカルインスタンスとともにインストールします。

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インデックスページが表示されます。

Django index page

アドレスバーのURLの末尾に/adminを追加すると、createsuperuserコマンドで作成した管理ユーザー名とパスワードの入力を求められます。

Django admin login

認証後、デフォルトのDjango管理インターフェースにアクセスできます。

Django admin interface

探索が終了したら、ターミナルウィンドウで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仕様の詳細については、ここをクリックをクリックしてください。

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

これで、Djangoアプリケーションの構成が完了しました。 次のように入力すると、仮想環境から戻ることができます。

deactivate

GunicornUpstartファイルを作成する

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

Nginxを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は、多くの一般的な要素を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。 この記事で説明する一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。