Ubuntu 16.04でuWSGIとNginxを使用してFlaskアプリケーションを提供する方法

前書き

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

前提条件

このガイドを開始する前に、サーバーで非rootユーザーを構成する必要があります。 このユーザーは、管理機能を実行できるように「+ sudo +」権限が必要です。 これを設定する方法については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [初期サーバーセットアップガイド]に従ってください。

uWSGI、アプリケーションサーバー、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リポジトリからコンポーネントをインストールする

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

ローカルパッケージインデックスを更新してから、パッケージをインストールする必要があります。 必要なパッケージは、プロジェクトでPython 2を使用するかPython 3を使用するかによって異なります。

  • Python 2 *を使用している場合は、次を入力します。

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

代わりに、* Python 3 *を使用している場合、次のように入力します。

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

Python仮想環境を作成する

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

まず、 + pip`を使用して + virtualenv`パッケージをインストールします。

  • Python 2 *を使用している場合は、次を入力します。

sudo pip install virtualenv
  • Python 3 *を使用している場合は、次を入力します。

sudo pip3 install virtualenv

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

mkdir ~/
cd ~/

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

virtualenv

これにより、Pythonと `+ pip `のローカルコピーがプロジェクトディレクトリ内の `+`というディレクトリにインストールされます。

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

source /bin/activate

プロンプトが変わり、仮想環境内で操作していることが示されます。 この `+()@:〜/ $ +`のようになります。

Flaskアプリケーションのセットアップ

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

FlaskとuWSGIをインストールする

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

Note

pip install uwsgi flask

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

Flaskが使用可能になったので、簡単なアプリケーションを作成できます。 フラスコはマイクロフレームワークです。 より多くのフル機能のフレームワークが提供するツールの多くは含まれておらず、主にプロジェクトにインポートしてWebアプリケーションの初期化を支援できるモジュールとして存在します。

アプリケーションはもっと複雑かもしれませんが、Flaskアプリを単一のファイルで作成し、 `+ myproject.py +`と呼びます:

nano ~//.py

このファイル内に、アプリケーションコードを配置します。 基本的に、Flaskをインポートし、Flaskオブジェクトをインスタンス化する必要があります。 これを使用して、特定のルートが要求されたときに実行する必要がある機能を定義できます。

〜/ myproject / myproject.py

from flask import Flask
app = Flask(__name__)

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

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

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

サーバーの初期セットアップガイドに従った場合、UFWファイアウォールを有効にする必要があります。 アプリケーションをテストするには、ポート5000へのアクセスを許可する必要があります。

次のように入力して、ポート5000を開きます。

sudo ufw allow 5000

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

python .py

ウェブブラウザでサーバーのドメイン名またはIPアドレスに続けて「:5000」にアクセスします。

http://:5000

このようなものが見えるはずです。

image:https://assets.digitalocean.com/articles/nginx_uwsgi_wsgi_1404/test_app.png [Flaskサンプルアプリ]

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

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

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

ファイルを `+ wsgi.py +`と呼びます:

nano ~//wsgi.py

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

〜/ myproject / wsgi.py

from myproject import app

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

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

uWSGIを構成する

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

uWSGIサービングのテスト

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

これを行うには、エントリポイントの名前を渡すだけです。 これは、モジュールの名前(通常は `+ .py `拡張子を除く)とアプリケーション内の呼び出し可能オブジェクトの名前で構成されます。 私たちの場合、これは ` wsgi:app +`になります。

また、公開されているインターフェイスで開始されるようにソケットを指定し、「+ uwsgi +」バイナリプロトコルの代わりにHTTPを使用するようにプロトコルを指定します。 前に開いたのと同じポート番号を使用します。

uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app

ウェブブラウザで最後に「:5000」が追加されたサーバーのドメイン名またはIPアドレスに再度アクセスします。

http://:5000

アプリケーションの出力が再び表示されるはずです。

image:https://assets.digitalocean.com/articles/nginx_uwsgi_wsgi_1404/test_app.png [Flaskサンプルアプリ]

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

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

deactivate

Pythonコマンドはすべて、システムのPython環境を再び使用するようになります。

uWSGI構成ファイルの作成

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

それをプロジェクトディレクトリに配置して、 `+ myproject.ini +`と呼びます。

nano ~//.ini

内部では、uWSGIが設定を適用することを認識できるように、 `+ [uwsgi] `ヘッダーから始めます。 モジュールを指定するには、 ` wsgi.py +`ファイルから拡張子を除いたものを参照し、ファイル内の呼び出し可能オブジェクトは「app」と呼ばれます。

〜/ myproject / myproject.ini

[uwsgi]
module = wsgi:app

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

〜/ myproject / myproject.ini

[uwsgi]
module = wsgi:app

master = true
processes = 5

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

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

〜/ myproject / myproject.ini

[uwsgi]
module = wsgi:app

master = true
processes = 5

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

最後に行う必要があるのは、 `+ die-on-term +`オプションを設定することです。 これは、initシステムとuWSGIが各プロセス信号の意味について同じ仮定を持っていることを保証するのに役立ちます。 これを設定すると、2つのシステムコンポーネントが調整され、予想される動作が実装されます。

〜/ myproject / myproject.ini

[uwsgi]
module = wsgi:app

master = true
processes = 5

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

die-on-term = true

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

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

systemdユニットファイルを作成する

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

/ etc / systemd / systemディレクトリ内に.serviceで終わるユニットファイルを作成して開始します。

sudo nano /etc/systemd/system/.service

内部では、メタデータと依存関係を指定するために使用される `+ [Unit] +`セクションから始めます。 ここにサービスの説明を入力し、ネットワーキングターゲットに到達した後にのみこれを開始するようにinitシステムに指示します。

/etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve
After=network.target

次に、 `+ [Service] `セクションを開きます。 プロセスを実行するユーザーとグループを指定します。 関連するすべてのファイルを所有しているため、通常のユーザーアカウントにプロセスの所有権を付与します。 NginxがuWSGIプロセスと簡単に通信できるように、 ` www-data`グループにグループ所有権を付与します。

次に、作業ディレクトリをマップし、環境変数 `+ PATH +`を設定して、initシステムがプロセスの実行可能ファイルの場所(仮想環境内)を認識するようにします。 次に、コマンドを指定してサービスを開始します。 Systemdでは、仮想環境内にインストールされているuWSGI実行可能ファイルへのフルパスを指定する必要があります。 プロジェクトディレクトリに作成した.ini構成ファイルの名前を渡します。

/etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve
After=network.target

[Service]
User=
Group=www-data
WorkingDirectory=/home//
Environment="PATH=/home////bin"
ExecStart=/home////bin/uwsgi --ini .ini

最後に、 `+ [Install] +`セクションを追加します。 これにより、ブート時に起動できるようにした場合、このサービスをリンクする対象がsystemdに指示されます。 通常のマルチユーザーシステムが稼働しているときにこのサービスを開始する必要があります。

/etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve
After=network.target

[Service]
User=
Group=www-data
WorkingDirectory=/home//
Environment="PATH=/home////bin"
ExecStart=/home////bin/uwsgi --ini .ini

[Install]
WantedBy=multi-user.target

これで、systemdサービスファイルが完成しました。 今すぐ保存して閉じます。

これで、作成したuWSGIサービスを開始し、起動時に開始できるように有効化できます。

sudo systemctl start
sudo systemctl enable

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

これで、uWSGIアプリケーションサーバーが起動して実行され、プロジェクトディレクトリのソケットファイルに対する要求を待機します。 `+ uwsgi +`プロトコルを使用してそのソケットにWebリクエストを渡すようにNginxを設定する必要があります。

Nginxの `+ sites-available `ディレクトリに新しいサーバーブロック構成ファイルを作成することから始めます。 残りのガイドに合わせて、この「 myproject +」と呼ぶだけです。

sudo nano /etc/nginx/sites-available/

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

/ etc / nginx / sites-available / myproject

server {
   listen 80;
   server_name ;
}

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

/ etc / nginx / sites-available / myproject

server {
   listen 80;
   server_name ;

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

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

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

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

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

sudo nginx -t

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

sudo systemctl restart nginx

最後に行う必要があるのは、ファイアウォールを再度調整することです。 ポート5000からアクセスする必要がなくなったため、そのルールを削除できます。 その後、Nginxサーバーへのアクセスを許可できます。

sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'

これで、Webブラウザでサーバーのドメイン名またはIPアドレスにアクセスできるはずです。

http://

アプリケーションの出力が表示されるはずです。

image:https://assets.digitalocean.com/articles/nginx_uwsgi_wsgi_1404/test_app.png [Flaskサンプルアプリ]

Note

結論

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

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

Related