16.04前書きDjangoは強力なWebフレームワークであり、PythonアプリケーションまたはWebサイトの開発を支援します。Djangoには、ローカルでコードをテストするための簡素化された開発サーバーが含まれていますが、わずかに生産関連の場合でも、より安全で強力なWebサーバーが必要です。16.04にいくつかのコンポーネントをインストールおよび構成する方法を示します。uWSGIアプリケーションコンテナーサーバーを構成して、アプリケーションとインターフェイスします。次に、NginxをセットアップしてuWSGIへのリバースプロキシを行い、セキュリティとパフォーマンス機能にアクセスしてアプリを提供します。16.04サーバーインスタンスが必要です。[初期サーバーセットアップガイド]を実行して、これを設定する方法を学ぶことができます。2つの異なる仮想環境内にDjangoをインストールします。これにより、プロジェクトとその要件を個別に処理できます。マルチプロジェクト環境でステップを実行できるように、2つのサンプルプロジェクトを作成します。アプリケーションを作成したら、uWSGIアプリケーションサーバーをインストールして構成します。これは、アプリケーションへのインターフェイスとして機能し、HTTPを使用してクライアント要求をPython呼び出しに変換し、アプリケーションが処理できるようにします。次に、高性能な接続処理メカニズムと実装しやすいセキュリティ機能を活用するために、uWSGIの前にNginxをセットアップします。VirtualEnvおよびVirtualEnvWrapperのインストールと構成Djangoプロジェクトを独自の仮想環境にインストールして、それぞれの要件を分離します。+`をインストールします。+`を使用して、これらのコンポーネントの両方をインストールします。このユーティリティは、Ubuntuリポジトリからインストールできます。*を使用してDjangoプロジェクトをビルドする場合は、次のように入力します。*を使用している場合は、次を入力します。virtualenvwrapper`をグローバルにインストールできます。+`を最新バージョンにアップグレードします。*を使用している場合は、次を入力します。*を使用している場合は、次を入力します。`スクリプトで動作するために必要な情報でシェルを設定できます。」というホームフォルダーのディレクトリ内に配置されます。+」と呼ばれる環境変数を通じて設定されます。これをシェル初期化スクリプトに追加して、仮想環境ラッパースクリプトをソースにできます。+`コマンドを使用している場合は、シェル初期化スクリプトにも追加の行を追加する必要があります。~/.bashrc使用しているPythonのバージョンに関係なく、次のコマンドを実行する必要があります。~/.bashrc次に、シェル初期化スクリプトを入手して、現在のセッションでこの機能を使用できるようにします。+」というディレクトリがあり、仮想環境情報が保持されます。Djangoプロジェクトを作成する仮想環境ツールができたので、2つの仮想環境を作成し、それぞれにDjangoをインストールして、2つのプロジェクトを開始します。+`スクリプトが使用可能にするコマンドを使用することで、仮想環境を簡単に作成できます。次のように入力して、最初のサイトまたはプロジェクトの名前で最初の仮想環境を作成します。+`がインストールされ、環境がアクティブになります。プロンプトが変わり、新しい仮想環境内で操作していることが示されます。括弧内の値は、仮想環境の名前です。+`を介してインストールされたソフトウェアは、グローバルシステムではなく仮想環境にインストールされます。これにより、プロジェクトごとにパッケージを分離できます。最初のステップは、Django自体をインストールすることです。djangoDjangoをインストールしたら、次のように入力して最初のサンプルプロジェクトを作成できます。startprojectこれにより、ホームディレクトリ内に「++」というディレクトリが作成されます。この中には、プロジェクトのさまざまな側面を処理するために使用される管理スクリプトと、実際のプロジェクトコードを格納するために使用される同じ名前の別のディレクトリがあります。サンプルプロジェクトの最小要件の設定を開始できるように、第1レベルのディレクトリに移動します。~/まず、データベースを移行して、プロジェクトで使用するSQLiteデータベースを初期化します。必要に応じて、アプリケーションに代替データベースを設定できますが、これはこのガイドの範囲外です。+」というデータベースファイルが作成されます。これで、次のように入力して管理ユーザーを作成できます。+)には次の内容が含まれているはずです。+:Djangoプロジェクト管理スクリプト。+:Djangoプロジェクトパッケージ。+」ファイルが含まれている必要があります。+:サイト情報を保存するために使用されるSQLiteデータベースファイル。次に、テキストエディターでプロジェクトの設定ファイルを開きます。+`ディレクティブを見つけることから始めます。これは、Djangoインスタンスへの接続に使用できるサーバーのアドレスまたはドメイン名のリストを定義します。*ヘッダーを持つ着信リクエストは例外を発生させます。Djangoでは、特定のクラスのセキュリティ脆弱性を防ぐために、これを設定する必要があります。角括弧内に、Djangoサーバーに関連付けられているIPアドレスまたはドメイン名をリストします。各項目は、引用符で囲み、エントリをコンマで区切ってリストする必要があります。ドメイン全体とサブドメインのリクエストを希望する場合は、エントリの先頭にピリオドを追加します。以下のスニペットには、デモンストレーションに使用されるコメントアウトされた例がいくつかあります。]Nginxをセットアップしてサイトを提供するため、サイトの静的アセットを保持するディレクトリを構成する必要があります。これにより、Nginxはこれらを直接提供できるようになり、パフォーマンスにプラスの影響があります。+」というディレクトリに配置するようDjangoに指示します。この動作を構成するには、ファイルの最後に次の行を追加します。'/static/'完了したら、ファイルを保存して閉じます。次に、サイトの静的要素を収集し、次のように入力してそのディレクトリ内に配置します。collectstaticアクションを確認して静的コンテンツを収集するには、「yes」と入力するように求められる場合があります。+」という新しいディレクトリが作成されます。次に、ポートを開いて、Django開発サーバーにアクセスできるようにします。サーバーの初期セットアップガイドに従った場合、UFWファイアウォールを有効にする必要があります。次を入力して、ポート8080への接続を許可します。8080これらすべてが邪魔にならないので、開発サーバーを一時的に起動してプロジェクトをテストできます。`で開発サーバーが起動します。ブラウザのサーバーのドメイン名またはIPアドレスの後に「+8080」を入力します。http://:8080次のようなページが表示されます。+」を追加すると、管理者ログインページが表示されます。+`コマンドで選択した管理ログイン資格情報を使用して、サーバーにログインします。その後、管理インターフェイスにアクセスできます。*と入力して開発サーバーを停止します。これで、2番目のプロジェクトに進むことができます。2番目のプロジェクトを作成する2番目のプロジェクトは、最初のプロジェクトとまったく同じ方法で作成されます。このセクションの説明は、すでにこれを1回完了しているものとして、簡略化します。ホームディレクトリに戻り、新しいプロジェクト用の2番目の仮想環境を作成します。アクティブになったら、この新しい環境にDjangoをインストールします。django新しい環境が作成され、変更されて、以前の仮想環境が残ります。このDjangoインスタンスは、設定した他のインスタンスとは完全に分離されています。これにより、それらを個別に管理し、必要に応じてカスタマイズできます。2番目のプロジェクトを作成し、プロジェクトディレクトリに移動します。~/データベースを初期化し、管理ユーザーを作成します。createsuperuser設定ファイルを開きます。]前のプロジェクトで行ったように、静的ファイルの場所を追加します。'/static/'ファイルを保存して閉じます。次に、次のように入力して、静的要素をそのディレクトリに収集します。collectstatic最後に、開発サーバーを起動して、サイトをテストします。0.0.0.0:8080次の場所で通常のサイトを確認する必要があります。http://:8080また、管理サイトにログインします。*と入力して開発サーバーを停止します。仮想環境のバックアウトこれでガイドのDjangoの部分が完了したので、2番目の仮想環境を非アクティブ化できます。deactivateDjangoサイトのいずれかで再び作業する必要がある場合は、それぞれの環境を再アクティブ化する必要があります。+`コマンドを使用してそれを行うことができます:workonOr:workon繰り返しますが、サイトでの作業が終了したら非アクティブ化します。deactivateこれで、アプリケーションサーバーの構成に進むことができます。Serverのセットアップ2つのDjangoプロジェクトがセットアップされて準備ができたので、uWSGIを構成できます。uWSGIは、WSGIと呼ばれる標準インターフェイスを介してアプリケーションと通信できるアプリケーションサーバーです。詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14-04をご覧ください。uWSGIのインストール上記のリンクガイドとは異なり、このチュートリアルでは、uWSGIをグローバルにインストールします。これにより、複数のDjangoプロジェクトを処理する際の摩擦が少なくなります。uWSGIをインストールする前に、ソフトウェアが依存するPython開発ファイルが必要です。Ubuntuのリポジトリから直接インストールできます。*でDjangoを使用している場合は、次のように入力します。*を使用している場合は、次を入力します。+`を使用してuWSGIをグローバルにインストールできます。*を使用している場合は、次を入力します。*を使用している場合は、次を入力します。uwsgiサイトの1つに情報を渡すことで、このアプリケーションサーバーをすばやくテストできます。次のように入力して、最初のプロジェクトを提供するように指示できます。+`ファイルを使用するように指示しました。Pythonモジュール構文を使用)。+`でHTTPを提供するように指示しました。この機能のテストが終了したら、ターミナルでCTRL-Cを入力します。構成ファイルの作成コマンドラインからuWSGIを実行することはテストに役立ちますが、実際の展開には特に役立ちません。代わりに、「Emperorモード」でuWSGIを実行します。これにより、マスタープロセスは、構成ファイルのセットを指定して、個別のアプリケーションを自動的に管理できます。構成ファイルを保持するディレクトリを作成します。/etc/uwsgi/sitesこのディレクトリに、構成ファイルを配置します。提供するプロジェクトごとに構成ファイルが必要です。+`ファイルを使用します。最初のプロジェクト用のファイルを作成し、テキストエディターで開きます。`セクションヘッダーで開始する必要があります。すべての情報はこのヘッダーの下に表示されます。変数を使用して、構成ファイルを再利用可能にします。」という変数を設定します。+`という変数を追加します。」という変数を追加します。`%(variable_name)+`構文を使用して設定したユーザー名から構築されます。これは、構成が読み取られるときに変数の値に置き換えられます。/home/%(uid)次に、プロジェクトを正しく処理するようにuWSGIを構成する必要があります。+`オプションを設定して、ルートプロジェクトディレクトリに移動する必要があります。同じ変数構文を使用して、ホームディレクトリとプロジェクト名を組み合わせることができます。同様に、プロジェクトの仮想環境を示します。+`ファイルから呼び出し可能な「アプリケーション」をインポートすることにより)。これらのアイテムの構成は次のようになります。%(project).wsgi:application5人のワーカーでマスタープロセスを作成します。これを追加することでこれを行うことができます。5次に、uWSGIが接続をリッスンする方法を指定する必要があります。uWSGIのテストでは、HTTPとネットワークポートを使用しました。Nginxをリバースプロキシとして使用するため、より良いオプションがあります。ネットワークポートを使用する代わりに、すべてのコンポーネントが単一のサーバーで動作しているため、Unixソケットを使用できます。これはより安全であり、パフォーマンスが向上します。」プロトコルを実装します。これは、他のサーバーとの通信用に設計された高速バイナリプロトコルです。+`プロトコルを使用してネイティブにプロキシできるため、これが最良の選択です。Webサーバーに書き込みアクセス権を与えるため、ソケットの所有権とアクセス許可も変更します。+`オプションを設定します。trueこれで、最初のプロジェクトのuWSGI設定が完了しました。ファイルを保存して閉じます。変数を使用してファイルを設定する利点は、再利用が非常に簡単になることです。最初のプロジェクトの構成ファイルをコピーして、2番目の構成ファイルのベースとして使用します。/etc/uwsgi/sites/.iniテキストエディターで2番目の構成ファイルを開きます。/etc/uwsgi/sites/.iniこのファイルの1つの値を変更するだけで、2番目のプロジェクトで機能するようになります。+`変数を変更します。true完了したら、ファイルを保存して閉じます。2番目のプロジェクトは準備ができているはずです。uWSGI用のsystemdユニットファイルを作成するDjangoプロジェクトを処理するために必要な設定ファイルは用意されましたが、プロセスはまだ自動化されていません。次に、uWSGI皇帝プロセスを管理し、ブート時にuWSGIを自動的に起動するsystemdユニットファイルを作成します。system`ディレクトリにユニットファイルを作成します。+`セクションから始めます。このセクションは、メタデータと順序情報を指定するために使用されます。サービスの説明をここに入力します。`セクションを開きます。`ディレクティブを使用して、サーバーの実行に必要な部分を設定します。`グループをグループ所有者として所有するようになります。+`コマンドは、操作が不要な場合でも正常に戻ります。これが私たちが欲しいものです。`実行可能ファイルを指します。+」で見つかったファイルを使用して複数のアプリケーションを管理できるように、「Emperorモード」で実行するように指示します。systemdがプロセスを正しく管理するために必要な部分も追加します。[こちら]から取得されます。+`セクションを追加することだけです。これにより、サービスをいつ自動的に開始するかを指定できます。サービスをマルチユーザーシステム状態に関連付けます。/etc/uwsgi/sitesRestart=alwaysKillSignal=SIGQUITType=notifyNotifyAccess=all[Install]WantedBy=multi-user.target終了したら、ファイルを保存して閉じます。+`ユーザーが利用可能であることに依存しているため、この時点ではサービスを正常に開始できません。Nginxがインストールされるまで、uWSGIサービスの開始を待つ必要があります。Nginxをリバースプロキシとしてインストールおよび構成するuWSGIが構成され、準備ができたら、Nginxをリバースプロキシとしてインストールして構成できます。これは、Ubuntuのデフォルトリポジトリからダウンロードできます。nginxNginxをインストールしたら、各プロジェクトのサーバーブロック構成ファイルを作成できます。サーバーブロック構成ファイルを作成して、最初のプロジェクトから始めます。/etc/nginx/sites-available/内部では、最初のプロジェクトにアクセスできるポート番号とドメイン名を指定することにより、サーバーブロックを開始できます。+`ブロック_must_は、サーバーのドメイン名またはIPアドレスのいずれかと一致するか、デフォルトのNginxページが代わりに使用される場合があります。www..com;}次に、ファビコンが見つからなくても心配しないようにNginxに指示できます。サイトの静的要素を収集した静的ファイルディレクトリの場所も指定します。locationブロックを作成できます。+`パラメーターを含め、uWSGIサーバーが設定するソケットにトラフィックを渡します。}}これで、最初のサーバーブロックが完了しました。これを2番目のプロジェクトのNginx構成ファイルの基礎として使用します。/etc/nginx/sites-available/テキストエディターで新しいファイルを開きます。/etc/nginx/sites-available/ここで、「」への参照を「」への参照に変更する必要があります。+」を変更するか、複数のドメイン名またはIPアドレスがない場合はポートを変更する必要があります。終了すると、次のようになります。}}完了したら、ファイルを保存して閉じます。/etc/nginx/sites-enabled次のように入力して、構成構文を確認します。-t構文エラーが検出されない場合、Nginxサービスを再起動して新しい構成をロードできます。nginx以前のことを覚えていれば、実際にuWSGIサーバーを起動したことはありません。次のように入力して、これを実行します。uwsgi「8080」をポートするUFWルールを削除して、代わりにNginxサーバーへのアクセスを許可しましょう。Full'これで、それぞれのドメイン名に移動して、2つのプロジェクトに到達できるはずです。パブリックインターフェイスと管理インターフェイスの両方が期待どおりに動作するはずです。これがうまくいく場合は、次のように入力して、ブート時に両方のサービスを自動的に開始できるようにします。uwsgiNoteNginxとuWSGIのトラブルシューティングアプリケーションにアクセスできない場合は、インストールのトラブルシューティングを行う必要があります。+」を調整する必要があることを意味しますドメイン名。`を使用して、リクエストへの応答に使用するサーバーブロックを決定します。+」は、選択するデフォルトのサーバーブロック内のものよりも具体的である必要があります。Gatewayエラーを表示している502エラーは、Nginxがリクエストを正常にプロキシできないことを示します。幅広い構成の問題は、502エラーで表されるため、適切にトラブルシューティングするにはより多くの情報が必要です。詳細情報を検索する主な場所は、Nginxのエラーログです。通常、これにより、プロキシイベント中に問題が発生した条件がわかります。次のように入力して、Nginxエラーログに従います。/var/log/nginx/error.log次に、ブラウザで別のリクエストを行って、新しいエラーを生成します(ページを更新してみてください)。ログに新しいエラーメッセージが書き込まれます。メッセージを見ると、問題を絞り込むのに役立ちます。次のメッセージの一部が表示される場合があります。unix:/run/uwsgi/firstsite.sockへのconnect()の失敗(2:そのようなファイルまたはディレクトリはありません)*これは、Nginxが指定された場所でソケットファイルを見つけられなかったことを示します。`+の実際の場所と比較する必要があります。+`ディレクトリ内のソケットファイルの存在を確認します。`プロセスがソケットファイルを作成できなかったことを意味します。+`プロセスのステータスをチェックして、開始できたかどうかを確認します。+`コマンドがエラーの発生を示した場合、またはディレクトリ内でソケットファイルが見つからない場合、uWSGIが正しく起動できなかったことを示しています。次のように入力して、uWSGIプロセスログを確認します。uwsgiログのメッセージを見て、uWSGIがどこで問題に遭遇したかを調べてください。問題が発生した可能性がある多くの理由がありますが、多くの場合、uWSGIがソケットファイルを作成できなかった場合、次のいずれかの理由があります。+`ファイルで定義されたuWSGI設定は正しくありません。次の項目を確認してください。+`ディレクティブは、補間されると、メインプロジェクトディレクトリを指します。+`ディレクティブは、補間されると、仮想環境ディレクトリを指します。+`ファイルをロードします。+`行で作成する必要があります)内のファイルを指します。+`ファイルに変更を加える場合は、デーモンをリロードしてサービス定義を再読み込みし、次のように入力してuWSGIプロセスを再起動します。uwsgiこれらの問題を修正すると、Nginxがソケットファイルを正しく検出できるようになります。unix:/run/uwsgi/firstsite.sockへのconnect()が失敗しました(13:許可が拒否されました)*これは、Nginxが権限の問題のためにuWSGIソケットに接続できなかったことを示しています。通常、これは、制限された環境でソケットが作成されている場合、またはアクセス権が間違っていた場合に発生します。uWSGIプロセスはソケットファイルを作成できますが、Nginxはそれにアクセスできません。+)ソケットファイル間の任意の時点で制限されたアクセス許可がある場合に発生する可能性があります。+`コマンドに渡すことで、ソケットファイルとその各親ディレクトリのアクセス許可と所有権の値を確認できます。firstsite.sock出力には、各ディレクトリコンポーネントの権限が表示されます。アクセス許可(1列目)、所有者(2列目)、グループ所有者(3列目)を調べることで、ソケットファイルへのアクセスが許可されているタイプを把握できます。www-data`グループには、ソケット自体のグループ所有権があります。これらの設定により、Nginxプロセスはソケットに正常にアクセスできるはずです。+`グループによって所有されていない場合、またはワールドの読み取りと実行の許可がない場合、Nginxはソケットにアクセスできません。通常、これは構成ファイルに間違いがあることを意味します。`ファイルを見てください。+`グループに割り当てる役割を果たします。ここのコマンドが正しくない場合、ディレクトリパスの制限が厳しすぎる可能性があります。`ファイルで定義された設定が正しくない可能性があります。+`の値をチェックして、Webプロセスにファイルへのアクセス許可が付与されていることを確認します。さらなるトラブルシューティング追加のトラブルシューティングのために、ログは根本原因を絞り込むのに役立ちます。それぞれを順番に確認し、問題のある領域を示すメッセージを探します。次のログが役立つ場合があります。`」と入力して、Nginxプロセスログを確認します。`」と入力して、Nginxのアクセスログを確認します。`」と入力して、Nginxエラーログを確認します。`」と入力して、uWSGIアプリケーションログを確認します。構成またはアプリケーションを更新する場合、変更を調整するためにプロセスを再起動する必要があります。Djangoアプリケーションを更新する場合、次のように入力してuWSGIプロセスを再起動し、変更を反映できます。systemdサービスファイルを変更する場合は、デーモンをリロードし、次のように入力してプロセスを再起動します。uwsgiNginxサーバーブロックの構成を変更する場合は、構成をテストしてから、次のように入力してNginxをテストします。nginxこれらのコマンドは、構成を調整するときに変更を取得するのに役立ちます。結論このガイドでは、それぞれが独自の仮想環境にある2つのDjangoプロジェクトを設定しました。uWSGIは、それぞれに構成された仮想環境を使用して、各プロジェクトを個別に提供するように構成しました。その後、Nginxを設定してリバースプロキシとして機能し、クライアント接続を処理し、クライアントのリクエストに応じて正しいプロジェクトを提供します。Djangoは、多くの共通部分を提供することでプロジェクトとアプリケーションの作成を簡単にし、独自の要素に集中できるようにします。この記事で説明した一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。