Ubuntu 16.04でGunicornとNginxを使用してFalcon Webアプリケーションを展開する方法

前書き

Falconは、Webアプリケーションを構築するための最小限のPythonフレームワークです。 RESTアーキテクチャスタイルに従うAPIを構築するのに適しています。 それは、開発速度を犠牲にすることなく、できる限り少ないことを試みる低レベルで高性能なフレームワークです。

このチュートリアルでは、Falcon Webアプリケーションを構築してデプロイします。 Falconはhttps://wsgi.readthedocs.io/en/latest/[WSGI]フレームワークであるため、http://gunicorn.org/ [Gunicorn](WSGIアプリケーションサーバー)をインストールして使用し、アプリを提供します。 。 次に、Nginxをリバースプロキシサーバーとして使用して、Gunicornに到達する前に着信リクエストを処理する本番環境を作成します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1-Python仮想環境の作成

コードを記述したりサービスを設定したりする前に、サーバー上のアプリケーション用のPython仮想環境を作成します。

非rootユーザーとしてサーバーに接続します。

ssh @

FalconはPython 2.xとPython 3.xの両方で動作しますが、Ubuntu 16.04で利用可能なPython 3.5の最新バージョンのPythonを使用します。

_pip_と_virtualenv_を使用して、Falconアプリケーションをセットアップします。 これらのツールの詳細については、https://www.digitalocean.com/community/tutorials/common-python-tools-using-virtualenv-installing-with-pip-and-managing-packages [一般的なPythonツール]のチュートリアルをご覧ください。 ]。

まず、virtualenvをインストールします。

sudo apt-get install virtualenv

次に、アプリケーションのソースコードと仮想環境を保持するディレクトリを作成し、そのディレクトリに変更します。

mkdir
cd

次に、仮想環境を作成します。

virtualenv venv -p /usr/bin/python3

このコマンドは、ディレクトリ `+ venv `内に仮想環境を作成します。 ` -p +`フラグは、仮想環境で使用されるPythonのバージョンを指定します。

次の出力が表示されます。

OutputAlready using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/sammy/falcon_app/venv/bin/python3
Also creating executable in /home/sammy/falcon_app/venv/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

次に、仮想環境をアクティブにします。

. venv/bin/activate

Python仮想環境を設定したので、必要なPythonパッケージをインストールしましょう。

ステップ2-pipを使用したFalconとGunicornのインストール

`+ falcon `パッケージをインストールする必要があり、Gunicornを使用してアプリを提供するため、それもインストールする必要があります。 これらは両方とも ` pip +`から利用できます。

Falconは2つの方法のいずれかでインストールできます。 Falconには、「+ pip install falcon +」でインストールできるバイナリがありますが、http://cython.org/ [Cython]でコンパイルすると、Falconの速度がさらに向上します。 次のコマンドを発行してCythonをインストールし、Falconにそれを検出してシステムのCコンパイラーを使用して自分自身をコンパイルするよう通知します。

sudo apt-get install build-essential python3-dev
pip install cython
pip install --no-binary :all: falcon

次に、Gunicornをインストールします。

pip install gunicorn

単純なFalconアプリケーションの作成に移りましょう。

ステップ3-Falconを使用した単純なWebアプリケーションの作成

単純な単一ファイルのFalconアプリケーションを作成しましょう。 `+ falcon_app `ディレクトリにファイル ` main.py +`を作成します:

nano main.py

ファイルに次のコンテンツを入力します。これにより、人々が `+ / test +`ルートにアクセスしたときに簡単なテストメッセージを表示するFalconアプリケーションが作成されます。

main.py

import falcon

class TestResource(object):
   def on_get(self, req, res):
       """Handles all GET requests."""
       res.status = falcon.HTTP_200  # This is the default status
       res.body = ('This is me, Falcon, serving a resource!')

# Create the Falcon application object
app = falcon.API()

# Instantiate the TestResource class
test_resource = TestResource()

# Add a route to serve the resource
app.add_route('/test', test_resource)

このファイルでは、 `+ TestResource `というクラスを作成します。 このクラスには、送信する応答を定義する ` on_get `メソッドが含まれています。 次に、Falcon APIと ` TestResource `のインスタンスを作成します。 次に、ルート ` / test `をAPIに追加し、リソースオブジェクト ` test_resource +`を追加します。

+ GET +`リクエストが `+ / test + URLに送信されるたびに、 `+ TestResource `の ` on_get()`メソッドが呼び出されます。 応答ステータスと本文は、それぞれ変数 ` res.status `と ` res.body +`を使用して設定されます。

ファイルを保存して、エディターを閉じます。 アプリケーションをテストしましょう。

ステップ4-Gunicornを使用したFalconアプリケーションの提供

Nginxを使用してアプリケーションを本番環境に対応させる作業を行う前に、Gunicornで提供することでアプリケーションが機能することを確認しましょう。

`+ falcon_app +`ディレクトリにいることを確認してください。 次のコマンドでGunicornを起動します。

gunicorn -b :5000 main:app --reload

これによりGunicornが起動し、出力からわかるように、ポート「5000」の「++」でWebアプリケーションを提供します。

Output[2016-11-14 16:33:41 +0000] [9428] [INFO] Starting gunicorn 19.6.0
[2016-11-14 16:33:41 +0000] [9428] [INFO] Listening at:  (9428)
[2016-11-14 16:33:41 +0000] [9428] [INFO] Using worker: sync
[2016-11-14 16:33:41 +0000] [9431] [INFO] Booting worker with pid: 9431

任意のポート番号を使用できますが、「+ 1024+」より上にあり、他のプログラムで使用されていないことを確認してください。

`+ main:app `オプションは、ファイル ` main.py `で利用可能なアプリケーションオブジェクト ` app +`を呼び出すようGunicornに指示します。

Gunicornはオプションの `+-reload +`スイッチを提供し、Gunicornにコードの変更を即座に検出するよう指示します。 これにより、Gunicornを再起動せずにコードを変更できます。

ローカルコンピューターでWebブラウザーを開き、ブラウザーで `+ http://:5000 / test +`にアクセスして、アプリケーションをテストします。 Webアプリケーションから次の出力が表示されます。

画像:https://assets.digitalocean.com/articles/falcon_gunicorn_nginx_1604/drw9BfS.png [ファルコンの応答]

`+ CTRL + C +`を押してGunicornを停止します。 これをより生産に即した方法でセットアップしましょう。

ステップ5-Nginxを使用してリクエストをGunicornにプロキシする

Gunicornが外部からのリクエストを直接処理するのではなく、すべてのWebリクエストをGunicornにプロキシするようにNginxを設定および構成します。 そうすることで、WebアプリケーションのすべてのリクエストがNginxによって最初に検出され、次にアプリケーションサーバーにルーティングされます。

まず、次のコマンドを実行してNginxをインストールします。

sudo apt-get install nginx

次に、 `+ / etc / nginx / sites-available `ディレクトリに ` falcon_app.conf +`という新しい設定ファイルを作成します。 このファイルは、サーバーのIPアドレスに送信されるすべてのリクエストを、FalconアプリケーションのGunicornサーバーにプロキシするようにNginxを構成します。

sudo nano /etc/nginx/sites-available/falcon_app.conf

ファイルに次の内容を追加します。

/etc/nginx/sites-available/falcon_app.conf

server {
   listen 80;
   server_name ;

   location / {
       include proxy_params;
       proxy_pass http://localhost:5000;
   }
}

この設定は、Nginxにポート「80」でリッスンし、すべてのHTTPリクエストをGunicornがリッスンする「+ http:// localhost:5000+」にプロキシするように指示します。

`+ / etc / nginx / sites-enabled +`ディレクトリにこのファイルへのシンボリックリンクを作成して、この設定を有効にします。

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

次に、 `+ / etc / nginx / sites-enabled +`ディレクトリからシンボリックリンクを削除して、デフォルトのNginx設定ファイルを無効にします:

sudo rm /etc/nginx/sites-enabled/default

Nginxファイルに構文エラーがないことを確認してください。

sudo nginx -t

動作する構成がある場合、このメッセージが表示されます。

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

エラーが表示された場合は、エラーを修正して再度テストしてください。

新しい構成を有効にするには、Nginxを再起動します。

sudo systemctl restart nginx

Gunicornを再び起動しますが、Gunicornへのパブリックアクセスを防ぐために、リスニングアドレスを「0.0.0.0」から「+ localhost +」に変更します。

gunicorn -b  main:app --reload

サーバーのファイアウォールを有効にしている場合、ポート「80」へのアクセスを許可します。

sudo ufw allow 80

最後に、 `+ http:/// test +`にアクセスしてアプリをテストすると、前と同じ出力が表示されます。

リクエストは現在、デフォルトのHTTPポートであるポート `+ 80 +`で実行されるNginxを経由するため、URLにポート番号が不要になったことに注意してください。 ブラウザに次の出力が表示されます。

image:https://assets.digitalocean.com/articles/falcon_gunicorn_nginx_1604/6pKlicT.png [FalconはNginxを介してプロキシされるようになりました]

`+ CTRL + C +`を押してアプリサーバーを停止します。 他のサービスと同様に、Falconアプリケーションをバックグラウンドで自動的に開始するように設定してみましょう。

ステップ7-SystemdでGunicornを管理する

Nginxと同様に、サーバーが起動するたびにアプリケーションが自動的に起動することを確認する必要があります。 サーバーが誤って再起動されたか、何らかの理由で再起動する必要があった場合、Gunicornを手動で起動する必要はありません。

これを設定するには、Gunicornアプリケーション用の_Systemdユニットファイル_を作成して、管理できるようにします。

最初に、アプリケーションのファイルを + / etc / systemd / system`ディレクトリ内に作成し、 + .service ie`拡張子を付けます。

sudo nano /etc/systemd/system/

ユニットファイルはセクションで構成されます。 `+ [Unit] +`セクションは、サービスの説明やいつサービスを開始するかなど、サービスのメタデータと依存関係を指定するために使用されます。

この構成をファイルに追加します。

/etc/systemd/system/falcon_app.service

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

ネットワークターゲットに到達した後、サービスを開始するように指定します。 つまり、ネットワークサービスの準備が整ってからこのサービスを開始します。

`+ [Unit] `セクションの後に、サービスの開始方法を指定する ` [Service] +`セクションを定義します。 これを構成ファイルに追加します。

/etc/systemd/system/falcon_app.service

[Service]
User=
Group=
PIDFile=
Environment="PATH=/home/sammy//venv/bin"
WorkingDirectory=/home/sammy/
ExecStart=/home///venv/bin/gunicorn --workers 3 -b
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

まず、サービスを実行するユーザーとグループを定義します。 次に、サービスのPID(プロセスID)を保存するファイルを定義します。このPIDは、サービスの停止またはリロードに使用されます。

また、Python仮想環境、アプリケーションの作業ディレクトリを指定します。 アプリケーションを起動するために実行するコマンド。 Gunicornを起動するコマンドを `+ ExecStart `変数に割り当てます。 `-workers `フラグは、Gunicornを開始するワーカーの数を定義するために使用されます。 Gunicornのドキュメントでは、ワーカーの数を「 2n + 1 」に設定することを提案しています。「 n 」はCPUコアの数です。 サーバーに単一のCPUコアがあると仮定すると、数字「+3」に到達します。

`+ ExecReload `および ` ExecStop +`変数は、サービスの開始および停止方法を定義します。

最後に、次のような `+ [Install] +`セクションを追加します。

/etc/systemd/system/falcon_app.service

[Install]
WantedBy=multi-user.target

`+ Install `セクションでは、サービスを有効または無効にできます。 ` WantedBy `ディレクティブは ` / etc / systemd / system `内に ` multi-user.target +`というディレクトリを作成し、このファイルのシンボリックリンクがそこに作成されます。 このサービスを無効にすると、このファイルがディレクトリから削除されます。

ファイルを保存し、エディターを閉じて、新しいサービスを開始します。

sudo systemctl start

次に、このサービスを有効にして、サーバーが起動するたびにGunicornがWebアプリケーションの提供を開始するようにします。

sudo systemctl enable

もう一度、ブラウザで `+ http:/// test`を指定してアプリケーションを確認します。 NginxとGunicornの両方がバックグラウンドで実行されています。 Falconアプリケーションを更新する必要がある場合は、 `+ falcon_app +`サービスを再起動します。

sudo systemctl restart

ユニットファイルの詳細については、チュートリアルhttps://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files[Systemdユニットとユニットファイルについて]を参照してください。

結論

このガイドでは、最初のFalcon Webアプリケーションを構成および展開しました。 Python環境をセットアップし、サーバー上でアプリケーションコードを記述してから、GunicornでWebアプリケーションを提供しました。 次に、WebリクエストをGunicornアプリケーションに渡すようにNginxを構成しました。 最後に、Systemd Unitファイルを作成し、サーバーの起動時にWebアプリケーションが起動するようにサービスを有効にしました。

独自のアプリを運用環境に導入する場合、IPアドレスではなくホスト名を使用してアプリにアクセスする必要があります。 DigitalOceanでホスト名を設定する方法をご覧になり、ドメインを指定してください。サーバーの名前。

Related