前書き
Djangoは強力なWebフレームワークであり、PythonアプリケーションまたはWebサイトを迅速に立ち上げるのに役立ちます。 Djangoには、ローカルでコードをテストするための簡素化された開発サーバーが含まれていますが、わずかに生産関連の場合でも、より安全で強力なWebサーバーが必要です。
このガイドでは、DjangoをPython仮想環境にインストールして設定する方法を示します。 次に、アプリケーションロジックを必要とするリクエストをDjangoアプリに渡す前に、クライアントリクエストを直接処理できるように、アプリケーションの前にApacheをセットアップします。 これを行うには、WSGIインターフェース仕様を介してDjangoと通信できるApacheモジュール「+ mod_wsgi +」を使用します。
前提条件と目標
このガイドを完了するには、 `+ sudo +`特権が設定された非rootユーザーを持つ新しいDebian 8サーバーインスタンスが必要です。 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8 [初期サーバーセットアップガイド]を実行して、これを設定する方法を学ぶことができます。
Python仮想環境内にDjangoをインストールします。 プロジェクト固有の環境にDjangoをインストールすると、プロジェクトとその要件を個別に処理できます。
アプリケーションを起動して実行したら、DjangoアプリとインターフェイスするようにApacheを構成します。 これは、HTTPリクエストをWSGIと呼ばれる仕様で定義された予測可能なアプリケーション形式に変換できる、 + mod_wsgi +
Apacheモジュールでこれを行います。 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 [このガイド]。
始めましょう。
Debianリポジトリからパッケージをインストールする
プロセスを開始するには、必要なすべてのアイテムをDebianリポジトリからダウンロードしてインストールします。 これには、Apache Webサーバー、Djangoアプリとのインターフェースに使用される `+ mod_wsgi `モジュール、およびPython関連ツールのダウンロードに使用できるPythonパッケージマネージャーである ` pip +`が含まれます。
必要なものをすべて取得するには、サーバーのローカルパッケージインデックスを更新してから、適切なパッケージをインストールします。
-
Python 2 *でDjangoを使用している場合、必要なコマンドは次のとおりです。
sudo apt-get update
sudo apt-get install python-pip apache2 libapache2-mod-wsgi
代わりに、* Python 3 *でDjangoを使用している場合、代替のApacheモジュールと `+ pip +`パッケージが必要になります。 この場合の適切なコマンドは次のとおりです。
sudo apt-get update
sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3
Debianリポジトリのコンポーネントができたので、Djangoプロジェクトの作業を開始できます。
Python仮想環境を構成する
最初のステップは、Djangoプロジェクトがシステムのツールや作業中の他のPythonプロジェクトから分離されるように、Python仮想環境を作成することです。 これらの環境を作成するには、 `+ virtualenv `コマンドをインストールする必要があります。 このパッケージは、 ` pip`を使用して取得できます。
-
Python 2 *を使用している場合は、次を入力します。
sudo pip install virtualenv
-
Python 3 *を使用している場合は、次を入力します。
sudo pip3 install virtualenv
`+ virtualenv +`をインストールすると、プロジェクトの形成を開始できます。 プロジェクトを保持するディレクトリを作成し、そのディレクトリに移動します。
mkdir ~/
cd ~/
プロジェクトディレクトリ内で、次のように入力してPython仮想環境を作成します。
virtualenv
これにより、「」ディレクトリ内に「」というディレクトリが作成されます。 内部では、Pythonのローカルバージョンと `+ pip +`のローカルバージョンがインストールされます。 これを使用して、プロジェクトの分離されたPython環境をインストールおよび構成できます。
プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。 次のように入力して、それを行うことができます。
source ~///bin/activate
プロンプトが変わり、Python仮想環境内で操作していることを示す必要があります。 次のようになります: +()@:〜/ $ +
。
仮想環境をアクティブにして、 `+ pip +`のローカルインスタンスでDjangoをインストールします。
pip install django
これにより、Python仮想環境内にDjangoパッケージがインストールされます。
新しいDjangoプロジェクトを作成して構成する
Djangoが仮想環境にインストールされたので、実際のDjangoプロジェクトファイルを作成できます。
Djangoプロジェクトを作成する
すでに親プロジェクトディレクトリが `+〜/ +`にあるため、ここにファイルをインストールするようDjangoに指示します。 このコマンドは、実際のコードを含む第2レベルのディレクトリを作成します。 また、現在のプロジェクトディレクトリに管理スクリプトを配置します。 正しいディレクトリ構造を実現するための鍵は、プロジェクト名の後に親ディレクトリをリストすることです。
django-admin.py startproject ~/
最終的には次のようなディレクトリ構造になります。
.
└── ./myproject/ # parent project directory
├── manage.py # Django management script
├── myproject/ # project code directory
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myprojectenv/ # project virtual environment directory
└── . . .
ディレクトリ構造がこれと一致することを確認すると、後でエラーを最小限に抑えることができます。
プロジェクト設定を調整する
新しく作成したプロジェクトファイルで最初に行うべきことは、設定を調整することです。 テキストエディターで設定ファイルを開きます。
nano ~///settings.py
このガイドでは、簡単にするためにデフォルトのSQLiteデータベースを使用するため、実際にあまり変更する必要はありません。 許可されたホストを構成して応答するドメインを制限し、Djangoが静的ファイルを配置する静的ファイルディレクトリを構成して、Webサーバーがこれらを簡単に処理できるようにします。
`+ ALLOWED_HOSTS `行を見つけることから始めます。 角括弧内に、サーバーのパブリックIPアドレス、ドメイン名、またはその両方を入力します。 各値は引用符で囲み、通常のPythonリストのようにコンマで区切る必要があります。 「+127.0.0.1」や「127.0.1.1」などのローカルアドレスも追加することをお勧めします。
〜/ myproject / myproject / settings.py
. . .
ALLOWED_HOSTS = ["", "127.0.0.1", "127.0.1.1"]
. . .
ファイルの下部で、Djangoの `+ STATIC_ROOT +`を設定します。 Djangoは、すべての静的資産を収集して既知のディレクトリに出力し、Webサーバーがそれらを直接提供できるようにします。 プロジェクトのメインディレクトリで「静的」というディレクトリを使用するように、Pythonを少し使用します。
〜/ myproject / myproject / settings.py
. . .
STATIC_URL = '/static/'
完了したら、ファイルを保存して閉じます。
初期プロジェクトのセットアップを完了する
これで、管理スクリプトを使用して初期データベーススキーマをSQLiteデータベースに移行できます。
cd ~/
./manage.py makemigrations
./manage.py migrate
次を入力して、プロジェクトの管理ユーザーを作成します。
./manage.py createsuperuser
ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。
次のように入力することにより、すべての静的コンテンツを `+ STATIC_ROOT +`で定義したディレクトリの場所に収集できます。
./manage.py collectstatic
操作を確認する必要があります。 予想どおり、静的ファイルはプロジェクトディレクトリ内の「+ static +」というディレクトリに配置されます。
ポート8000で実行するDjango開発サーバーへのトラフィックを許可するには、ファイアウォール設定を調整する必要があります。
`+ ufw +`ファイアウォールを実行している場合、次を入力してポート8000へのトラフィックを許可できます。
sudo ufw allow 8000
代わりに `+ iptables +`を実行している場合、必要な正確なコマンドは現在のファイアウォール設定によって異なります。 ほとんどの構成では、このコマンドが機能するはずです。
sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT
最後に、次のコマンドでDjango開発サーバーを起動して、プロジェクトをテストできます。
./manage.py runserver 0.0.0.0:8000
ウェブブラウザで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に「:8000」を入力します。
http://:8000
デフォルトのDjangoインデックスページが表示されます。
image:https://assets.digitalocean.com/articles/django_uwsgi_nginx_1404/sample_site.png [Djangoデフォルトインデックス]
アドレスバーのURLの末尾に「+ / admin 」を追加すると、「 createsuperuser」コマンドで作成した管理ユーザー名とパスワードの入力を求められます。
画像:https://assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_login.png [Django admin login]
認証後、デフォルトのDjango管理インターフェースにアクセスできます。
image:https://assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_interface.png [Django管理インターフェース]
探索が終了したら、ターミナルウィンドウでCTRL-Cを押して、開発サーバーをシャットダウンします。
とりあえずDjangoを使い終わったので、次のように入力して仮想環境から戻ることができます。
deactivate
シェルプロンプトの `()`プレフィックスが消えます。
Apacheを構成する
Djangoプロジェクトが機能するようになったので、Apacheをフロントエンドとして設定できます。 受信したクライアント接続は、Djangoアプリケーションが `+ mod_wsgi +`モジュールを使用することを想定しているWSGI形式に変換されます。 これは、以前のインストール時に自動的に有効になっているはずです。
WSGIパスを設定するには、デフォルトの仮想ホストファイルを編集する必要があります。
sudo nano /etc/apache2/sites-available/000-default.conf
ファイルに既に存在するディレクティブを保持できます。 追加のアイテムを追加するだけです。
まず、静的ファイルを構成しましょう。 エイリアスを使用して、 `+ / static +`で始まるすべてのリクエストをプロジェクトフォルダー内の「static」ディレクトリにマッピングするようApacheに指示します。 静的な資産は以前に収集しました。 エイリアスを設定し、ディレクトリブロックを使用して問題のディレクトリへのアクセスを許可します。
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
. . .
Alias /static /home///static
<Directory /home///static>
Require all granted
</Directory>
</VirtualHost>
次に、Djangoコードが保存されている第2レベルのプロジェクトディレクトリ内の `+ wsgi.py +`ファイルへのアクセスを許可します。 これを行うには、ファイルセクションを中に含むディレクトリセクションを使用します。 このネストされた構造内のファイルへのアクセスを許可します。
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
. . .
Alias /static /home///static
<Directory /home///static>
Require all granted
</Directory>
<Directory /home///>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
これを構成したら、WSGIパスを実際に処理するファイルの部分を作成する準備が整います。 デーモンモードを使用して、推奨される構成であるWSGIプロセスを実行します。 これを設定するには、 `+ WSGIDaemonProcess +`ディレクティブを使用できます。
このディレクティブは、プロセスの任意の名前を取ります。 一貫性を保つために「++」を使用します。 その後、必要なすべてのコンポーネントをApacheが検索できるPythonホームをセットアップします。 仮想環境を使用したため、これをベース仮想環境ディレクトリに直接ポイントできます。 その後、Djangoプロジェクトのベースを指すようにPythonパスを設定します。
次に、プロセスグループを指定する必要があります。 これは、 + WSGIDaemonProcess +`ディレクティブ(この場合は `+ myproject +
)で選択したのと同じ名前を指す必要があります。 最後に、Apacheがルートドメインのリクエストを `+ wsgi.py +`ファイルに渡すように、スクリプトエイリアスを設定する必要があります。
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
. . .
Alias /static /home///static
<Directory /home///static>
Require all granted
</Directory>
<Directory /home///>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess python-home=/home/// python-path=/home//myproject
WSGIProcessGroup
WSGIScriptAlias / /home////wsgi.py
</VirtualHost>
これらの変更が完了したら、ファイルを保存して閉じます。
いくつかのパーミッションの問題をまとめる
この記事で使用するデフォルトのSQLiteデータベースを使用している場合、Apacheプロセスがこのファイルにアクセスできるようにする必要があります。
これを行うための最初のステップは、データベースのグループ所有者が読み取りおよび書き込みできるように権限を変更することです。 データベースファイルはデフォルトで「+ db.sqlite3 +」と呼ばれ、ベースプロジェクトディレクトリに配置する必要があります。
chmod 664 ~//db.sqlite3
chmod 775 ~/
その後、Apacheが実行されるグループ、 `+ www-data`グループ、ファイルのグループ所有権を与える必要があります。
sudo chown :www-data ~//db.sqlite3
ファイルに書き込むために、Apacheグループにデータベースの親ディレクトリの所有権を与える必要もあります。
sudo chown :www-data ~/
ファイアウォールを再度調整する必要があります。 Apacheを介してプロキシしているため、ポート8000を開く必要がなくなり、そのルールを削除できます。 次に、例外を追加して、Apacheプロセスへのトラフィックを許可できます。
`+ ufw +`を使用している場合、次のように入力してこれを行うことができます。
sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'
`+ iptables +`を使用している場合、適切なコマンドは次のようになります。
sudo iptables -D INPUT -p tcp --dport 8000 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
Apacheファイルをチェックして、構文エラーが発生していないことを確認します。
sudo apache2ctl configtest
出力の最後の行が次のように見える限り、ファイルは良好な状態です。
Output. . .
Syntax OK
これらの手順が完了すると、Apacheサービスを再起動して、行った変更を実装する準備が整います。 次を入力してApacheを再起動します。
sudo systemctl restart apache2
これで、ポートを指定せずにサーバーのドメイン名またはIPアドレスにアクセスして、Djangoサイトにアクセスできるようになります。 通常のサイトと管理インターフェイスは期待どおりに機能するはずです。
次のステップ
アプリケーションがアクセス可能であることを確認した後、アプリケーションへのトラフィックを保護することが重要です。
アプリケーションのドメイン名がある場合、アプリケーションを保護する最も簡単な方法は、Let’s Encryptの無料のSSL証明書を使用することです。 Debian 8上のApacheの暗号化ガイドをご覧ください。これを設定します。
アプリケーションのドメイン名を*所有していない*場合、それを自分の目的やテストに使用している場合は、いつでも自己署名証明書を作成できます。 https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-debian-8 [自己作成ガイド]でこれを設定する方法を学ぶことができます-Debian 8上のApacheのSSL証明書に署名しました。
結論
このガイドでは、独自の仮想環境でDjangoプロジェクトを設定しました。 クライアントリクエストを処理し、Djangoアプリとやり取りするために、 `+ mod_wsgi +`でApacheを設定しました。
Djangoは、多くの共通部分を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。 この記事で説明した一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。