Ubuntu16.04でGunicornとNginxを使用してFalconWebアプリケーションをデプロイする方法
序章
Falcon は、Webアプリケーションを構築するための最小限のPythonフレームワークです。 RESTアーキテクチャスタイルに従うAPIの構築に最適です。 これは、開発速度を犠牲にすることなく、できる限り少ないことを試みる、低レベルで高性能のフレームワークです。
このチュートリアルでは、FalconWebアプリケーションをビルドしてデプロイします。 FalconはWSGIフレームワークであるため、WSGIアプリケーションサーバーである Gunicorn をインストールして使用し、アプリを提供します。 次に、Nginxをリバースプロキシサーバーとして使用して本番環境に対応した環境を作成し、着信リクエストがGunicornに到達する前に処理します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu16.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
ステップ1—Python仮想環境を作成する
コードの記述やサービスの設定に取り掛かる前に、サーバー上にアプリケーション用のPython仮想環境を作成します。
root以外のユーザーとしてサーバーに接続します。
- ssh sammy@your_server_ip
FalconはPython2.xとPython3.xの両方で動作しますが、Ubuntu16.04で利用可能な最新バージョンのPythonであるPython3.5を使用します。
pipとvirtualenvを使用してFalconアプリケーションをセットアップします。 これらのツールの詳細については、一般的なPythonツールに関するチュートリアルをお読みください。
まず、virtualenvをインストールします。
- sudo apt-get install virtualenv
次に、アプリケーションのソースコードと仮想環境を保持するディレクトリを作成し、そのディレクトリに移動します。
- mkdir falcon_app
- cd falcon_app
次に、仮想環境を作成します。
- virtualenv venv -p /usr/bin/python3
このコマンドは、ディレクトリ内に仮想環境を作成します venv
. The -p
flagは、仮想環境で使用される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インタープリターに戻すには、次のコマンドを発行して仮想環境を非アクティブ化します。
- deactivate
Python仮想環境をセットアップしたので、必要なPythonパッケージをインストールしましょう。
ステップ2—pipを使用してFalconとGunicornをインストールする
インストールする必要があります falcon
パッケージであり、Gunicornを使用してアプリを提供しているため、それもインストールする必要があります。 これらは両方とも pip
,
Falconは2つの方法のいずれかでインストールできます。 Falconには、インストールできるバイナリがあります pip install falcon
、ただし、 Cython でコンパイルすると、Falconの速度がさらに向上する可能性があります。 次のコマンドを発行してCythonをインストールし、Falconに通知して、Cythonを検出し、システムの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アプリケーションを作成しましょう。 ファイルを作成する main.py
の中に falcon_app
ディレクトリ:
- nano main.py
ファイルに次のコンテンツを入力します。これにより、ユーザーがアクセスしたときに簡単なテストメッセージを表示するFalconアプリケーションが作成されます。 /test
ルート:
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.status
と res.body
それぞれ。
ファイルを保存して、エディターを閉じます。 アプリケーションをテストしてみましょう。
ステップ4—GunicornでFalconアプリケーションを提供する
Nginxを使用してアプリケーションを本番環境に対応させる作業を行う前に、Gunicornでアプリケーションを提供してアプリケーションが機能することを確認しましょう。
あなたがにいることを確認してください falcon_app
ディレクトリ。 次のコマンドでGunicornを起動します。
- 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をインストールします。
- sudo apt-get install nginx
次に、という新しい構成ファイルを作成します falcon_app.conf
の中に /etc/nginx/sites-available
ディレクトリ。 このファイルは、サーバーのIPアドレスに送信されるすべてのリクエストをFalconアプリケーションのGunicornサーバーにプロキシするようにNginxを構成します。
- sudo nano /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
ディレクトリ:
- sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf
次に、シンボリックリンクをから削除して、デフォルトのNginx構成ファイルを無効にします。 /etc/nginx/sites-enabled
ディレクトリ:
- 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を再起動しますが、リスニングアドレスをから変更します 0.0.0.0
に localhost
Gunicornへのパブリックアクセスを防ぐには:
- gunicorn -b localhost:5000 main:app --reload
ポートへのアクセスを許可する 80
サーバーを有効にしている場合は、サーバーのファイアウォールを通過します。
- 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
拡大:
- sudo nano /etc/systemd/system/falcon_app.service
ユニットファイルはセクションで構成されています。 The [Unit]
セクションは、サービスの説明やサービスの開始時期など、サービスのメタデータと依存関係を指定するために使用されます。
この構成をファイルに追加します。
[Unit]
Description=Gunicorn instance to serve the falcon application
After=network.target
ネットワークターゲットに到達した後にサービスを開始するように指定します。 つまり、このサービスは、ネットワークサービスの準備ができてから開始します。
後に [Unit]
セクションでは、 [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 ExecReload
と ExecStop
変数は、サービスの開始方法と停止方法を定義します。
最後に、 [Install]
次のようなセクション:
[Install]
WantedBy=multi-user.target
The Install
セクションでは、サービスを有効または無効にすることができます。 The WantedBy
ディレクティブは、というディレクトリを作成します multi-user.target
中身 /etc/systemd/system
このファイルのシンボリックリンクがそこに作成されます。 このサービスを無効にすると、このファイルがディレクトリから削除されます。
ファイルを保存し、エディターを閉じて、新しいサービスを開始します。
- sudo systemctl start falcon_app
次に、このサービスを有効にして、サーバーが起動するたびにGunicornがWebアプリケーションの提供を開始するようにします。
- sudo systemctl enable falcon_app
もう一度、ブラウザをポイントします http://your_server_ip/test
アプリケーションを表示します。 NginxとGunicornの両方がバックグラウンドで実行されています。 Falconアプリケーションを更新する必要がある場合は、 falcon_app
サービス:
- sudo systemctl restart falcon_app
ユニットファイルの詳細については、チュートリアルSystemdユニットとユニットファイルについてをお読みください。
結論
このガイドでは、最初のFalconWebアプリケーションを構成してデプロイしました。 Python環境をセットアップし、サーバーにアプリケーションコードを記述してから、Gunicornを使用してWebアプリケーションを提供しました。 次に、WebリクエストをGunicornアプリケーションに渡すようにNginxを構成しました。 最後に、Systemd Unitファイルを作成し、サーバーの起動時にWebアプリケーションが起動するようにサービスを有効にしました。
独自のアプリを本番環境に移行するときは、IPアドレスではなくホスト名を使用してアプリにアクセスする必要があります。 DigitalOcean でホスト名を設定して、ドメイン名をサーバーに向ける方法をご覧ください。