序章

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内に仮想環境を作成します。 -pフラグは、仮想環境で使用される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アプリケーションを作成しましょう。 falcon_appディレクトリにファイルmain.pyを作成します。

  1. 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メソッドが含まれています。 次に、FalconAPIとTestResourceのインスタンスを作成します。 次に、ルート/testをAPIに追加し、リソースオブジェクトtest_resourceをAPIにアタッチします。

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

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

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

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

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

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

これにより、Gunicornが起動し、出力からわかるように、ポート50000.0.0.0で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: 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より上であり、他のプログラムで使用されていないことを確認してください。

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

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

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

Falcon's response

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

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

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

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

  1. sudo apt-get install nginx

次に、/etc/nginx/sites-availableディレクトリにfalcon_app.confという新しい構成ファイルを作成します。 このファイルは、サーバーの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

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

  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.0からlocalhostに変更して、Gunicornへのパブリックアクセスを防止します。

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

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

  1. sudo ufw allow 80

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

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

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

The Falcon is now proxied through Nginx

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

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

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

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

まず、/etc/systemd/systemディレクトリ内に.service拡張子の付いたアプリケーション用のファイルを作成します。

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

ユニットファイルはセクションで構成されています。 [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変数に割り当てます。 --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というディレクトリを作成し、このファイルのシンボリックリンクがそこに作成されます。 このサービスを無効にすると、このファイルがディレクトリから削除されます。

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

  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 でホスト名を設定して、ドメイン名をサーバーに向ける方法をご覧ください。