CentOS 7でGunicornとNginxを使用してFlaskアプリケーションを提供する方法

前書き

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

前提条件

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

アプリケーションサーバーがFlaskアプリとの通信に使用する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 [このガイド]。 これらの概念を理解すると、このガイドを理解しやすくなります。

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

CentOSおよびEPELリポジトリからコンポーネントをインストールする

最初のステップは、リポジトリから必要なすべてのピースをインストールすることです。 必要なコンポーネントをインストールするために、いくつかの追加パッケージを含むEPELリポジトリを追加する必要があります。

次のように入力してEPELリポジトリを有効にできます。

sudo yum install epel-release

システムでEPELリポジトリへのアクセスが設定されると、必要なパッケージのインストールを開始できます。 Pythonコンポーネントをインストールおよび管理するために、Pythonパッケージマネージャーであるpipをインストールします。 Gunicornが必要とするコンパイラーとPython開発ファイルも入手します。 Nginxもインストールします。

次のように入力して、これらのコンポーネントをすべてインストールできます。

sudo yum install python-pip python-devel gcc nginx

Python仮想環境を作成する

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

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

sudo pip install virtualenv

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

mkdir ~/
cd ~/

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

virtualenv

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

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

source /bin/activate

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

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

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

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

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

pip install gunicorn flask

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

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

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

nano ~//.py

このファイル内に、アプリケーションコードを配置します。 基本的に、フラスコをインポートし、Flaskオブジェクトをインスタンス化する必要があります。 これを使用して、特定のルートが要求されたときに実行する必要がある機能を定義できます。 コード「+ application +」でFlaskアプリケーションを呼び出して、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 .py

サーバーのドメイン名またはIPアドレスにアクセスしてから、Webブラウザーのターミナル出力で指定されたポート番号(ほとんどの場合は「:5000」)にアクセスします。 このようなものが見えるはずです。

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

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

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

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

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

nano ~//wsgi.py

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

from  import application

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

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

Gunicornのプロジェクト提供能力のテスト

先に進む前に、Gunicornが正しく実行できることを確認する必要があります。

これを行うには、エントリポイントの名前を渡すだけです。 また、公開するインターフェイスで開始されるように、バインドするインターフェイスとポートを指定します。

cd ~/
gunicorn --bind 0.0.0.0:8000 wsgi

ウェブブラウザの末尾に「:8000」が追加されたサーバーのドメイン名またはIPアドレスにアクセスすると、次のようなページが表示されます。

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

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

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

deactivate

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

Systemd Unitファイルを作成する

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

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

sudo nano /etc/systemd/system/.service

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

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

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

次に、作業ディレクトリをマップし、環境の `+ PATH +`を設定して、プロセスの実行可能ファイルがどこにあるかをinitシステムが認識できるようにします(仮想環境内)。 次に、コマンドを指定してサービスを開始します。 Systemdでは、仮想環境内にインストールされているGunicorn実行可能ファイルへのフルパスを指定する必要があります。

3つのワーカープロセスを開始するように指示します(必要に応じて調整します)。 また、 `+ .sock `と呼ばれるプロジェクトディレクトリ内でUnixソケットファイルを作成してバインドするように指示します。 umask値を「+007」に設定して、他のアクセスを制限しながら、所有者とグループにアクセスできるソケットファイルを作成します。 最後に、WSGIエントリポイントのファイル名を渡す必要があります。

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

[Service]
User=user
Group=nginx
WorkingDirectory=/home//
Environment="PATH=/home////bin"
ExecStart=/home////bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi

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

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

[Service]
User=user
Group=nginx
WorkingDirectory=/home//
Environment="PATH=/home////bin"
ExecStart=/home////bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi

[Install]
WantedBy=multi-user.target

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

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

sudo systemctl start
sudo systemctl enable

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

これで、Gunicornアプリケーションサーバーが起動して実行され、プロジェクトディレクトリのソケットファイルに対する要求を待機します。 Nginxを構成して、そのソケットにWebリクエストを渡すように構成ファイルに少し追加する必要があります。

Nginxのデフォルトの構成ファイルを開くことから始めます。

sudo nano /etc/nginx/nginx.conf

ファイル内に既に存在する他の `+ server {} +`ブロックのすぐ上のサーバーブロックを開きます。

http {
   . . .

   include /etc/nginx/conf.d/*.conf;




   server {
       listen 80 default_server;

       . . .

Flaskアプリケーションのすべての構成をこの新しいブロック内に配置します。 このブロックがデフォルトのポート80でリッスンし、サーバーのドメイン名またはIPアドレスに応答するように指定することから始めます。

server {
   listen 80;
   server_name ;
}

追加する必要がある他の唯一のものは、すべての要求に一致するロケーションブロックです。 このブロック内で、Gunicornがリモートクライアント接続に関する情報を取得できるように、いくつかの標準プロキシHTTPヘッダーを設定します。 次に、Systemdユニットファイルで指定したソケットにトラフィックを渡します。

server {
   listen 80;
   server_name ;

   location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass http://unix:/home///.sock;
   }
}

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

`+ nginx `ユーザーは、そこのソケットファイルにアクセスするために、アプリケーションディレクトリにアクセスできる必要があります。 デフォルトでは、CentOSは各ユーザーのホームディレクトリを非常に厳重にロックダウンするため、ユーザーのグループに「 nginx +」ユーザーを追加して、アクセスを許可するために必要な最小限の権限を開放できるようにします。

次のコマンドを使用して、ユーザーグループに「+ nginx 」ユーザーを追加できます。 コマンドの「+」を独自のユーザー名に置き換えます。

sudo usermod -a -G  nginx

これで、ユーザーグループにホームディレクトリの実行許可を与えることができます。 これにより、Nginxプロセスは次の範囲内でコンテンツを入力およびアクセスできます。

chmod 710 /home/

アクセス許可を設定したら、Nginx構成ファイルの構文エラーをテストできます。

sudo nginx -t

これが問題を示さずに戻った場合、Nginxプロセスを開始して有効にし、ブート時に自動的に開始されるようにします。

sudo systemctl start nginx
sudo systemctl enable nginx

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

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

結論

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

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

Related