Flaskは非常にシンプルですが、非常に柔軟なフレームワークであり、構造や設計をあまり制限することなく、アプリケーションに機能を提供することを目的としています。この記事で説明されている一般的なスタックを使用して、設計したフラスコアプリケーションを提供できます。
この記事では、Ubuntu18.04でFlaskマイクロフレームワークを使用して簡単なPythonアプリケーションをセットアップします。
この記事の大部分は、アプリケーションを起動するようにGunicornアプリケーションサーバーを設定し、フロントエンドのリバースプロキシとして機能するようにNginxを設定する方法について説明します。
前提条件
この記事を始める前に、サーバーにroot以外のユーザーを構成しておく必要があります。このユーザーは、管理機能を実行できるようにsudo権限を持っている必要があります。
sudo権限が設定されたroot以外のユーザーを作成します。
1-ルートとしてログイン
2-新しいユーザーの作成
# adduser bobby
3-管理者権限の付与
これらの特権を新しいユーザーに追加するには、新しいユーザーをsudoグループに追加する必要があります。デフォルトでは、Ubuntu 18.04では、sudoグループに属するユーザーがsudoコマンドを使用できます。
# usermod -aG sudo bobby
Ubuntuリポジトリからコンポーネントをインストールする
最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 Python 3コンポーネントをインストールして管理するために、Python3パッケージマネージャーであるpipをインストールします。また、Gunicornコンポーネントの一部を構築するために必要なPython3開発ファイルも入手します。 Nginxもインストールします。
ローカルパッケージインデックスを更新してから、パッケージをインストールします。必要な特定のパッケージは、プロジェクトで使用しているPythonのバージョンによって異なります。
Python 3をインストールするには、次のように入力します。
$ sudo apt-get update
$ sudo apt-get install python3-pip python3-dev nginx
Python3仮想環境を作成する
次に、Flaskアプリケーションをシステム上の他のPythonファイルから分離するために、仮想環境をセットアップします。
pipを使用してvirtualenvパッケージをインストールすることから始めます。
Python 3を使用している場合は、次のように入力します。
sudo pip3 install virtualenv
これで、Flaskプロジェクトの親ディレクトリを作成できます。作成後、ディレクトリに移動します:
mkdir ~/flaskproject
cd ~/flaskproject
次のように入力することで、FlaskプロジェクトのPython要件を保存する仮想環境を作成できます。
virtualenv flaskprojectenv
これにより、Pythonとpipのローカルコピーがプロジェクトディレクトリ内のflaskprojectenvというディレクトリにインストールされます。
仮想環境内にアプリケーションをインストールする前に、それをアクティブ化する必要があります。次のように入力してください:
source flaskprojectenv/bin/activate
プロンプトが変わり、仮想環境内で操作していることを示します。 (flaskprojectenv)user@host:~/flaskproject$
のようになります。 。
Flaskアプリケーションを設定する
仮想環境にいるので、FlaskとGunicornをインストールして、アプリケーションの設計を開始できます。
FlaskとGunicornをインストールする
pip
のローカルインスタンスを使用できます FlaskとGunicornをインストールします。次のコマンドを入力して、これら2つのコンポーネントを取得します。
注: 使用しているPythonのバージョンに関係なく、仮想環境がアクティブ化されている場合は、pip
を使用する必要があります コマンド(pip3
ではありません 。
(flaskprojectenv) $ pip install gunicorn flask
サンプルアプリを作成する
Flaskが利用可能になったので、簡単なアプリケーションを作成できます。 Flaskはマイクロフレームワークです。よりフル機能のフレームワークが持つ可能性のあるツールの多くは含まれていません。主に、Webアプリケーションの初期化を支援するためにプロジェクトにインポートできるモジュールとして存在します。
アプリケーションはもっと複雑かもしれませんが、Flaskアプリを単一のファイルで作成します。これをflaskproject.pyと呼びます:
(flaskprojectenv) $ nano ~/flaskproject/flaskproject.py
このファイル内に、アプリケーションコードを配置します。基本的に、フラスコをインポートして、Flaskオブジェクトをインスタンス化する必要があります。これを使用して、特定のルートが要求されたときに実行する必要がある関数を定義できます。
~/flaskproject/flaskproject.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def greeting():
return "<h1 style='color:green'>Hello World!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0')
これは基本的に、ルートドメインにアクセスしたときに表示するコンテンツを定義します。終了したら、ファイルを保存して閉じます。
サーバーの初期設定ガイドに従っている場合は、UFWファイアウォールを有効にする必要があります。アプリケーションをテストするには、ポート5000へのアクセスを許可する必要があります。
次のように入力して、ポート5000を開きます。
(flaskprojectenv) $ sudo ufw allow 5000
これで、次のように入力して、Flaskアプリをテストできます。
(flaskprojectenv) $ python flaskproject.py
サーバーのドメイン名またはIPアドレスにアクセスし、その後に:5000
を続けます Webブラウザで:
http://server_domain_or_IP:5000
次のように表示されます。
終了したら、CTRL-C
を押します ターミナルウィンドウで数回、Flask開発サーバーを停止します。
WSGIエントリポイントを作成する
次に、アプリケーションのエントリポイントとして機能するファイルを作成します。これにより、Gunicornサーバーがアプリケーションを操作する方法がわかります。
ファイルをwsgi.py
と呼びます :
(flaskprojectenv) $ nano ~/flaskproject/wsgi.py
ファイルは非常にシンプルです。アプリケーションからFlaskインスタンスをインポートして、実行するだけです。
~/flaskproject/wsgi.py
from flaskproject import app
if __name__ == "__main__":
app.run()
終了したら、ファイルを保存して閉じます。
プロジェクトにサービスを提供するGunicornの能力のテスト
先に進む前に、Gunicornが正しく機能することを確認する必要があります。これを行うには、エントリポイントの名前を渡すだけです。これは、モジュールの名前(.py
を除く)で構成されます。 拡張子、通常どおり)に加えて、アプリケーション内の呼び出し可能オブジェクトの名前。この場合、これはwsgi:app
になります。 。
また、公開されているインターフェースで開始されるように、バインドするインターフェースとポートを指定します。
(flaskprojectenv) $ cd ~/flaskproject
(flaskprojectenv) $ gunicorn --bind 0.0.0.0:5000 wsgi:app
サーバーのドメイン名またはIPアドレスにアクセスし、Webブラウザの末尾に:5000を再度追加します:
http://server_domain_or_IP:5000
アプリケーションの出力が再び表示されるはずです。
正常に機能していることを確認したら、CTRL-C
を押します。 ターミナルウィンドウで。
これで仮想環境が完成したので、非アクティブ化できます:
(flaskprojectenv) $ deactivate
すべてのPythonコマンドは、システムのPython環境を再び使用するようになります。
systemdユニットファイルを作成する
次に注意する必要があるのは、systemdサービスユニットファイルです。 systemdユニットファイルを作成すると、Ubuntuのinitシステムが自動的にGunicornを起動し、サーバーが起動するたびにFlaskアプリケーションを提供できるようになります。
.service
で終わるユニットファイルを作成します /etc/systemd/system
内 開始するディレクトリ:
$ sudo nano /etc/systemd/system/flaskproject.service
内部では、[Unit]
から始めます セクション。メタデータと依存関係を指定するために使用されます。ここにサービスの説明を入力し、init
に通知します ネットワークターゲットに到達した後にのみこれを開始するシステム
次に、[Service]
を開きます セクション。プロセスを実行するユーザーとグループを指定します。プロセスは関連するすべてのファイルを所有しているため、通常のユーザーアカウントにプロセスの所有権を付与します。 www-data
にグループの所有権を付与します NginxがGunicornプロセスと簡単に通信できるようにグループ化します。
次に、作業ディレクトリをマップし、init
となるようにPATH環境変数を設定します。 システムは、プロセスの実行可能ファイルがどこにあるかを認識しています(仮想環境内)。次に、サービスを開始するコマンドを指定します。 Systemdでは、仮想環境内にインストールされているGunicorn実行可能ファイルへのフルパスを指定する必要があります。
3つのワーカープロセスを開始するように指示します(必要に応じてこれを調整します)。また、flaskproject.sock
というプロジェクトディレクトリ内にUnixソケットファイルを作成してバインドするように指示します。 。 007
のumask値を設定します 他のアクセスを制限しながら、所有者とグループへのアクセスを許可するソケットファイルが作成されるようにします。最後に、WSGIエントリポイントファイル名とその中で呼び出し可能なPythonを渡す必要があります。
最後に、[Install]
を追加します セクション。これにより、起動時にサービスを開始できるようにした場合に、このサービスを何にリンクするかがsystemdに通知されます。通常のマルチユーザーシステムが稼働しているときにこのサービスを開始する必要があります:
/etc/systemd/system/flaskproject.service
[Unit]
Description=Gunicorn instance to serve flaskproject
After=network.target
[Service]
User=bobby
Group=www-data
WorkingDirectory=/home/bobby/flaskproject
Environment="PATH=/home/bobby/flaskproject/flaskprojectenv/bin"
ExecStart=/home/bobby/flaskproject/flaskprojectenv/bin/gunicorn --workers 3 --bind unix:flaskproject.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
これで、systemdサービスファイルが完成しました。今すぐ保存して閉じます。
これで、作成したGunicornサービスを開始し、起動時に開始するように有効にすることができます。
$ sudo systemctl start flaskproject
$ sudo systemctl enable flaskproject
リクエストをプロキシするためのNginxの設定
これで、Gunicornアプリケーションサーバーが稼働し、プロジェクトディレクトリのソケットファイルに対するリクエストを待機しているはずです。構成ファイルに小さな追加を加えて、そのソケットにWebリクエストを渡すようにNginxを構成する必要があります。
Nginxのsites-available
に新しいサーバーブロック構成ファイルを作成することから始めます ディレクトリ。記事の残りの部分と一致させるために、このflaskprojectと呼ぶだけです:
$ sudo nano /etc/nginx/sites-available/flaskproject
server
を開きます ブロックして、デフォルトのポート80でリッスンするようにNginxに指示します。また、サーバーのドメイン名またはIPアドレスのリクエストにこのブロックを使用するように指示する必要があります。
追加する必要がある他の唯一のものは、location
すべてのリクエストに一致するブロック。このブロック内に、proxy_params
を含めます 設定する必要のあるいくつかの一般的なプロキシパラメータを指定するファイル。次に、proxy_pass
を使用して定義したソケットにリクエストを渡します。 ディレクティブ:
/etc/nginx/sites-available/flaskproject
server {
listen 80;
server_name server_domain_or_IP;
location / {
include proxy_params;
proxy_pass http://unix:/home/bobby/flaskproject/flaskproject.sock;
}
}
実際、アプリケーションを提供するために必要なのはこれだけです。終了したら、ファイルを保存して閉じます。
Nginxserver
を有効にするには 作成したブロック構成で、ファイルをsites-enabled
にリンクします ディレクトリ:
$ sudo ln -s /etc/nginx/sites-available/flaskproject /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://server_domain_or_IP
アプリケーションの出力が表示されます:
注:Nginxを構成した後、次のステップはSSL/TLSを使用してサーバーへのトラフィックを保護することです。これがないと、パスワードを含むすべての情報がプレーンテキストでネットワーク経由で送信されるため、これは重要です。トラフィックを保護するためにSSL証明書を取得する最も簡単な方法は、Let'sEncryptを使用することです。
また読む
- Ubuntu18.04にLet'sEncryptSSL証明書をインストールする方法
- Ubuntu18.04でDjango開発環境をセットアップする方法
- Ubuntu18.04にLEMPをインストールする方法
結論: この記事では、Python仮想環境内に単純なFlaskアプリケーションを作成しました。 WSGI対応のアプリケーションサーバーがWSGIエントリポイントとインターフェイスできるようにWSGIエントリポイントを作成し、この機能を提供するようにGunicornアプリサーバーを構成します。その後、起動時にアプリケーションサーバーを自動的に起動するsystemdユニットファイルを作成しました。 Webクライアントトラフィックをアプリケーションサーバーに渡し、外部リクエストを中継するNginxサーバーブロックを作成しました。