序章

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

このチュートリアルでは、FalconWebアプリケーションをビルドしてデプロイします。 FalconはWSGIフレームワークであるため、WSGIアプリケーションサーバーである Gunicorn をインストールして使用し、アプリを提供します。 次に、Nginxをリバースプロキシサーバーとして使用して本番環境に対応した環境を作成し、着信リクエストがGunicornに到達する前に処理します。

前提条件

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

ステップ1—Python仮想環境を作成する

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

root以外のユーザーとしてサーバーに接続します。

  1. ssh sammy@your_server_ip

FalconはPython2.xとPython3.xの両方で動作しますが、Ubuntu16.04で利用可能な最新バージョンのPythonであるPython3.5を使用します。

pipvirtualenvを使用してFalconアプリケーションをセットアップします。 これらのツールの詳細については、一般的なPythonツールに関するチュートリアルをお読みください。

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

  1. sudo apt-get install virtualenv

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

  1. mkdir falcon_app
  2. cd falcon_app

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

  1. virtualenv venv -p /usr/bin/python3

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

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

Output
Already 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.

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

  1. . venv/bin/activate

システム全体のPythonインタープリターに戻すには、次のコマンドを発行して仮想環境を非アクティブ化します。

  1. deactivate

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

ステップ2—pipを使用してFalconとGunicornをインストールする

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

Falconは2つの方法のいずれかでインストールできます。 Falconには、インストールできるバイナリがあります pip install falcon、ただし、 Cython でコンパイルすると、Falconの速度がさらに向上する可能性があります。 次のコマンドを発行してCythonをインストールし、Falconに通知して、Cythonを検出し、システムのCコンパイラを使用してコンパイルします。

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

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

  1. pip install gunicorn

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

ステップ3—Falconを使用して簡単なWebアプリケーションを作成する

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

  1. nano main.py

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

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 送信する応答を定義するメソッド。 次に、FalconAPIのインスタンスを作成します。 TestResource. 次に、ルートを追加します /test APIに接続し、リソースオブジェクトをアタッチします test_resource それに。

いつでも GET リクエストはに送信されます /test URL、 on_get() の方法 TestResource が呼び出されます。 応答ステータスと本文は、変数を使用して設定されます res.statusres.body それぞれ。

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

ステップ4—GunicornでFalconアプリケーションを提供する

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

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

  1. gunicorn -b 0.0.0.0:5000 main:app --reload

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

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: http://0.0.0.0:5000 (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 他のプログラムでは使用されていません。

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

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

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

を押してGunicornを停止します CTRL+C . これをより本番環境に対応した方法で設定しましょう。

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

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

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

  1. sudo apt-get install nginx

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

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

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

/etc/nginx/sites-available/falcon_app.conf
server {
    listen 80;
    server_name your_server_ip_or_domain;

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

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

でこのファイルへのシンボリックリンクを作成して、この構成をアクティブにします。 /etc/nginx/sites-enabled ディレクトリ:

  1. sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf

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

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

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

  1. sudo nginx -t

構成が機能している場合は、次のメッセージが表示されます。

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

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

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

  1. sudo systemctl restart nginx

ここでGunicornを再起動しますが、リスニングアドレスをから変更します 0.0.0.0localhost Gunicornへのパブリックアクセスを防ぐには:

  1. gunicorn -b localhost:5000 main:app --reload

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

  1. sudo ufw allow 80

:使用している場合 https Webアプリケーションを提供するには、ポートを許可するようにしてください 443 を使用して ufw. また、Let’sEncryptを使用してNginxを保護する方法に関する記事も必ずお読みください。

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

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

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

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

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

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

まず、アプリケーション用のファイルを /etc/systemd/system ディレクトリと .service 拡大:

  1. sudo nano /etc/systemd/system/falcon_app.service

ユニットファイルはセクションで構成されています。 The [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=sammy
Group=www-data
PIDFile=/tmp/gunicorn.pid
Environment="PATH=/home/sammy/falcon_app/venv/bin"
WorkingDirectory=/home/sammy/falcon_app
ExecStart=/home/sammy/falcon_app/venv/bin/gunicorn --workers 3 -b localhost:5000 main:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

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

また、アプリケーションの作業ディレクトリであるPython仮想環境を指定します。 およびアプリケーションを起動するために実行するコマンド。 Gunicornを起動するコマンドを ExecStart 変数。 The --workers フラグは、Gunicornが開始する必要のあるワーカーの数を定義するために使用されます。 Gunicornのドキュメントでは、ワーカーの数を次のように設定することをお勧めします 2n+1 どこ n CPUコアの数です。 サーバーに単一のCPUコアがあると仮定すると、その数に到達します 3.

The ExecReloadExecStop 変数は、サービスの開始方法と停止方法を定義します。

最後に、 [Install] 次のようなセクション:

/etc/systemd/system/falcon_app.service
[Install]
WantedBy=multi-user.target

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

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

  1. sudo systemctl start falcon_app

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

  1. sudo systemctl enable falcon_app

もう一度、ブラウザをポイントします http://your_server_ip/test アプリケーションを表示します。 NginxとGunicornの両方がバックグラウンドで実行されています。 Falconアプリケーションを更新する必要がある場合は、 falcon_app サービス:

  1. sudo systemctl restart falcon_app

ユニットファイルの詳細については、チュートリアルSystemdユニットとユニットファイルについてをお読みください。

結論

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

独自のアプリを本番環境に移行するときは、IPアドレスではなくホスト名を使用してアプリにアクセスする必要があります。 DigitalOcean でホスト名を設定して、ドメイン名をサーバーに向ける方法をご覧ください。