Ubuntu 16.04でApacheとmod_wsgiを使用してDjangoアプリケーションを提供する方法

前書き

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

このガイドでは、DjangoをPython仮想環境にインストールして設定する方法を示します。 次に、アプリケーションロジックを必要とするリクエストをDjangoアプリに渡す前に、クライアントリクエストを直接処理できるように、アプリケーションの前にApacheをセットアップします。 これを行うには、WSGIインターフェース仕様を介してDjangoと通信できるApacheモジュール「+ mod_wsgi +」を使用します。

前提条件と目標

このガイドを完了するには、 `+ sudo +`特権が設定された非rootユーザーを持つ新しいUbuntu 16.04サーバーインスタンスが必要です。 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [初期サーバーセットアップガイド]を実行して、これを設定する方法を学ぶことができます。

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 [このガイド]。

始めましょう。

Ubuntuリポジトリからパッケージをインストールする

プロセスを開始するには、Ubuntuリポジトリから必要なすべてのアイテムをダウンロードしてインストールします。 これには、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

Python仮想環境を構成する

Ubuntuリポジトリのコンポーネントができたので、Djangoプロジェクトの作業を開始できます。 最初のステップは、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をインストールします。

Note

pip install django

新しいDjangoプロジェクトを作成して構成する

Djangoが仮想環境にインストールされたので、実際のDjangoプロジェクトファイルを作成できます。

Djangoプロジェクトを作成する

すでにプロジェクトディレクトリがあるので、ここでファイルをインストールするようDjangoに指示します。 通常の実際のコードで第2レベルのディレクトリを作成し、このディレクトリに管理スクリプトを配置します。 これの鍵は、Djangoに現在のディレクトリにファイルを作成するように指示する最後のドットです。

django-admin.py startproject  .

プロジェクト設定を調整する

新しく作成したプロジェクトファイルで最初に行うべきことは、設定を調整することです。 テキストエディターで設定ファイルを開きます。

nano /settings.py

このガイドでは、簡単にするためにデフォルトのSQLiteデータベースを使用するため、実際にあまり変更する必要はありません。 許可されたホストを構成して応答するドメインを制限し、Djangoが静的ファイルを配置する静的ファイルディレクトリを構成して、Webサーバーがこれらを簡単に処理できるようにします。

`+ ALLOWED_HOSTS +`行を見つけることから始めます。 角括弧内に、サーバーのパブリックIPアドレス、ドメイン名、またはその両方を入力します。 各値は引用符で囲み、通常のPythonリストのようにコンマで区切る必要があります。

〜/ myproject / myproject / settings.py

. . .
ALLOWED_HOSTS = [""]
. . .

ファイルの最後に、このディレクトリを設定する行を追加します。 Djangoは `+ STATIC_ROOT +`設定を使用して、これらのファイルが保存されるディレクトリを決定します。 プロジェクトのメインディレクトリで「静的」というディレクトリを使用するように、Pythonを少し使用します。

〜/ myproject / myproject / settings.py

. . .

STATIC_URL = '/static/'

完了したら、ファイルを保存して閉じます。

初期プロジェクトのセットアップを完了する

これで、管理スクリプトを使用して初期データベーススキーマをSQLiteデータベースに移行できます。

cd ~/
./manage.py makemigrations
./manage.py migrate

次を入力して、プロジェクトの管理ユーザーを作成します。

./manage.py createsuperuser

ユーザー名を選択し、メールアドレスを入力し、パスワードを選択して確認する必要があります。

次のように入力して、すべての静的コンテンツを構成したディレクトリの場所に収集できます。

./manage.py collectstatic

操作を確認する必要があります。 静的ファイルは、プロジェクトディレクトリ内の「+ static +」というディレクトリに配置されます。

これで、ファイアウォール設定を調整して、ポート8000​​で実行するDjango開発サーバーへのトラフィックを許可できます。 前提条件の初期サーバーセットアップガイドに従った場合、現在UFWファイアウォールを有効にする必要があります。

次のように入力して、開発サーバーへの接続を許可します。

sudo ufw allow 8000

最後に、次のコマンドで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

その後、Apacheが実行されるグループ、 `+ www-data`グループ、ファイルのグループ所有権を与える必要があります。

sudo chown :www-data ~//db.sqlite3

ファイルに書き込むために、Apacheグループにデータベースの親ディレクトリの所有権を与える必要もあります。

sudo chown :www-data ~/

ファイアウォールを再度調整する必要があります。 Apacheを介してプロキシしているため、ポート8000​​を開く必要がなくなり、そのルールを削除できます。 次に、Apacheプロセスへのトラフィックを許可する例外を追加できます。

sudo ufw delete allow 8000
sudo ufw allow 'Apache Full'

Apacheファイルをチェックして、構文エラーが発生していないことを確認します。

sudo apache2ctl configtest

出力の最後の行が次のように見える限り、ファイルは良好な状態です。

Output. . .
Syntax OK

これらの手順が完了すると、Apacheサービスを再起動して、行った変更を実装する準備が整います。 次を入力してApacheを再起動します。

sudo systemctl restart apache2

これで、ポートを指定せずにサーバーのドメイン名またはIPアドレスにアクセスして、Djangoサイトにアクセスできるようになります。 通常のサイトと管理インターフェイスは期待どおりに機能するはずです。

次のステップ

アプリケーションがアクセス可能であることを確認した後、アプリケーションへのトラフィックを保護することが重要です。

アプリケーションのドメイン名がある場合、アプリケーションを保護する最も簡単な方法は、Let’s Encryptの無料のSSL証明書を使用することです。 16.04のApacheの暗号化ガイドに従って学習してください。これを設定する方法。

アプリケーションのドメイン名を*所有していない*場合、それを自分の目的やテストに使用している場合は、いつでも自己署名証明書を作成できます。 https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-16-でこれを設定する方法を学ぶことができます04 [Ubuntu 16.04でのApacheの自己署名SSL証明書の作成に関するガイド]。

結論

このガイドでは、独自の仮想環境でDjangoプロジェクトを設定しました。 クライアントリクエストを処理し、Djangoアプリとやり取りするために、 `+ mod_wsgi +`でApacheを設定しました。

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

Related