これまでのapp.run()
方法でFlaskアプリケーションを開始しましたが、開発環境ではこれは確かに実現可能ですが、本番環境では、堅牢で強力なWebアプリケーションサーバーを使用してさまざまな複雑な状況を処理する必要があります。同時に、アプリケーションは開発プロセス中に頻繁に変更されるため、各変更を本番環境に手動でデプロイするのは面倒です。継続的な統合作業を簡略化する自動化ツールを用意するのが最善です。この記事では、Flaskアプリケーションを自動的にパッケージ化、配布、およびApache、Nginxなどのサーバーにデプロイする方法を紹介します。
setuptoolsを使用してFlaskアプリケーションをパッケージ化する
まず、setuptoolsを使用してPythonアプリケーションをパッケージ化および配布する基本的な方法を理解する必要があります。次に、「setup.py」ファイルの作成を開始します。
from setuptools import setup
setup(
name='MyApp',
version='1.0',
long_description=__doc__,
packages=['myapp','myapp.main','myapp.admin'],
include_package_data=True,
zip_safe=False,
install_requires=[
'Flask>=0.10',
'Flask-Mail>=0.9',
'Flask-SQLAlchemy>=2.1'
]
)
ファイルをプロジェクトのルートディレクトリに配置します。さらに、「MANIFEST.in」ファイルを作成することを忘れないでください:
recursive-include myapp/templates *
recursive-include myapp/static *
書き込んだ後、クリーンな仮想環境を作成し、インストールコマンドを実行して効果をテストできます。
$ python setup.py install
Fabricを使用してFlaskアプリケーションをリモートでデプロイする
同様に、Fabricを使用してPythonアプリケーションをリモートでデプロイする方法を理解する必要があります。次に、「fabfile.py」ファイルを作成します。
from fabric.api import *
env.hosts = ['example1.com', 'example2.com']
env.user = 'bjhee'
def package():
local('python setup.py sdist --formats=gztar', capture=False)
def deploy():
dist = local('python setup.py --fullname', capture=True).strip()
put('dist/%s.tar.gz' % dist, '/tmp/myapp.tar.gz')
run('mkdir /tmp/myapp')
with cd('/tmp/myapp'):
run('tar xzf /tmp/myapp.tar.gz')
run('/home/bjhee/virtualenv/bin/python setup.py install')
run('rm -rf /tmp/myapp /tmp/myapp.tar.gz')
run('touch /var/www/myapp.wsgi')
上記の例では、「package」タスクを使用してアプリケーションをパッケージ化し、「deploy」タスクを使用してPythonパッケージをリモートサーバーの仮想環境にインストールしています。仮想環境は「/ home / bjhee / virtualenv」の下にあると想定されています。インストール後、「/ var / www / myapp.wsgi」ファイルの変更時刻を更新して、WSGIサーバー(Apacheなど)に再読み込みを通知します。uWSGIなどの非WSGIサーバーの場合、このステートメントは省略できます。
書き込んだ後、デプロイメントスクリプトを実行してテストします。
$ fab package deploy
Apache + mod_wsgiを使用してFlaskアプリケーションを実行する
FlaskアプリケーションはWSGI仕様に基づいているため、WSGIプロトコルをサポートする任意のWebアプリケーションサーバーで実行できます。最も一般的に使用される方法は、Apache + mod_wsgiです。上記のファブリックスクリプトは、Flaskアプリケーションのリモートサーバーへのデプロイを完了しました。次に行うことは、WSGIエントリファイル「myapp.wsgi」を書き込むことです。これは、「/ var / www」のApacheドキュメントルートディレクトリに配置されていると想定しています。 "下。
activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/bjhee/.python-eggs'
import sys;
sys.path.append("/var/www")
from myapp import create_app
import config
application = create_app('config')
事前に構成ファイル "config.py"を作成し、それをリモートサーバーのPythonモジュールインポートパスに配置する必要があることに注意してください。上記の例では、Pythonモジュールのインポートパスに「/ var / www」を追加したので、そこに「config.py」を配置できます。また、デプロイメントプロセス中に開発環境の構成で本番環境を上書きしないように、setuptoolsでパッケージ化するときに「config.py」を含めないでください。
Apacheの「httpd.conf」にスクリプト更新の自動再読み込みとURLパスマッピングを追加します。
WSGIScriptReloading On
WSGIScriptAlias /myapp /var/www/myapp.wsgi
Apacheサーバーを再起動した後http://example1.com/myapp
、アプリケーションにアクセスできます。
Nginx + uWSGIを使用してFlaskアプリケーションを実行する
最初にNginx + uWSGIオペレーティング環境を準備してから、uWSGI起動ファイル「myapp.ini」を書き込む必要があります。
[uwsgi]
socket=127.0.0.1:3031
callable=app
mount=/myapp=run.py
manage-script-name=true
master=true
processes=4
threads=2
stats=127.0.0.1:9191
virtualenv=/home/bjhee/virtualenv
次に、Nginx構成ファイルを変更します。Linuxのデフォルトは「/ etc / nginx / sites-enabled / default」であり、さらにディレクトリ構成があります。
location /myapp {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /myapp;
uwsgi_pass 127.0.0.1:3031;
}
NginxとuWSGIを再起動した後http://example1.com/myapp
、アプリケーションにアクセスできます。
アプリケーションを仮想サーバーとして構成することもできます。上記のuWSGI構成を仮想サーバー構成ファイルに移動するだけです。Nginx仮想サーバーの構成については、以前の記事を参照してください。
Tornadoを使用してFlaskアプリケーションを実行する
Tornadoの強みは、ノンブロッキングの非同期IOおよびEpollモデルであることです。Tornadoを使用すると、数万の同時接続をサポートでき、同時実行性の高いアプリケーションに対して優れたパフォーマンスを発揮します。この記事はトルネードの紹介を拡張するものではなく、興味のある友人は公式ドキュメントを参照できます。Tornadoを使用してFlaskアプリケーションを実行するのは非常に簡単です。次の実行プログラムを記述して実行するだけです。
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from myapp import create_app
import config
app = create_app('config')
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
その後http://example1.com:5000
、アプリケーションにアクセスできます。
Gunicornを使用してFlaskアプリケーションを実行する
Gunicornは、RubyのUnicornから移植されたPython WSGI Webアプリケーションサーバーです。これは、「プリフォークワーカー」モデルに基づいています。つまり、多数のプロセスが事前に開かれ、受信したリクエストを待機して処理します。個々のプロセスは同時に独自のリクエストを処理でき、プロセスの起動と破棄のオーバーヘッドを回避できます。ただし、GunicornはブロッキングIOに基づいており、その同時実行パフォーマンスはトルネードと比較できません。詳しくは公式サイトをご覧ください。さらに、uWSGIのようなGunicornは、一般的にNginxなどのWebサーバーで使用されます。
最初にアプリケーションをリモートサーバーにインストールしてから、Gunicornでアプリケーションを起動します。次のコマンドを使用します。
$ gunicorn run:app
説明すると、アプリケーションはファクトリメソッドを使用しているため、「run.py」ファイルにはアプリケーションオブジェクトのみが作成されますapp
。gunicornコマンドの引数はアプリケーションオブジェクトでなければならないため、「run:app」です。これで、を使用http://example1.com:8000
してアプリケーションにアクセスできます。デフォルトのリスニングポートは「8000」です。
4つのワークプロセスを事前に開始し、ローカルの「5000」ポートを監視する場合は、startコマンドを次のように変更できます。
$ gunicorn -w 4 -b 127.0.0.1:5000 run:app
この記事のサンプルコードは、こちらからダウンロードできます。