序章
Djangoは、PythonアプリケーションまたはWebサイトをすばやく立ち上げるのに役立つ強力なWebフレームワークです。 Djangoには、コードをローカルでテストするための簡略化された開発サーバーが含まれていますが、本番環境に少しでも関連する場合は、より安全で強力なWebサーバーが必要です。
このガイドでは、Python仮想環境にDjangoをインストールして構成する方法を示します。 次に、アプリケーションの前にApacheをセットアップして、アプリケーションロジックを必要とするリクエストをDjangoアプリに渡す前に、クライアントリクエストを直接処理できるようにします。 これは、WSGIインターフェイス仕様を介してDjangoと通信できるmod_wsgi
Apacheモジュールを使用して行います。
前提条件と目標
このガイドを完了するには、sudo
権限が設定されたroot以外のユーザーがいる新しいDebian8サーバーインスタンスが必要です。 初期サーバーセットアップガイドを実行すると、これをセットアップする方法を学ぶことができます。
Python仮想環境内にDjangoをインストールします。 プロジェクトに固有の環境にDjangoをインストールすると、プロジェクトとその要件を個別に処理できるようになります。
アプリケーションを起動して実行したら、DjangoアプリとインターフェイスするようにApacheを構成します。 これは、mod_wsgi
Apacheモジュールを使用して行われます。このモジュールは、HTTPリクエストをWSGIと呼ばれる仕様で定義された予測可能なアプリケーション形式に変換できます。 WSGIの詳細については、このガイドのリンクされたセクションを参照してください。
始めましょう。
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仮想環境を構成する
最初のステップは、Python仮想環境を作成して、Djangoプロジェクトがシステムのツールや作業中の他のPythonプロジェクトから分離されるようにすることです。 これらの環境を作成するには、virtualenv
コマンドをインストールする必要があります。 このパッケージはpip
を使用して入手できます。
Python 2 を使用している場合は、次のように入力します。
- sudo pip install virtualenv
Python 3 を使用している場合は、次のように入力します。
- sudo pip3 install virtualenv
virtualenv
をインストールすると、プロジェクトの形成を開始できます。 プロジェクトを保持するディレクトリを作成し、そのディレクトリに移動します。
- mkdir ~/myproject
- cd ~/myproject
プロジェクトディレクトリ内で、次のように入力してPython仮想環境を作成します。
- virtualenv myprojectenv
これにより、myproject
ディレクトリ内にmyprojectenv
というディレクトリが作成されます。 内部には、Pythonのローカルバージョンとpip
のローカルバージョンがインストールされます。 これを使用して、プロジェクト用に分離されたPython環境をインストールおよび構成できます。
プロジェクトのPython要件をインストールする前に、仮想環境をアクティブ化する必要があります。 次のように入力すると、次のように入力できます。
- source ~/myproject/myprojectenv/bin/activate
プロンプトが変化して、Python仮想環境内で操作していることを示します。 (myprojectenv)user@host:~/myproject$
のようになります。
仮想環境をアクティブにして、pip
のローカルインスタンスを使用してDjangoをインストールします。
注:仮想環境では、独自のバージョンのPythonと関連ツールを使用します。 Python2またはPython3のどちらを使用しているかに関係なく、仮想環境がアクティブ化されている場合は、pip
コマンドを使用する必要があります(pip3
ではありません)。
- pip install django
これにより、Python仮想環境内にDjangoパッケージがインストールされます。
新しいDjangoプロジェクトを作成して構成する
Djangoが仮想環境にインストールされたので、実際のDjangoプロジェクトファイルを作成できます。
Djangoプロジェクトを作成する
~/myproject
にはすでに親プロジェクトディレクトリがあるので、ここにファイルをインストールするようにDjangoに指示します。 このコマンドは、実際のコードを含む第2レベルのディレクトリを作成します。 また、現在のプロジェクトディレクトリに管理スクリプトを配置します。 正しいディレクトリ構造を実現するための鍵は、プロジェクト名の後に親ディレクトリをリストすることです。
- django-admin.py startproject myproject ~/myproject
最終的には、次のようなディレクトリ構造になります。
.
└── ./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 ~/myproject/myproject/settings.py
このガイドでは、わかりやすくするためにデフォルトのSQLiteデータベースを使用するため、実際にはあまり変更する必要はありません。 応答するドメインを制限するための許可されたホストの構成と、静的ファイルディレクトリの構成に焦点を当てます。Djangoは静的ファイルを配置して、Webサーバーがこれらを簡単に提供できるようにします。
ALLOWED_HOSTS
行を見つけることから始めます。 角かっこ内に、サーバーのパブリックIPアドレス、ドメイン名、またはその両方を入力します。 通常のPythonリストのように、各値は引用符で囲み、コンマで区切る必要があります。 127.0.0.1
や127.0.1.1
などのローカルアドレスも追加することをお勧めします。
. . .
ALLOWED_HOSTS = ["server_domain_or_IP", "127.0.0.1", "127.0.1.1"]
. . .
ファイルの最後に、DjangoのSTATIC_ROOT
を設定します。 Djangoは、すべての静的アセットを収集して既知のディレクトリに出力できるため、Webサーバーはそれらを直接提供できます。 Pythonを少し使用して、プロジェクトのメインディレクトリにある「static」というディレクトリを使用するように指示します。
. . .
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
終了したら、ファイルを保存して閉じます。
プロジェクトの初期設定を完了する
これで、管理スクリプトを使用して、初期データベーススキーマをSQLiteデータベースに移行できます。
- cd ~/myproject
- ./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
Webブラウザーで、サーバーのドメイン名またはIPアドレスにアクセスし、その後に:8000
を続けます。
http://server_domain_or_IP:8000
デフォルトのDjangoインデックスページが表示されます。
アドレスバーのURLの末尾に/admin
を追加すると、createsuperuser
コマンドで作成した管理用ユーザー名とパスワードの入力を求められます。
認証後、デフォルトのDjango管理インターフェースにアクセスできます。
探索が終了したら、ターミナルウィンドウでCTRL-Cを押して、開発サーバーをシャットダウンします。
とりあえずDjangoの使用は終了したので、次のように入力して仮想環境から戻ることができます。
- deactivate
シェルプロンプトの(myprojectenv)
プレフィックスが消えるはずです。
Apacheを構成する
Djangoプロジェクトが機能しているので、Apacheをフロントエンドとして構成できます。 受信したクライアント接続は、Djangoアプリケーションがmod_wsgi
モジュールを使用して期待するWSGI形式に変換されます。 これは、以前のインストール時に自動的に有効になっているはずです。
WSGIパスを構成するには、デフォルトの仮想ホストファイルを編集する必要があります。
- sudo nano /etc/apache2/sites-available/000-default.conf
ファイルにすでに存在するディレクティブを保持できます。 いくつかのアイテムを追加する必要があります。
まず、静的ファイルを構成しましょう。 エイリアスを使用して、/static
で始まるリクエストをプロジェクトフォルダー内の「静的」ディレクトリにマップするようにApacheに指示します。 以前にそこで静的アセットを収集しました。 エイリアスを設定してから、ディレクトリブロックを使用して問題のディレクトリへのアクセスを許可します。
<VirtualHost *:80>
. . .
Alias /static /home/sammy/myproject/static
<Directory /home/sammy/myproject/static>
Require all granted
</Directory>
</VirtualHost>
次に、Djangoコードが保存されている第2レベルのプロジェクトディレクトリ内のwsgi.py
ファイルへのアクセスを許可します。 これを行うには、内部にファイルセクションがあるディレクトリセクションを使用します。 このネストされた構成内のファイルへのアクセスを許可します。
<VirtualHost *:80>
. . .
Alias /static /home/sammy/myproject/static
<Directory /home/sammy/myproject/static>
Require all granted
</Directory>
# Next, add the following directory block
<Directory /home/sammy/myproject/myproject>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
これを設定すると、WSGIパスを実際に処理するファイルの部分を構築する準備が整います。 デーモンモードを使用してWSGIプロセスを実行します。これは、推奨される構成です。 WSGIDaemonProcess
ディレクティブを使用してこれを設定できます。
このディレクティブは、プロセスに任意の名前を付けます。 一貫性を保つためにmyproject
を使用します。 その後、Apacheが必要となる可能性のあるすべてのコンポーネントを見つけることができるPythonホームをセットアップしました。 仮想環境を使用したので、これをベース仮想環境ディレクトリに直接向けることができます。 その後、Djangoプロジェクトのベースを指すようにPythonパスを設定します。
次に、プロセスグループを指定する必要があります。 これは、WSGIDaemonProcess
ディレクティブ(この場合はmyproject
)に選択したのと同じ名前を指している必要があります。 最後に、Apacheがルートドメインのリクエストをwsgi.py
ファイルに渡すようにスクリプトエイリアスを設定する必要があります。
<VirtualHost *:80>
. . .
Alias /static /home/sammy/myproject/static
<Directory /home/sammy/myproject/static>
Require all granted
</Directory>
<Directory /home/sammy/myproject/myproject>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess myproject python-home=/home/sammy/myproject/myprojectenv python-path=/home/sammy/myproject
WSGIProcessGroup myproject
WSGIScriptAlias / /home/sammy/myproject/myproject/wsgi.py
</VirtualHost>
これらの変更が終了したら、ファイルを保存して閉じます。
いくつかの権限の問題のまとめ
この記事で使用されているデフォルトのSQLiteデータベースを使用している場合は、Apacheプロセスにこのファイルへのアクセスを許可する必要があります。
そのための最初のステップは、データベースのグループ所有者が読み取りと書き込みを行えるようにアクセス許可を変更することです。 データベースファイルはデフォルトでdb.sqlite3
と呼ばれ、ベースプロジェクトディレクトリに配置する必要があります。
- chmod 664 ~/myproject/db.sqlite3
- chmod 775 ~/myproject
その後、Apacheが実行されるグループ、www-data
グループ、ファイルのグループ所有権を指定する必要があります。
- sudo chown :www-data ~/myproject/db.sqlite3
ファイルに書き込むには、データベースの親ディレクトリに対する所有権をApacheグループに与える必要もあります。
- sudo chown :www-data ~/myproject
ファイアウォールを介して再度調整する必要があります。 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’sEncryptの無料のSSL証明書を使用することです。 これを設定する方法については、Debian8でのApacheのLet’sEncryptガイドに従ってください。
アプリケーションのドメイン名を持っていない場合、これを自分の目的またはテストに使用している場合は、いつでも自己署名証明書を作成できます。 これを設定する方法については、Debian8でApacheの自己署名SSL証明書を作成するためのガイドを参照してください。
結論
このガイドでは、独自の仮想環境でDjangoプロジェクトをセットアップしました。 クライアントリクエストを処理し、Djangoアプリとインターフェイスするように、mod_wsgi
を使用してApacheを構成しました。
Djangoは、多くの一般的な要素を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。 この記事で説明する一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。