序章

このガイドでは、Ubuntu14.04でFlaskマイクロフレームワークを使用して簡単なPythonアプリケーションをセットアップします。 この記事の大部分は、アプリケーションを起動するようにuWSGIアプリケーションサーバーを設定し、フロントエンドのリバースプロキシとして機能するようにNginxを設定する方法について説明します。

前提条件

このガイドを開始する前に、サーバーでroot以外のユーザーを構成しておく必要があります。 このユーザーは sudo 管理機能を実行できるようにするための特権。 これを設定する方法については、初期サーバー設定ガイドに従ってください。

uWSGI、アプリケーションサーバー、およびWSGI仕様の詳細については、このガイドのリンクされたセクションを参照してください。 これらの概念を理解すると、このガイドを理解しやすくなります。

続行する準備ができたら、読み進めてください。

Ubuntuリポジトリからコンポーネントをインストールします

最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 インストールします pip、Pythonコンポーネントをインストールおよび管理するためのPythonパッケージマネージャー。 また、uWSGIのビルドに必要なPython開発ファイルを入手し、Nginxもインストールします。

ローカルパッケージインデックスを更新してから、次のように入力してパッケージをインストールします。

sudo apt-get update
sudo apt-get install python-pip python-dev nginx

Python仮想環境を作成する

次に、Flaskアプリケーションをシステム上の他のPythonファイルから分離するために、仮想環境をセットアップします。

インストールすることから始めます virtualenv を使用したパッケージ pip:

sudo pip install virtualenv

これで、Flaskプロジェクトの親ディレクトリを作成できます。 作成後、ディレクトリに移動します。

mkdir ~/myproject
cd ~/myproject

次のように入力することで、FlaskプロジェクトのPython要件を保存する仮想環境を作成できます。

virtualenv myprojectenv

これにより、Pythonのローカルコピーがインストールされ、 pip と呼ばれるディレクトリに myprojectenv プロジェクトディレクトリ内。

仮想環境内にアプリケーションをインストールする前に、それをアクティブ化する必要があります。 次のように入力してください。

source myprojectenv/bin/activate

プロンプトが変わり、仮想環境内で操作していることを示します。 こんな感じになります (myprojectenv)user@host:~/myproject$.

Flaskアプリケーションをセットアップする

仮想環境にいるので、FlaskとuWSGIをインストールして、アプリケーションの設計を開始できます。

FlaskとuWSGIをインストールします

のローカルインスタンスを使用できます pip FlaskとuWSGIをインストールします。 次のコマンドを入力して、これら2つのコンポーネントを取得します。

pip install uwsgi flask

サンプルアプリを作成する

Flaskが利用できるようになったので、簡単なアプリケーションを作成できます。 Flaskはマイクロフレームワークです。 よりフル機能のフレームワークが持つ可能性のあるツールの多くは含まれていません。主に、Webアプリケーションの初期化を支援するためにプロジェクトにインポートできるモジュールとして存在します。

アプリケーションはもっと複雑かもしれませんが、Flaskアプリを1つのファイルに作成します。これを呼び出します myproject.py:

nano ~/myproject/myproject.py

このファイル内に、アプリケーションコードを配置します。 基本的に、フラスコをインポートして、Flaskオブジェクトをインスタンス化する必要があります。 これを使用して、特定のルートが要求されたときに実行する必要がある関数を定義できます。 コードでFlaskアプリケーションを呼び出します application WSGI仕様にある例を複製するには:

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    application.run(host='0.0.0.0')

これは基本的に、ルートドメインにアクセスしたときに表示するコンテンツを定義します。 終了したら、ファイルを保存して閉じます。

次のように入力して、Flaskアプリをテストできます。

python myproject.py

サーバーのドメイン名またはIPアドレスにアクセスし、その後にターミナル出力で指定されたポート番号を入力します(ほとんどの場合 :5000)Webブラウザで。 次のように表示されます。

終了したら、ターミナルウィンドウでCTRL-Cを数回押して、Flask開発サーバーを停止します。

WSGIエントリポイントを作成する

次に、アプリケーションのエントリポイントとして機能するファイルを作成します。 これにより、uWSGIサーバーがアプリケーションと対話する方法がわかります。

ファイルを呼び出します wsgi.py:

nano ~/myproject/wsgi.py

ファイルは非常にシンプルです。アプリケーションからFlaskインスタンスをインポートして、実行するだけです。

from myproject import application

if __name__ == "__main__":
    application.run()

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

uWSGIを構成する

これでアプリケーションが作成され、エントリポイントが確立されました。 これで、uWSGIに進むことができます。

uWSGIサービングのテスト

最初に行うことは、uWSGIがアプリケーションを提供できることを確認するためのテストです。

これを行うには、エントリポイントの名前を渡すだけです。 また、公開されているインターフェイスで開始されるようにソケットを指定し、代わりにHTTPを使用するようにプロトコルを指定します。 uwsgi バイナリプロトコル:

uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi

サーバーのドメイン名またはIPアドレスにアクセスした場合 :8000 Webブラウザーの最後に追加すると、次のようなページが表示されます。

正常に機能していることを確認したら、ターミナルウィンドウでCTRL-Cを押します。

これで仮想環境が完成したので、非アクティブ化できます。

deactivate

これで、すべての操作がシステムのPython環境に対して実行されます。

uWSGI構成ファイルの作成

uWSGIがアプリケーションに対応できることをテストしましたが、長期的な使用に対してより堅牢なものが必要です。 必要なオプションを使用してuWSGI構成ファイルを作成できます。

それをプロジェクトディレクトリに置き、それを呼び出しましょう myproject.ini:

nano ~/myproject/myproject.ini

内部では、 [uwsgi] uWSGIが設定を適用することを認識できるようにヘッダー。 モジュールを指定するには、 wsgi.py ファイル、拡張子を引いたもの:

[uwsgi]
module = wsgi

次に、uWSGIにマスターモードで起動し、実際のリクエストを処理するために5つのワーカープロセスを生成するように指示します。

[uwsgi]
module = wsgi

master = true
processes = 5

テスト中、ネットワークポートでuWSGIを公開しました。 ただし、実際のクライアント接続を処理するためにNginxを使用します。これにより、リクエストがuWSGIに渡されます。 これらのコンポーネントは同じコンピューター上で動作するため、より安全で高速なUnixソケットが推奨されます。 ソケットと呼びます myproject.sock このディレクトリに配置します。

ソケットの権限も変更する必要があります。 後でuWSGIプロセスの所有権をNginxグループに与えるので、ソケットのグループ所有者がソケットから情報を読み取ったり書き込んだりできることを確認する必要があります。 また、「バキューム」オプションを追加して、プロセスが停止したときにソケットをクリーンアップします。

[uwsgi]
module = wsgi

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

私たちがする必要がある最後のことは、 die-on-term オプション。 これが必要なのは、Upstart initシステムとuWSGIが、異なるプロセス信号が何を意味するかについて異なる考えを持っているためです。 これを設定すると、2つのシステムコンポーネントが調整され、期待される動作が実装されます。

[uwsgi]
module = wsgi

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true

コマンドラインから行ったようにプロトコルを指定しなかったことにお気づきかもしれません。 これは、デフォルトでは、uWSGIが uwsgi プロトコル、他のサーバーと通信するように設計された高速バイナリプロトコル。 Nginxはこのプロトコルをネイティブに話すことができるため、HTTPによる通信を強制するよりもこれを使用する方が適切です。

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

アップスタートスクリプトを作成する

次に注意する必要があるのは、Upstartスクリプトです。 Upstartスクリプトを作成すると、Ubuntuのinitシステムが自動的にuWSGIを起動し、サーバーが起動するたびにFlaskアプリケーションを提供できるようになります。

で終わるスクリプトファイルを作成します .conf 以内 /etc/init 開始するディレクトリ:

sudo nano /etc/init/myproject.conf

内部では、スクリプトの目的の簡単な説明から始めます。 その後すぐに、このスクリプトがシステムによって開始および停止される条件を定義します。 通常のシステムランタイム数は2、3、4、および5であるため、システムがこれらのランレベルの1つに達したときにスクリプトを開始するように指示します。 他のランレベル(サーバーの再起動、シャットダウン、シングルユーザーモードなど)で停止するように指示します。

description "uWSGI server instance configured to serve myproject"

start on runlevel [2345]
stop on runlevel [!2345]

次に、uWSGIを実行するユーザーとグループを定義する必要があります。 プロジェクトファイルはすべて独自のユーザーアカウントによって所有されているため、実行するユーザーとして自分自身を設定します。 Nginxサーバーは www-data グループ。 Nginxがソケットファイルの読み取りと書き込みを行えるようにする必要があるため、このグループにプロセスの所有権を付与します。

description "uWSGI server instance configured to serve myproject"

start on runlevel [2345]
stop on runlevel [!2345]

setuid user
setgid www-data

次に、ファイルを正しく見つけて処理できるようにプロセスを設定する必要があります。 すべてのPythonコンポーネントを仮想環境にインストールしたので、これをパスとして環境変数を設定する必要があります。 また、プロジェクトディレクトリに変更する必要があります。 その後、uWSGI実行可能ファイルを呼び出して、作成した構成ファイルを渡すだけです。

description "uWSGI server instance configured to serve myproject"

start on runlevel [2345]
stop on runlevel [!2345]

setuid user
setgid www-data

env PATH=/home/user/myproject/myprojectenv/bin
chdir /home/user/myproject
exec uwsgi --ini myproject.ini

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

次のように入力すると、すぐにプロセスを開始できます。

sudo start myproject

リクエストをプロキシするためのNginxの構成

これで、uWSGIアプリケーションサーバーが稼働し、プロジェクトディレクトリのソケットファイルに対する要求を待機しているはずです。 を使用してそのソケットにWebリクエストを渡すようにNginxを構成する必要があります uwsgi プロトコル。

Nginxで新しいサーバーブロック構成ファイルを作成することから始めます sites-available ディレクトリ。 これを単に呼びます myproject ガイドの残りの部分と一致させるために:

sudo nano /etc/nginx/sites-available/myproject

サーバーブロックを開き、デフォルトのポート80でリッスンするようにNginxに指示します。 また、サーバーのドメイン名またはIPアドレスのリクエストにこのブロックを使用するように指示する必要があります。

server {
    listen 80;
    server_name server_domain_or_IP;
}

追加する必要がある他の唯一のものは、すべてのリクエストに一致するロケーションブロックです。 このブロック内に、 uwsgi_params 設定する必要のあるいくつかの一般的なuWSGIパラメータを指定するファイル。 次に、を使用して定義したソケットにリクエストを渡します。 uwsgi_pass 指令:

server {
    listen 80;
    server_name server_domain_or_IP;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/user/myproject/myproject.sock;
    }
}

実際にアプリケーションを提供するために必要なのはこれだけです。 終了したら、ファイルを保存して閉じます。

作成したNginxサーバーブロック構成を有効にするには、ファイルをにリンクします sites-enabled ディレクトリ:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

そのディレクトリにあるファイルを使用して、次のように入力して構文エラーをテストできます。

sudo nginx -t

これが問題を示さずに戻った場合は、Nginxプロセスを再起動して、新しい構成を読み取ることができます。

sudo service nginx restart

これで、Webブラウザでサーバーのドメイン名またはIPアドレスにアクセスして、アプリケーションを確認できるようになります。

結論

このガイドでは、Python仮想環境内に単純なFlaskアプリケーションを作成しました。 WSGI対応のアプリケーションサーバーがWSGIエントリポイントとインターフェイスできるようにWSGIエントリポイントを作成し、この機能を提供するようにuWSGIアプリサーバーを構成します。 その後、起動時にアプリケーションサーバーを自動的に起動するUpstartスクリプトを作成しました。 Webクライアントトラフィックをアプリケーションサーバーに渡し、外部リクエストを中継するNginxサーバーブロックを作成しました。

Flaskは非常にシンプルですが、非常に柔軟なフレームワークであり、構造や設計をあまり制限することなく、アプリケーションに機能を提供することを目的としています。 このガイドで説明されている一般的なスタックを使用して、設計したフラスコアプリケーションを提供できます。